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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Camera2之CameraManager类

發布時間:2024/1/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Camera2之CameraManager类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載出處:http://www.jianshu.com/p/1f4021aacf6b
本文出自:m2u的簡書

一、概覽

CameraManager是一個用于檢測、連接和描述相機設備的系統服務,負責管理所有的CameraDevice相機設備。可以通過調用Context.getSystemService(java.lang.String)方法來獲取一個CameraManager的實例:

CameraManager manager=(CameraManager)getSystemService(Context.CAMERA_SERVICE);

二、內部類

  • AvailabilityCallback
    當相機設備可用狀態發生改變時,會回調這個Callback中相應的方法
  • TorchCallback
    閃光燈狀態監聽類,當閃光燈模式發生改變時,會回調這個Callback中相應的方法

三、公共方法

  • CameraCharacteristics getCameraCharacteristics(String cameraId)
    用于查詢id為cameraId的相機設備所支持的功能。該方法會返回一個CameraCharacteristics類的對象,CamraCharacteristic類中封裝了相機設備固有的的所有功能屬性。可以通過該對象,獲取和設置相機的參數,如對焦方式、閃光燈設置等。

  • String[] getCameraIdList()
    用于獲取當前連接的所有相機設備的cameraId集合,包括可能其他camera API client正在使用的相機。注意這里的cameraId,對于不可移動的相機設備(比如手機自帶的前后置相機),這個標識符從0開始,一般來說,后置相機的標識符為“0”,常量值為CameraCharacteristics.LENS_FACING_FRONT,前置相機的標識符為“1”,常量值為CameraCharacteristics.LENS_FACING_BACK。然而,對于外置的相機設備,不管是相同型號或不同型號,它們都會具有一個自己單獨的標識符。

  • void openCamera(String cameraId,CameraDevice.StateCallback callback,Handler handler)
    用于打開一個到具有給定cameraId的攝像機的連接:
    參數:
    1) cameraId:可通過getCameraIdList()方法獲取,不過需要注意的兩種情況:
    1. 盡管某個camera可能包含在getCameraIdList()方法返回的數組中,但在調用getCameraIdList()方法之后到調用openCamera()方法之前的這個時間內,該cameraId的設備連接被斷開了;
    2. 該cameraId的相機設備正在被一個具有更高優先級的camera API client使用:在這兩種情況下仍然可能會導致相機打開失敗。

2) CameraDevice.StateCallback:具體獲取實例的方式和該內部類的各方法說明如下:

private final CameraDevice.StateCallback mStateCallback1 = new CameraDevice.StateCallback() {@Overridepublic void onOpened(CameraDevice camera) {//當camera成功打開之后會回調該方法。此時camera已經就緒,可以開始對相機進行一系列的操作,//可通過調用CameraCaptureSession.createCaptureSession方法來設置第一個capture session}@Overridepublic void onDisconnected(CameraDevice camera) {//當camera不再可用,或調用CameraManager.openCamera()打開相機失敗時都會//調用此方法.此時任何嘗試調用CameraDevice方法的操作都會失敗并拋出一個//CameraAccessException異常。//安全策略或權限的改變、可移動相機設備的物理斷開、或者當該camera需要更高優//先級的camera API Client時都會導致該camera設備連接斷開}@Overridepublic void onError(CameraDevice camera, int error) {//顧名思義。當camera出錯時會回調該方法//應在該方法調用CameraDevice.close()和做一些其他釋放相機資源的操作,防止相機出錯而導致一系列問題。}@Overridepublic void onClosed(CameraDevice camera) {super.onClosed(camera);//當調用CameraDevice.close()關閉相機設備后會回調此方法。camera為別關閉的相機設備。//該方法被回調執行后,任何嘗試調用camera相關的操作都會失敗,并且拋出一個IllegalStateException異常} };

3) handler: 用于指定調用該回調的線程。如果不指定則置null,此時系統會默認使用當前線程的looper。當需要將該回調放到后臺線程處理時,可通過指定該handler的looper來設置:

mBackgroundThread = new HandlerThread("CameraBackground"); mBackgroundThread.start(); mBackgroundHandler = new Handler(mBackgroundThread.getLooper());
  • void registerAvailabilityCallback(CameraManager.AvailabilityCallback
    callback, Handler handler)
    注冊一個AvailabilityCallback回調,用于接收相機設備的可用性狀態變更的通知。handler用于指定執行該回調的線程。當重復調用該方法注冊AvailabilityCallback時,應用會用最后一次調用時傳入的handler代替之前的handler。首次調用該方法注冊回調時,應用會立即遍歷當前所有已知的相機設備并回調AvailabilityCallback中相應的方法以返回各個相機設備的可用狀態:
CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); manager.registerAvailabilityCallback(new CameraManager.AvailabilityCallback() { @Override public void onCameraAvailable(String cameraId) { super.onCameraAvailable(cameraId); Log.e(TAG,cameraId+" is onCameraAvailable"); } @Override public void onCameraUnavailable(String cameraId) { super.onCameraUnavailable(cameraId); Log.e(TAG,cameraId+" is onCameraUnavailable"); } },mBackgroundHandler);

outputs:

0 is onCameraAvailable 1 is onCameraAvailable 0 is onCameraUnavailable

要注意的是,每當相機設備被任何camera API client打開時onCameraUnavailable(String cameraId)方法都會被回調,此時的cameraId應為未被打開的設備id。如上日志輸出的最后行:因為在這個程序中,調用registerAvailabilityCallback注冊了回調之后緊跟著調用openCamera()打開了手機的后置攝像頭(cameraId為0,前置攝像頭id為1)。當注冊了該回調之后,一旦不再需要,應立即調用CameraManager.unregisterAvailabilityCallback(CameraManager.AvailabilityCallback callback)方法來解除回調注冊。否則可能會造成一些嚴重的問題:該回調會一直占用資源而不能被釋放,且會繼續而且是獨立于activity生命周期和單獨的CameraManager實例地無終止地接收相機事件!

  • void registerTorchCallback(CameraManager.TorchCallback
    callback,Handler handler)
    注冊一個TorchCallback回調,用于接收相機的閃光燈狀態。用法和需要注意的地方同registerAvailabilityCallback()方法,在這里不再贅述。
  • void
    unregisterAvailabilityCallback(CameraManager.AvailabilityCallback
    callback)
    用于解除AvailabilityCallback回調注冊。
  • void unregisterTorchCallback(CameraManager.TorchCallback callback)
    用于解除TorchCallback回調注冊。
  • void setTorchMode(String cameraId,boolean enabled)
    用于打開或關閉id為cameraId的相機設備的閃光燈功能。

總結

以上是生活随笔為你收集整理的Camera2之CameraManager类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。