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

实现预览

在向应用添加预览时,请使用 PreviewView,这是一种可以剪裁、缩放和旋转以确保正确显示的 View

当相机处于活动状态时,图片预览会流式传输到 PreviewView 中的 Surface。

注意:如果您需要直接访问 SurfaceTexture(例如执行 OpenGL 渲染),请参阅手动创建 SurfaceTexture

使用 PreviewView

如需使用 PreviewView 实现 CameraX 预览,请按以下步骤操作(稍后将对这些步骤进行说明):

  1. 配置 CameraXConfig.Provider
  2. PreviewView 添加到布局。
  3. 请求 CameraProvider
  4. 在创建 View 时,请检查 CameraProvider
  5. 选择相机并绑定生命周期和用例。

使用 PreviewView 存在一些限制。使用 PreviewView 时,您无法执行以下任何操作:

  • 创建 SurfaceTexture,以在 TextureViewPreviewSurfaceProvider 上进行设置。
  • TextureView 检索 SurfaceTexture,并在 PreviewSurfaceProvider 上对其进行设置。
  • SurfaceView 获取 Surface,并在 PreviewSurfaceProvider 上对其进行设置。

如果出现上述任何一种情况,则 Preview 会停止将帧流式传输到 PreviewView

配置 CameraXConfig.Provider

Application 类中实现 CameraXConfig.Provider 接口,如以下示例所示:

Kotlin

    import androidx.camera.camera2.Camera2Config
    import androidx.camera.core.CameraXConfig

    public class MyCameraXApplication : Application(),  CameraXConfig.Provider {
      override fun getCameraXConfig(): CameraXConfig {
        return Camera2Config.defaultConfig()
      }
    }
    

Java

    import androidx.camera.camera2.Camera2Config;
    import androidx.camera.core.CameraXConfig;

    public class MyCameraXApplication extends Application implements CameraXConfig.Provider {
        @NonNull
        @Override
        public CameraXConfig getCameraXConfig() {
            return Camera2Config.defaultConfig();
        }
    }
    

将 PreviewView 添加到布局

以下示例显示了布局中的 PreviewView

    <FrameLayout
        android:id="@+id/container">
            <androidx.camera.view.PreviewView
                android:id="@+id/preview_view" />
    </FrameLayout>
    

请求 CameraProvider

以下代码展示了如何请求 CameraProvider

Kotlin

    import androidx.camera.lifecycle.ProcessCameraProvider
    import com.google.common.util.concurrent.ListenableFuture

    class MainActivity : AppCompatActivity() {
        private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>
        override fun onCreate(savedInstanceState: Bundle?) {
            cameraProviderFuture = ProcessCameraProvider.getInstance(this)
        }
    }
    

Java

    import androidx.camera.lifecycle.ProcessCameraProvider
    import com.google.common.util.concurrent.ListenableFuture

    public class MainActivity extends AppCompatActivity {
        private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            cameraProviderFuture = ProcessCameraProvider.getInstance(this);
        }
    }
    

检查 CameraProvider 可用性

请求 CameraProvider 后,请验证它能否在视图创建后成功初始化。以下代码展示了如何执行此操作:

Kotlin

    cameraProviderFuture.addListener(Runnable {
        val cameraProvider = cameraProviderFuture.get()
        bindPreview(cameraProvider)
    }, ContextCompat.getMainExecutor(this))
    

Java

    cameraProviderFuture.addListener(() -> {
        try {
            ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
            bindPreview(cameraProvider);
        } catch (ExecutionException | InterruptedException e) {
            // No errors need to be handled for this Future.
            // This should never be reached.
        }
    }, ContextCompat.getMainExecutor(this));
    

有关此示例中使用的 bindPreview 函数的示例,请参阅选择相机并绑定生命周期和用例中提供的代码。

选择相机并绑定生命周期和用例

创建并确认 CameraProvider 后,请执行以下操作:

  1. 创建 Preview
  2. 指定所需的相机 LensFacing 选项。
  3. 将所选相机和任意用例绑定到生命周期。
  4. Preview 连接到 PreviewView

以下代码展示了一个示例:

Kotlin

    fun bindPreview(cameraProvider : ProcessCameraProvider) {
        var preview : Preview = Preview.Builder()
                .build()

        var cameraSelector : CameraSelector = CameraSelector.Builder()
              .requireLensFacing(CameraSelector.LENS_FACING_BACK)
              .build()

        var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)

        preview.setSurfaceProvider(previewView.createSurfaceProvider(camera.cameraInfo))
    }
    

Java

    void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
        Preview preview = new Preview.Builder()
                .build();

        CameraSelector cameraSelector = new CameraSelector.Builder()
                .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                .build();

        Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview);

        preview.setSurfaceProvider(previewView.createSurfaceProvider(camera.getCameraInfo()));
    }
    

其他资源

如需详细了解 CameraX,请参阅下面列出的其他资源。

Codelab

  • CameraX 使用入门
  • 代码示例

  • 官方 CameraX 示例应用