日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android多媒体学习三:实现自己的Camera

發(fā)布時間:2023/12/15 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android多媒体学习三:实现自己的Camera 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Android自帶的Camera應用雖然可以滿足大多數(shù)情景,但是其靈活性上還有不足。但是Android允許我們定制自己的Camera。

在Android的hardware包中有一個Camera類。這個類就是獲取Camera服務的,可以定制Camera等。

可以通過open()方法獲取其實例。

在使用這個類是需要在AndroidManifest.xml文件中加入相應的權限和特性

?

如:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
等。

?

本文實例:

?

  • package?demo.camera; ?
  • import?java.io.OutputStream; ?
  • import?java.util.Iterator; ?
  • import?java.util.List; ?
  • import?android.app.Activity; ?
  • import?android.content.ContentValues; ?
  • import?android.content.res.Configuration; ?
  • import?android.hardware.Camera; ?
  • import?android.net.Uri; ?
  • import?android.os.Bundle; ?
  • import?android.provider.MediaStore; ?
  • import?android.view.SurfaceHolder; ?
  • import?android.view.SurfaceView; ?
  • import?android.view.View; ?
  • import?android.widget.LinearLayout; ?
  • /** ?
  • ?*?Android自帶的Camera應用程序可以完成很多功能。但是當其不能滿足我們需要的時候 ?
  • ?*?我們可以定制自己的Camera。Android提供了Camera類來輔助我們實現(xiàn)自己的Camera。 ?
  • ?*?這個例子就來定義一個自己的Camera ?
  • ?*?首先,在Manifest中需要引入權限<uses-permission?android:name="android:permission.CAMERA"/> ?
  • ?*?我們需要用來存放取景器的容器,這個容器就是SurfaceView。 ?
  • ?*?使用SurfaceView的同時,我們還需要使用到SurfaceHolder,SurfaceHolder相當于一個監(jiān)聽器,可以監(jiān)聽 ?
  • ?*?Surface上的變化,通過其內(nèi)部類CallBack來實現(xiàn)。 ?
  • ?*?為了可以獲取圖片,我們需要使用Camera的takePicture方法同時我們需要實現(xiàn)Camera.PictureCallBack類,實現(xiàn)onPictureTaken方法 ?
  • ?*?@author?Administrator ?
  • ?* ?
  • ?*/?
  • public?class?MyCamera?extends?Activity?implements?SurfaceHolder.Callback,Camera.PictureCallback{ ?
  • ???? ?
  • ????public?static?final?int?MAX_WIDTH?=?200; ?
  • ????public?static?final?int?MAX_HEIGHT?=?200; ?
  • ???? ?
  • ????private?SurfaceView?surfaceView; ?
  • ???? ?
  • ????private?Camera?camera;?//這個是hardare的Camera對象 ?
  • ???? ?
  • ????public?void?onCreate(Bundle?savedInstanceState){ ?
  • ????????super.onCreate(savedInstanceState); ?
  • ????????this.setContentView(R.layout.camera); ?
  • ????????surfaceView?=?(SurfaceView)this.findViewById(R.id.myCameraView); ?
  • ????????surfaceView.setFocusable(true);? ?
  • ????????surfaceView.setFocusableInTouchMode(true); ?
  • ????????surfaceView.setClickable(true); ?
  • ????????surfaceView.setOnClickListener(new?View.OnClickListener()?{ ?
  • ???????????? ?
  • ????????????@Override?
  • ????????????public?void?onClick(View?v)?{ ?
  • ???????????????? ?
  • ????????????????camera.takePicture(null,?null,?null,?MyCamera.this); ?
  • ???????????????? ?
  • ????????????} ?
  • ????????}); ?
  • ????????//SurfaceView中的getHolder方法可以獲取到一個SurfaceHolder實例 ?
  • ????????SurfaceHolder?holder?=?surfaceView.getHolder(); ?
  • ????????//為了實現(xiàn)照片預覽功能,需要將SurfaceHolder的類型設置為PUSH ?
  • ????????//這樣,畫圖緩存就由Camera類來管理,畫圖緩存是獨立于Surface的 ?
  • ????????holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); ?
  • ????????holder.addCallback(this); ?
  • ????} ?
  • ????@Override?
  • ????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?w,?int?h)?{ ?
  • ????} ?
  • ????@Override?
  • ????public?void?surfaceCreated(SurfaceHolder?holder)?{ ?
  • ????????//?當Surface被創(chuàng)建的時候,該方法被調(diào)用,可以在這里實例化Camera對象 ?
  • ????????//同時可以對Camera進行定制 ?
  • ????????camera?=?Camera.open();?//獲取Camera實例 ?
  • ???? ?
  • ???????? ?
  • ????????/** ?
  • ?????????*?Camera對象中含有一個內(nèi)部類Camera.Parameters.該類可以對Camera的特性進行定制 ?
  • ?????????*?在Parameters中設置完成后,需要調(diào)用Camera.setParameters()方法,相應的設置才會生效 ?
  • ?????????*?由于不同的設備,Camera的特性是不同的,所以在設置時,需要首先判斷設備對應的特性,再加以設置 ?
  • ?????????*?比如在調(diào)用setEffects之前最好先調(diào)用getSupportedColorEffects。如果設備不支持顏色特性,那么該方法將 ?
  • ?????????*?返回一個null ?
  • ?????????*/?
  • ????????try?{ ?
  • ???????????? ?
  • ????????????Camera.Parameters?param?=?camera.getParameters(); ?
  • ????????????if(this.getResources().getConfiguration().orientation?!=?Configuration.ORIENTATION_LANDSCAPE){ ?
  • ????????????????//如果是豎屏 ?
  • ????????????????param.set("orientation",?"portrait"); ?
  • ????????????????//在2.2以上可以使用 ?
  • ????????????????//camera.setDisplayOrientation(90); ?
  • ????????????}else{ ?
  • ????????????????param.set("orientation",?"landscape"); ?
  • ????????????????//在2.2以上可以使用 ?
  • ????????????????//camera.setDisplayOrientation(0);?????????????? ?
  • ????????????} ?
  • ????????????//首先獲取系統(tǒng)設備支持的所有顏色特效,有復合我們的,則設置;否則不設置 ?
  • ????????????List<String>?colorEffects?=?param.getSupportedColorEffects(); ?
  • ????????????Iterator<String>?colorItor?=?colorEffects.iterator(); ?
  • ????????????while(colorItor.hasNext()){ ?
  • ????????????????String?currColor?=?colorItor.next(); ?
  • ????????????????if(currColor.equals(Camera.Parameters.EFFECT_SOLARIZE)){ ?
  • ????????????????????param.setColorEffect(Camera.Parameters.EFFECT_SOLARIZE); ?
  • ????????????????????break; ?
  • ????????????????} ?
  • ????????????} ?
  • ????????????//設置完成需要再次調(diào)用setParameter方法才能生效 ?
  • ????????????camera.setParameters(param); ?
  • ???????????? ?
  • ????????????camera.setPreviewDisplay(holder); ?
  • ???????????? ?
  • ????????????/** ?
  • ?????????????*?在顯示了預覽后,我們有時候希望限制預覽的Size ?
  • ?????????????*?我們并不是自己指定一個SIze而是指定一個Size,然后 ?
  • ?????????????*?獲取系統(tǒng)支持的SIZE,然后選擇一個比指定SIZE小且最接近所指定SIZE的一個 ?
  • ?????????????*?Camera.Size對象就是該SIZE。 ?
  • ?????????????*? ?
  • ?????????????*/?
  • ????????????int?bestWidth?=?0; ?
  • ????????????int?bestHeight?=?0; ?
  • ???????????? ?
  • ????????????List<Camera.Size>?sizeList?=?param.getSupportedPreviewSizes(); ?
  • ????????????//如果sizeList只有一個我們也沒有必要做什么了,因為就他一個別無選擇 ?
  • ????????????if(sizeList.size()?>?1){ ?
  • ????????????????Iterator<Camera.Size>?itor?=?sizeList.iterator(); ?
  • ????????????????while(itor.hasNext()){ ?
  • ????????????????????Camera.Size?cur?=?itor.next(); ?
  • ????????????????????if(cur.width?>?bestWidth?&&?cur.height>bestHeight?&&?cur.width?<MAX_WIDTH?&&?cur.height?<?MAX_HEIGHT){ ?
  • ????????????????????????bestWidth?=?cur.width; ?
  • ????????????????????????bestHeight?=?cur.height; ?
  • ????????????????????} ?
  • ????????????????} ?
  • ????????????????if(bestWidth?!=?0?&&?bestHeight?!=?0){ ?
  • ????????????????????param.setPreviewSize(bestWidth,?bestHeight); ?
  • ????????????????????//這里改變了SIze后,我們還要告訴SurfaceView,否則,Surface將不會改變大小,進入Camera的圖像將質(zhì)量很差 ?
  • ????????????????????surfaceView.setLayoutParams(new?LinearLayout.LayoutParams(bestWidth,?bestHeight)); ?
  • ????????????????} ?
  • ????????????} ?
  • ????????????camera.setParameters(param); ?
  • ????????}?catch?(Exception?e)?{ ?
  • ????????????//?如果出現(xiàn)異常,則釋放Camera對象 ?
  • ????????????camera.release(); ?
  • ????????} ?
  • ???????? ?
  • ????????//啟動預覽功能 ?
  • ????????camera.startPreview(); ?
  • ???????? ?
  • ????} ?
  • ????@Override?
  • ????public?void?surfaceDestroyed(SurfaceHolder?holder)?{ ?
  • ????????//?當Surface被銷毀的時候,該方法被調(diào)用 ?
  • ????????//在這里需要釋放Camera資源 ?
  • ????????camera.stopPreview(); ?
  • ????????camera.release(); ?
  • ???????? ?
  • ????} ?
  • ????@Override?
  • ????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{ ?
  • ????????//?data是一個原始的JPEG圖像數(shù)據(jù), ?
  • ????????//在這里我們可以存儲圖片,很顯然可以采用MediaStore ?
  • ????????//注意保存圖片后,再次調(diào)用startPreview()回到預覽 ?
  • ????????Uri?p_w_picpathUri?=?this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,?new?ContentValues()); ?
  • ????????try?{ ?
  • ????????????OutputStream?os?=?this.getContentResolver().openOutputStream(p_w_picpathUri); ?
  • ????????????os.write(data); ?
  • ????????????os.flush(); ?
  • ????????????os.close(); ?
  • ????????}?catch?(Exception?e)?{ ?
  • ????????????//?TODO:?handle?exception ?
  • ????????????e.printStackTrace(); ?
  • ????????} ?
  • ???????? ?
  • ????????camera.startPreview(); ?
  • ????} ?
  • ???? ?
  • ???? ?
  • ???? ?
  • } ?
  • ?

    轉(zhuǎn)載于:https://blog.51cto.com/whatandroid/987100

    總結

    以上是生活随笔為你收集整理的Android多媒体学习三:实现自己的Camera的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。