返回

用 CameraX 几行代码实现摄像头预览和拍照

Android

前言

CameraX 是一个用于 Android 平台的相机 API,它可以帮助您轻松构建相机应用程序。CameraX 提供了一致且易于使用的 API 界面,适用于大多数 Android 设备,并可向后兼容至 Android 5.0。

集成 CameraX

要使用 CameraX,您需要在项目中添加以下依赖项:

implementation 'androidx.camera:camera-core:1.0.0'
implementation 'androidx.camera:camera-camera2:1.0.0'
implementation 'androidx.camera:camera-lifecycle:1.0.0'
implementation 'androidx.camera:camera-view:1.0.0'

初始化 CameraX

在您的活动或片段中,您需要初始化 CameraX。您可以使用以下代码来完成此操作:

val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
    // CameraX is now initialized. You can start using it.
}, ContextCompat.getMainExecutor(this))

创建预览用例

要创建预览用例,您可以使用以下代码:

val previewUseCase = Preview.Builder()
    .build()

创建拍照用例

要创建拍照用例,您可以使用以下代码:

val imageCaptureUseCase = ImageCapture.Builder()
    .build()

绑定用例到生命周期

要将用例绑定到生命周期,您可以使用以下代码:

cameraProvider.bindToLifecycle(
    this,
    previewUseCase,
    imageCaptureUseCase
)

启动预览

要启动预览,您可以使用以下代码:

previewUseCase.setSurfaceProvider(previewView.surfaceProvider)
previewUseCase.enable()

拍照

要拍照,您可以使用以下代码:

imageCaptureUseCase.takePicture(ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageCapturedCallback() {
    override fun onCaptureSuccess(image: ImageProxy) {
        // Image captured successfully.
    }

    override fun onError(exception: ImageCaptureException) {
        // Image capture failed.
    }
})

示例代码

以下是一个完整的示例代码,演示了如何使用 CameraX 来实现摄像头预览和拍照功能:

class MainActivity : AppCompatActivity() {

    private lateinit var cameraProvider: ProcessCameraProvider
    private lateinit var previewUseCase: Preview
    private lateinit var imageCaptureUseCase: ImageCapture

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
        cameraProviderFuture.addListener({
            cameraProvider = cameraProviderFuture.get()

            previewUseCase = Preview.Builder()
                .build()

            imageCaptureUseCase = ImageCapture.Builder()
                .build()

            cameraProvider.bindToLifecycle(
                this,
                previewUseCase,
                imageCaptureUseCase
            )

            previewUseCase.setSurfaceProvider(previewView.surfaceProvider)
            previewUseCase.enable()
        }, ContextCompat.getMainExecutor(this))
    }

    fun takePicture(view: View) {
        imageCaptureUseCase.takePicture(ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageCapturedCallback() {
            override fun onCaptureSuccess(image: ImageProxy) {
                // Image captured successfully.
            }

            override fun onError(exception: ImageCaptureException) {
                // Image capture failed.
            }
        })
    }
}

结论

CameraX 是一个强大的工具,它可以帮助您轻松构建相机应用程序。本文只是介绍了 CameraX 的简单使用,其中包含相机预览、拍照、和简单的图片侦分析。如果您想了解更多关于 CameraX 的信息,可以查阅官方文档或在线搜索相关资料。