Google 致力于为黑人社区推动种族平等。查看具体举措

供应商扩展

CameraX 会提供一个 API,用于访问手机制造商已为特定手机实现的效果(焦外成像、HDR 及其他功能)。为了支持供应商扩展,设备必须满足以下所有条件:

  • 相应效果拥有来自设备 OEM 的库支持。
  • 当前设备上已安装了 OEM 库。
  • OEM 库报告设备支持扩展。
  • 设备搭载了库所要求的操作系统版本。

您可以根据以下优先原则启用扩展:如果扩展受设备支持且实际存在于设备上,则启用该扩展,否则扩展将以适当方式降级。

供应商不需要实现所有效果和功能。供应商未实现的任何功能将默认为 CameraX 实现。默认实现会报告相应功能不可用并跳过启用操作。

扩展架构

下图显示了 CameraX 的扩展架构。

图 1CameraX 扩展架构

扩展与 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

  • CameraX 使用入门
  • 代码示例

  • 官方 CameraX 示例应用