安卓Camera2筆記

由於最近同學一直在做這個人臉識別方面的集成,正好一起研究一下。查了些資料,整合一下。

寫了幾小時,撤回ctrl+z一下,結果恢復了挺早的版本了,更致命的是頁面下面彈窗已保存爲草稿,2小時寫的東西都沒了,那麼從簡。

Camera2是用來替代Camera類的

API Level21及以上可以用是,也就是安卓5.0版本及以上。

Platform Version API Level VERSION_CODE
Android 5.0 21 LOLLIPOP

camera2並不是所有手機都完整支持的。需要硬件層面的支持,硬件支持等級低,camera2的一些高級功能無法使用。不細說,

簡介

預覽界面

Camera2使用流程爲:

1.檢查相機權限

檢查獲取權限(之前特地寫了一下)

2.獲取相機服務

//創建CameraManager實例
CameraManager cameraManager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);

3.獲取相機硬件ID集合

String camerId = cameraManager.getCameraIdList()[0];
//返回相機列表

獲取ID後可通過該ID得知該設備的可用設置和輸出參數。這些信息是通過CameraCharateristics對象提供的 ,可通過getCameraCharacteristics(String)

CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(camerId);

 根據攝像頭的ID去查該攝像頭的參數,設置最大輸出尺寸等。

CameraCharacteristics 詳解

4.開啓相機

cameraManager.openCamera(camerId, stateCallback, null);

5.CameraDevice.StateCallback回調中獲取cameraDevice(上面的stateCallback)

private CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback(){
    @Override
    public void onOpened(@NonNull CameraDevice camera) {
        cameraDevice = camera;
        //獲取攝像頭
        startPreview();
        //開啓預覽
        }

    @Override
    public void onDisconnected(@NonNull CameraDevice camera) {


    }

    @Override
    public void onError(@NonNull CameraDevice camera, int error) {

    }
};

6.瀏覽函數(這段清掉了不想重寫了,直接整合壓在一起)

創建捕捉會話,surface輸出捕獲的圖像數據

cameraDevice.createCaptureSession(surfaces,new CameraCaptureSession.StateCallback(),null)

創建捕獲會話,surfaces作爲捕獲的圖像數據的輸出的目標,surfaces必須預先設置好參數(根據攝像頭的參數)。

surfaces可以是SurfaceViewSurfaceTexture,再通過 Surface(SurfaceTexture), MediaCodecMediaRecorder, Allocation,和ImageReader(圖片、視頻等處理個人理解可能不對)。

CameraCaptureSession.StateCallback回調中獲取到CameraCaptureSession

CaptureRequest.Builder 創建請求,通過鍵值對的方式設置參數

cameraCaptureSession.setRepeatingRequest(previewRequest,
captureCallback, null); 發送請求

//設置默認緩衝區的尺寸和相機所支持的最大尺寸
        texture.setDefaultBufferSize(previewSize.getWidth(), preview.getHeight());
        //開啓預覽所需要的輸出Surface
        Surface surface = new Surface(texture);
        try {
            //創建預覽請求
            requestbuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            requestbuilder.addTarget(surface);
            //創建預覽會話
            cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
                @Override
                public void onConfigured(@NonNull CameraCaptureSession session) {
                    //獲取預覽會話
                    captureSession = session;
                    //配置預覽界面使用3A模式(自動曝光、自動對焦、自動白平衡)
                    requestbuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
                    //創建用於預覽界面的線程
                    previewThread = new HandlerThread("preview");
                    previewThread.start();
                    previewhandler = new Handler(previewThread.getLooper());
                    try {
                        //設置重複捕獲圖像
                        captureSession.setRepeatingRequest(requestbuilder.build(), null, previewhandler);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }
//略
        }catch (CameraAccessException e){
            e.printStackTrace();
        }

    }

再xml文件中放一個textureview。

拍照ImageReader

imageReader = ImageReader.newInstance(1920,1080,ImageFormat.JPEG,2);
//構造一個ImageReader的實例,設置寬高,輸出格式,緩存最大數量
//請確定給的參數不爲空,不然直接給參數


imageReader.setOnImageAvailableListener(onImageAvailableListener,previewhandler);

private ImageReader.OnImageAvailableListener onImageAvailableListener = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
            Image image = reader.acquireLatestImage();
//略
            image.close();
            
    }
};


//
requestbuilder.addTarget(imageReader.getSurface());

cameraDevice.createCaptureSession(Arrays.asList(previewSurface,imageReader.getSurface()), new CameraCaptureSession.StateCallback() {//略
},, previewhandler);

流程

官網(翻)

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章