Camera2之CameraManager类

邢法
2023-12-01

转载出处: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() {
    @Override
    public void onOpened(CameraDevice camera) {
        //当camera成功打开之后会回调该方法。此时camera已经就绪,可以开始对相机进行一系列的操作,
        //可通过调用CameraCaptureSession.createCaptureSession方法来设置第一个capture session
    }
    @Override
    public void onDisconnected(CameraDevice camera) {
        //当camera不再可用,或调用CameraManager.openCamera()打开相机失败时都会
        //调用此方法.此时任何尝试调用CameraDevice方法的操作都会失败并抛出一个
        //CameraAccessException异常。
        //安全策略或权限的改变、可移动相机设备的物理断开、或者当该camera需要更高优
        //先级的camera API Client时都会导致该camera设备连接断开
    }
    @Override
    public void onError(CameraDevice camera, int error) {
        //顾名思义。当camera出错时会回调该方法
        //应在该方法调用CameraDevice.close()和做一些其他释放相机资源的操作,防止相机出错而导致一系列问题。
    }
    @Override
    public 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的相机设备的闪光灯功能。
 类似资料: