CameraManager:
是用来检测、特征化、连接CameraDevice的一个系统服务;
/frameworks/base/core/java/android/hardware/camera2/CameraManager.java
CameraManager的获取方法:
和其他熟知的系统服务一样,CameraManager在frameworks/base/core/java/android/app/SystemServiceRegistry.java被注册:
registerService(Context.CAMERA_SERVICE, CameraManager.class,
new CachedServiceFetcher<CameraManager>() {
@Override
public CameraManager createService(ContextImpl ctx) {
return new CameraManager(ctx);
}});
应用层可以通过以下方法获取到CameraManager对象:
CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
内部类:
- CameraManager.AvailabilityCallback
- 一个用来表示相机变为available或unavailable的回调
- CameraManager.TorchCallback
- 一个用来表示相机手电筒模式变为unavailable, disabled, 或 enabled的回调
公共方法:
- CameraCharacteristics getCameraCharacteristics(@NonNull String cameraId)
- String[] getCameraIdList()
- void openCamera(@NonNull String cameraId,@NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)
- void registerAvailabilityCallback(AvailabilityCallback callback, Handler handler)
- void registerTorchCallback(@NonNull TorchCallback callback, @Nullable Handler handler)
- void setTorchMode(@NonNull String cameraId, boolean enabled)
- void unregisterAvailabilityCallback(@NonNull AvailabilityCallback callback)
- void unregisterTorchCallback(@NonNull TorchCallback callback)
公共方法解读:
- getCameraCharacteristics
查询摄像头设备的功能。 对于给定的相机,这些功能是不可变的。
从API级别29开始,此功能还可用于查询物理摄像机的功能,这些物理摄像机只能用作逻辑多摄像机的一部分。 无法通过openCamera(String,CameraDevice.StateCallback,Handler)直接打开这些摄像头
- getCameraIdList
按标识符返回当前连接的摄像机设备列表,包括其他摄像机API客户端可能正在使用的摄像机。
不可移动摄像机使用从0开始的整数作为其标识符,而可移动摄像机具有每个单独设备的唯一标识符,即使它们是相同的型号。
此列表不包含只能用作逻辑多摄像头设备一部分的物理摄像头。
- openCamera
通过给定的ID打开一个相机连接。
使用getCameraIdList()获取可用摄像头设备列表。 请注意,即使列出了id,如果设备在对getCameraIdList()和openCamera(String,CameraDevice.StateCallback,Handler)的调用之间断开连接,或者优先级较高的相机API客户端开始使用相机设备,则打开可能会失败。
从API级别23开始,由于设备正被较低优先级的后台摄像头API客户端使用而调用了AvailabilityCallback#onCameraUnavailable(String)回调的设备仍然可以通过在调用摄像头时调用此方法来打开 API客户端的优先级高于使用此设备的当前相机API客户端。 通常,如果顶级前台活动在您的应用程序进程中运行,则在访问摄像机时您的进程将被赋予最高优先级,即使相机设备正由另一个摄像机API客户端使用,此方法也会成功。 以这种方式失去对摄像机的控制的任何低优先级应用程序将接收CameraDevice.StateCallback.onDisconnected(CameraDevice)回调。
成功打开摄像机后,CameraDevice.StateCallback#onOpened回调会被调用,通过此方法传入新打开的CameraDevice。 然后可以通过调用CameraDevice #creinCaptureSession和CameraDevice #createCaptureRequest来设置摄像机设备的操作。
如果在此函数调用返回后初始化期间摄像机断开连接,则CameraDevice.StateCallback#onDisconnected将被调用,并通过此方法传入处于断开连接状态的CameraDevice(并且将跳过CameraDevice.StateCallback#onOpened)。
如果打开相机设备失败,则将调用设备回调的CameraDevice.StateCallback#onError方法,并且相机设备上的后续调用将抛出CameraAccessException。
需要Manifest.permission.CAMERA。
- registerAvailabilityCallback
注册一个回调以获得有关相机设备可用性的通知。
再次注册相同的回调将使用提供的新处理程序替换处理程序。
第一次注册回调时,会立即调用所有当前已知相机设备的可用性状态。
每当相机API客户端打开相机设备时,都会调用AvailabilityCallback#onCameraUnavailable(String)。 从API级别23开始,其他相机API客户端仍然可以打开这样的相机设备,如果它们具有比相机设备的现有客户端更高的优先级,则驱逐现有客户端。 有关详细信息,请参阅open()。
由于此回调将在相机服务中注册,因此请务必在不再需要时取消注册; 否则回调将继续无限期地接收事件,并可能阻止其他资源被释放。 具体来说,回调将独立于一般Activity生命周期和各个CameraManager实例的状态进行调用。
- registerTorchCallback
注册一个回调以获得有关手电筒模式状态的通知。
再次注册相同的回调将使用提供的新处理程序替换处理程序。
第一次注册回调时,会立即被调用并返回所有当前已知的拥有闪光灯器件的相机设备的手电筒模式状态。
由于此回调将在相机服务中注册,因此请务必在不再需要时取消注册; 否则回调将继续无限期地接收事件,并可能阻止其他资源被释放。 具体来说,回调将独立于一般Activity生命周期和各个CameraManager实例的状态进行调用。
- setTorchMode
无需打开相机设备即可设置给定ID的相机的闪光灯器件的手电筒模式。
使用getCameraIdList()获取可用摄像头设备列表,并使用getCameraCharacteristics(String)检查摄像头设备是否具有闪光灯组件。 请注意,即使相机设备具有闪光灯组件,如果正在使用打开手电筒模式所需的相机设备或其他相机资源,则开启手电筒模式可能会失败。
如果调用setTorchMode(String,boolean)成功打开或关闭手电筒模式,将调用CameraManager.TorchCallback#onTorchModeChanged。 但是,即使打开手电筒模式成功,应用程序也不拥有闪光灯器件或相机设备的专有权。 当闪光灯所属的摄像机设备不可用或其他摄像机资源使手电筒打开时,手电筒模式将关闭并变为不可用(将调用CameraManager.TorchCallback#onTorchModeUnavailable)。 此外,其他应用程序可以自由调用setTorchMode(String,boolean)来关闭手电筒模式(将调用CameraManager.TorchCallback#onTorchModeChanged)。 如果打开手电筒模式的最新应用程序退出,则将关闭割炬模式。
- unregisterAvailabilityCallback
删除以前添加的回调; 回调将不再接收连接和断开连接回调。
删除未注册的回调无效。
- unregisterTorchCallback
删除以前添加的回调; 回调将不再接收手电筒模式状态回调。
删除未注册的回调无效。