CameraX 会提供一个 API,用于访问手机制造商已为特定手机实现的效果(焦外成像、HDR 及其他功能)。为了支持供应商扩展,设备必须满足以下所有条件:
- 相应效果拥有来自设备 OEM 的库支持。
- 当前设备上已安装了 OEM 库。
- OEM 库报告设备支持扩展。
- 设备搭载了库所要求的操作系统版本。
您可以根据以下优先原则启用扩展:如果扩展受设备支持且实际存在于设备上,则启用该扩展,否则扩展将以适当方式降级。
供应商不需要实现所有效果和功能。供应商未实现的任何功能将默认为 CameraX 实现。默认实现会报告相应功能不可用并跳过启用操作。
扩展架构
下图显示了 CameraX 的扩展架构。

扩展与 CameraX 的 Camera2 核心是分开的。在图中,红色箭头表示用户触发基于扩展的功能(例如 HDR 图片拍摄)时产生的主要数据流。
启用图片拍摄效果
如需将供应商扩展应用于 CameraX 用例,请创建一个 Extender
对象,该对象允许您使用相应效果或功能的设置配置 Builder
。查询扩展的可用性,因为如果扩展不可用,enableExtension()
调用将不执行任何操作。
如需实现图片拍摄用例的扩展,请实现相应的图片拍摄扩展器,如以下代码示例所示:
Kotlin
import androidx.camera.extensions.BokehExtender fun onCreate() { // Create a Builder same as in normal workflow. val builder = ImageCapture.Builder() // Create a camera provider val cameraProvider : ProcessCameraProvider = ... // Get the provider instance // Create an Extender object which can be used to apply extension // configurations. val bokehImageCapture = BokehImageCaptureExtender.create(builder) // Select the camera val cameraSelector = CameraSelector.Builder() .requireLensFacing(CameraX.LensFacing.BACK) .build() // Query if extension is available (optional). if (bokehImageCapture.isExtensionAvailable()) { // Enable the extension if available. bokehImageCapture.enableExtension() } // Finish constructing configuration with the same flow as when not using // extensions. val useCase = ImageCapture.Builder().build() cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCase) }
Java
import androidx.camera.extensions.BokehExtender; void onCreate() { // Create a Builder same as in normal workflow. ImageCapture.Builder builder = new ImageCapture.Builder(); // Create a camera provider ProcessCameraProvider cameraProvider = ...; // Get the provider instance // Create an Extender object which can be used to apply extension // configurations. BokehImageCaptureExtender bokehImageCapture = new BokehImageCaptureExtender(builder); // Select the camera CameraSelector cameraSelector = new CameraSelector.Builder(). .requireLensFacing(CameraX.LensFacing.BACK) .build(); // Query if extension is available (optional). if (bokehImageCapture.isExtensionAvailable()) { // Enable the extension if available. bokehImageCapture.enableExtension(); } // Finish constructing configuration with the same flow as when not using // extensions. ImageCapture useCase = new ImageCapture.Builder.build(); cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCase); }
停用效果
如需停用供应商扩展,请创建 ImageCapture 或 Preview 用例的新实例。
其他资源
要详细了解 CameraX,请参阅下面列出的其他资源。
Codelab
代码示例