1. 程式人生 > >Android自定義Camera,用SurfaceView預覽。

Android自定義Camera,用SurfaceView預覽。

  • 佈局檔案不用說了,就它了SurfaceView。其他花裡古哨的佈局,自己想著加吧!
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <SurfaceView
        android:id="@+id/surfaceview"
        android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
  • surfaceView的findViewById()的事就不說了,直接開始預覽的程式碼
/**
     * 開始預覽
     */
    private void startPreview() {
        holder = surfaceView.getHolder();
        holder.addCallback(new SurfaceHolder.Callback() {
            @Override
public void surfaceCreated(SurfaceHolder surfaceHolder) { mCamera = getCustomCamera(); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { if (mCamera != null) { Camera.Parameters parameters = mCamera.getParameters(); // 選擇合適的圖片尺寸,必須是手機支援的尺寸
List<Camera.Size> sizeList = parameters.getSupportedPictureSizes(); // 如果sizeList只有一個我們也沒有必要做什麼了,因為就他一個別無選擇 if (sizeList.size() > 1) { for (int j = 0; j < sizeList.size(); j++) { Camera.Size size = sizeList.get(j); previewWidth = size.width; previewHeight = size.height; } } //設定照片的大小 parameters.setPictureSize(previewWidth , previewHeight ); mCamera.setParameters(parameters); try { mCamera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } //呼叫相機預覽功能 mCamera.startPreview(); } } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { if (null != mCamera) { //停止預覽 mCamera.stopPreview(); //釋放相機資源 mCamera.release(); mCamera = null; } } }); } /** * 獲取開啟相機 * * @return */ private Camera getCustomCamera() { if (null == mCamera) { //Camera.open()方法說明:2.3以後支援多攝像頭,所以開啟前可以通過getNumberOfCameras先獲取攝像頭數目, // 再通過 getCameraInfo得到需要開啟的攝像頭id,然後傳入Open函式開啟攝像頭, // 假如攝像頭開啟成功則返回一個Camera物件 try { mCamera = Camera.open(); //預覽畫面預設是橫屏的,需要旋轉90度 mCamera.setDisplayOrientation(90); } catch (Exception e) { } } return mCamera; }
  • 預覽已經OK了。簡單至極吧。
  • 下面是一個camera拍照的方法:
mCamera.takePicture(null, null, new Camera.PictureCallback() {
                @Override
                public void onPictureTaken(byte[] data, Camera camera) {
                    if (mCamera != null) {
                    //在拍照完成時,重新開始預覽
                        mCamera.startPreview();
                        //轉換成bitmap 
                        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                    }
                }
            });
  • OK拍照也可以了,再來就是單獨控制閃光燈的開啟和關閉了
if (mCamera != null) {
            try {
                //開啟閃光燈
                Camera.Parameters parameter = mCamera.getParameters();
                parameter.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                mCamera.setParameters(parameter);
            } catch (Exception e) {
            }
        }



if (mCamera != null) {
            try {
                //關閉閃光燈
                Camera.Parameters parameter = mCamera.getParameters();
                parameter.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                mCamera.setParameters(parameter);
            } catch (Exception e) {
            }
        }

最後在Activity銷燬時,記得要釋放相機資源

@Override
    public void onStop() {
        super.onStop();
        if (null != mCamera) {
            //停止預覽
            mCamera.stopPreview();
            //釋放相機資源
            mCamera.release();
            mCamera = null;
        }
    }

OK,自定義camera就完成了。後面會出一篇camera2的使用方法。相比camera,camera2還是比較好使的。