CameraManager
一个 用于检测、表征和连接到 CameraDevices的系统服务管理器.
通过getCameraIdList选择要打开的摄像头,通过getCameraCharacteristics得到固定不变的相机能力,然后调用openCamera打开摄像头,在CameraDevice.StateCallback#onOpened得到相机实例CameraDevice,然后调用CameraDevice#createCaptureSession和 CameraDevice#createCaptureRequest设置预览捕获等
查询摄像头设备的能力
public CameraCharacteristics getCameraCharacteristics (String cameraId)
查询摄像头设备的能力。对于给定的相机,这些功能是不可变的。
从 API 级别 29 开始,该函数还可用于查询只能作为逻辑多摄像头的一部分使用的物理摄像头的能力。这些摄像头不能直接通过openCamera(String, CameraDevice.StateCallback, Handler)打开。
同样从 API 级别 29 开始,虽然即使没有 CAMERA 权限,大多数基本的相机信息仍然可用,但某些值对不持有该权限的应用程序不可用。不可用的键由CameraCharacteristics#getKeysNeedingPermission列出。
查询摄像头设备的摄像头扩展能力
public CameraExtensionCharacteristics getCameraExtensionCharacteristics (String cameraId)
查询摄像头设备的摄像头扩展能力。
获取相机 ID 列表
public String[] getCameraIdList ()
按标识符返回当前连接的相机设备列表,包括其他相机 API 客户端可能正在使用的相机。
不可移动相机使用从 0 开始的整数作为标识符,而可移动相机对每个单独的设备都有唯一的标识符,即使它们是相同的型号。
此列表不包含只能用作逻辑多摄像头设备一部分的物理摄像头。
获取ConcurrentCameraIds
public Set<Set<String>> getConcurrentCameraIds ()
返回当前连接的相机设备标识符的组合集合,支持同时配置相机设备会话。
这些组合中的设备可以由同一个客户端摄像头应用程序同时配置。但是,不保证支持由两个不同的应用程序同时使用这些相机设备。
对于并发操作,按时间顺序:应用程序必须首先使用 CameraDevice#close关闭任何已配置会话的打开的摄像头. 在任何相机设备上配置会话之前,必须使用openCamera(String, CameraDevice.StateCallback, Handler) 打开所有要同时操作的相机设备。
组合中的每个设备都保证可以通过查询getCameraCharacteristics(CameraCharacteristics.SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS)获得支持的流组合.
对于并发操作,如果相机设备具有由CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE指定的非空缩放比例范围 ,则其完整的缩放比例范围可能不适用。应用程序在并发操作期间可以使用 CaptureRequest.CONTROL_ZOOM_RATIO>=1 和 <= CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM
这组组合可以包括其他相机 API 客户端正在使用的相机设备。
当前不支持并发摄像头扩展会话CameraExtensionSession。
这组组合不包含只能用作逻辑多摄像头设备一部分的物理摄像头。
如果新的摄像机 ID 通过 AvailabilityCallback#onCameraUnavailable(String)变得可用,客户端可以调用此方法来检查是否可以同时流式传输的摄像机 ID 的新组合可用。
isConcurrentSessionConfigurationSupported
public boolean isConcurrentSessionConfigurationSupported (Map<String, SessionConfiguration> cameraIdAndSessionConfig)
检查提供的一组相机设备及其对应的SessionConfiguration是否可以同时配置。
此方法对给定SessionConfiguration和相机 id 组合的执行运行时检查。结果确认是否可以使用传递的会话配置在给定的使用CameraDevice#createCaptureSession(SessionConfiguration)相机设备上成功地同时创建相机捕获会话。
可以在活动捕获会话之前、期间和之后的任何时间调用该方法。它不会以任何方式影响正常的相机行为,并且必须比创建常规或受限制的捕获会话快得多。
尽管此方法比创建新的捕获会话快,但它并不打算用于探索支持的并发流组合的整个空间。可用的强制并发流组合可以通过查询 getCameraCharacteristics(CameraCharacteristics.SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS)key获得。
请注意,会话参数将被忽略,并且不需要调用SessionConfiguration#setSessionParameters。
需要 Manifest.permission.CAMERA
打开与具有给定 ID 的相机的连接
public void openCamera (String cameraId, CameraDevice.StateCallback callback, Handler handler)
打开与具有给定 ID 的相机的连接。
使用getCameraIdList()以获取可用的相机设备的列表。请注意,即使列出了 id,如果设备在调用getCameraIdList()和openCamera(String, CameraDevice.StateCallback, Handler)之间断开连接,或者更高优先级的相机 API 客户端开始使用相机设备,则 open 可能会失败。\
从 API 级别 23 开始,由于设备正由较低优先级使用而调用了 AvailabilityCallback#onCameraUnavailable(String)回调的设备,当调用的摄影机API客户端的优先级高于使用此设备的当前摄影机API客户端时,仍有可能通过调用此方法打开后台摄影机API客户端。一般来说,如果最顶层的前台活动正在您的应用程序进程中运行,则您的进程在访问相机时将获得最高优先级,即使相机设备正在被另一个相机 API 客户端使用,此方法也会成功。任何以这种方式失去对相机的控制的低优先级应用程序都将收到 CameraDevice.StateCallback.onDisconnected(CameraDevice)回调。在同一个应用程序中两次打开同一个相机 ID 同样会导致 CameraDevice.StateCallback.onDisconnected(CameraDevice)回调被触发CameraDevice 从第一个打开的会话开始,所有正在进行的任务都被删除了。
成功打开相机后,将使用新打开的CameraDevice调用CameraDevice.StateCallback#onOpened。然后,可以通过调用CameraDevice#createCaptureSession和 CameraDevice#createCaptureRequest来设置相机设备的操作
在 API 级别 30 之前,当应用程序尝试打开多个CameraDevice不同 ID 且设备不支持打开此类组合时, openCamera(String, CameraDevice.StateCallback, Handler)将失败并抛出一个CameraAccessException或一个或多个已打开的CameraDevice将断开连接并接收 CameraDevice.StateCallback.onDisconnected(CameraDevice)回调。将发生哪种行为取决于设备实现,并且可能因不同的设备而异。从 API 级别 30 开始,如果设备不支持打开的摄像头组合,则保证openCamera(String, CameraDevice.StateCallback, Handler)调用将失败并且不会CameraDevice断开现有的任何一个 。
如果在此函数调用返回后相机在初始化期间断开连接,则 CameraDevice.StateCallback#onDisconnected与处于断开状态的 CameraDevice处于断开连接状态(并且 CameraDevice.StateCallback#onOpened将被跳过)。
如果打开相机设备失败,则设备回调的 onError方法将被调用,相机设备上的后续调用将抛出一个CameraAccessException.
需要 Manifest.permission.CAMERA
打开与具有给定 ID 的相机的连接。
public void openCamera (String cameraId, Executor executor, CameraDevice.StateCallback callback)
打开与具有给定 ID 的相机的连接。
此方法的行为与 openCamera(java.lang.String, StateCallback, android.os.Handler)的行为相匹配,不同之处在于它 Executor用作参数而不是 Handler。
需要 Manifest.permission.CAMERA
注册可用性回调
public void registerAvailabilityCallback (Executor executor,
CameraManager.AvailabilityCallback callback)
注册回调以接收有关相机设备可用性的通知。
此方法的行为与registerAvailabilityCallback(android.hardware.camera2.CameraManager.AvailabilityCallback, android.os.Handler)的行为相匹配 ,不同之处在于它Executor用作参数而不是Handler。
注册可用性回调
public void registerAvailabilityCallback (CameraManager.AvailabilityCallback callback,
Handler handler)
注册回调以接收有关相机设备可用性的通知。
再次注册相同的回调将用提供的新处理程序替换处理程序。
第一次注册回调时,会立即使用所有当前已知相机设备的可用性状态调用它。
每当任何相机 API 客户端打开相机设备时都会调用AvailabilityCallback#onCameraUnavailable(String)。从 API 级别 23 开始,其他相机 API 客户端可能仍然能够打开这样的相机设备,如果现有客户端的优先级高于相机设备的现有客户端,则驱逐现有客户端。
由于这个回调会注册到相机服务中,所以一旦不再需要记得取消注册;否则回调将无限期地继续接收事件,并可能阻止其他资源被释放。具体来说,回调将独立于一般活动生命周期和各个 CameraManager 实例的状态被调用。\
registerTorchCallback
public void registerTorchCallback (Executor executor, CameraManager.TorchCallback callback)
注册一个回调以接收有关火炬模式状态的通知。
此方法的行为与 registerTorchCallback(android.hardware.camera2.CameraManager.TorchCallback, android.os.Handler)的行为相匹配,不同之处在于它Executor用作参数而不是Handler。
注册火炬回调
public void registerTorchCallback (CameraManager.TorchCallback callback, Handler handler)
注册一个回调以接收有关火炬模式状态的通知。
再次注册相同的回调将用提供的新处理程序替换处理程序。
第一次注册回调时,会立即使用所有当前已知的带有闪光灯的相机设备的手电筒模式状态调用它。
由于这个回调会注册到相机服务中,所以一旦不再需要记得取消注册;否则回调将无限期地继续接收事件,并可能阻止其他资源被释放。具体来说,回调将独立于一般活动生命周期和各个 CameraManager 实例的状态被调用。
设置火炬模式
public void setTorchMode (String cameraId, boolean enabled)
在不打开相机设备的情况下,设置给定 ID 相机的闪光灯组件的手电筒模式。
使用getCameraIdList()以获取可用的相机设备列表, 使用getCameraCharacteristics(String)检查相机设备是否具有闪光单元。请注意,即使相机设备具有闪光灯单元,如果正在使用打开手电筒模式所需的相机设备或其他相机资源,打开手电筒模式也可能会失败。
如果调用setTorchMode(String, boolean)成功打开或关闭手电筒模式, CameraManager.TorchCallback#onTorchModeChanged将被调用。但是,即使开启手电筒模式成功,应用程序也不拥有闪光灯或相机设备的专有所有权。当闪光灯单元所属的相机设备不可用或其他用于保持手电筒开启的相机资源不可用(CameraManager.TorchCallback#onTorchModeUnavailable将被调用)时,手电筒模式将关闭并变为不可用 。此外,其他应用程序可以自由调用setTorchMode(String, boolean)关闭火炬模式( CameraManager.TorchCallback#onTorchModeChanged将被调用)。如果最近打开手电筒模式的应用程序退出,手电筒模式将被关闭。
取消注册可用性回调
public void unregisterAvailabilityCallback (CameraManager.AvailabilityCallback callback)
删除之前添加的回调;回调将不再接收连接和断开连接回调。
删除未注册的回调无效。
取消注册TorchCallback
public void unregisterTorchCallback (CameraManager.TorchCallback callback)
删除之前添加的回调;回调将不再接收火炬模式状态回调。
删除未注册的回调无效。
CameraManager.AvailabilityCallback
相机设备可用或无法打开的回调。
当不再使用相机或连接了新的可移动相机时,相机变得可用。当某些应用程序或服务开始使用摄像头,或者可移动摄像头断开连接时,它们将变得不可用。
扩展此回调并传递子类的实例, CameraManager#registerAvailabilityCallback以接收此类可用性更改的通知。
onCameraAccessPrioritiesChanged
public void onCameraAccessPrioritiesChanged ()
每当相机访问优先级发生变化时调用。
通知摄像头访问优先级已更改并且摄像头现在可以打开。先前由于较高优先级用户已经在使用相机而被拒绝相机访问,或由于较高优先级用户尝试打开相机而与活动相机会话断开连接的应用程序应尝试再次打开相机,如果它仍然想使用它。请注意,多个应用程序可能会同时收到此回调,实际上只有其中一个应用程序会成功打开相机,具体取决于确切的访问优先级和时间。如果多个应用程序可能同时处于恢复状态,并且用户在它们之间切换焦点,或者当前使用相机的应用程序在全屏和画中画 (PiP) 之间移动,则此方法很有用状态。在这种情况下,
相机上可用
public void onCameraAvailable (String cameraId)
新的相机已经可以使用了。
相机不可用
public void onCameraUnavailable (String cameraId)
以前可用的相机已无法使用。
如果应用程序具有用于现在断开连接的相机的活动 CameraDevice 实例,则该应用程序将收到一个 disconnection error.
在物理相机上可用
public void onPhysicalCameraAvailable (String cameraId, String physicalCameraId)
物理相机又可以使用了。
默认情况下,逻辑多摄像头的所有物理摄像头都可用,因此onPhysicalCameraAvailable(String, String)在调用逻辑多摄像头时onCameraAvailable(String),不会调用逻辑多摄像头的任何物理摄像头。但是,如果某些特定的物理相机一开始不可用,onPhysicalCameraUnavailable(String, String)则可以在 之后调用 onCameraAvailable(String)。
onPhysicalCameraUnavailable
public void onPhysicalCameraUnavailable (String cameraId, String physicalCameraId)
以前可用的物理相机已无法使用。
默认情况下,逻辑多摄像头的所有物理摄像头都可用,因此onPhysicalCameraAvailable(String, String)在调用逻辑多摄像头时onCameraAvailable(String),不会调用逻辑多摄像头的任何物理摄像头。如果某些特定的物理相机开始不可用,onPhysicalCameraUnavailable(String, String)则可以在 之后调用 onCameraAvailable(String)。
CameraManager.TorchCallback
相机闪光灯手电筒模式变得不可用、禁用或启用的回调。\
当它所属的相机设备变得不可用或它需要的其他相机资源由于其他更高优先级的相机活动而变得忙碌时,手电筒模式将变得不可用。当手电筒模式被关闭或者它所属的相机设备不再使用并且它需要的其他相机资源不再忙碌时,它就会被禁用。当应用程序调用CameraManager.setTorchMode(String, boolean)关闭相机的手电筒模式时,或者如果不支持同时保持多个手电筒模式,当应用程序打开另一个相机的手电筒模式时,相机的手电筒模式将关闭。手电筒模式在通过 开启时启用CameraManager.setTorchMode(String, boolean)。
手电筒模式CameraManager.setTorchMode(String, boolean)只有在禁用或启用状态时才能通过设置。
扩展此回调并传递子类的实例, CameraManager#registerTorchCallback以接收此类状态更改的通知。\
onTorchModeChanged
public void onTorchModeChanged (String cameraId, boolean enabled)
相机的手电筒模式已启用或禁用,可以通过CameraManager.setTorchMode(String, boolean)进行更改 。
onTorchMode 不可用
public void onTorchModeUnavailable (String cameraId)
无法通过CameraManager.setTorchMode(String, boolean)设置相机的手电筒模式。
如果之前通过调用打开火炬模式CameraManager.setTorchMode(String, boolean),它将在CameraManager.TorchCallback#onTorchModeUnavailable调用之前关闭。CameraManager.setTorchMode(String, boolean)将失败,直到手电筒模式再次进入禁用或启用状态。