You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jetpack Compose中仅使用前置摄像头拍照?

在Jetpack Compose中使用CameraX打开前置摄像头

要切换到前置摄像头,核心是在CameraX中指定LensFacing.FRONT的摄像头选择器,以下是具体实现步骤和代码示例:

1. 确认依赖配置

确保你的build.gradle(Module级别)中添加了CameraX的必要依赖:

dependencies {
    // CameraX核心库
    implementation "androidx.camera:camera-core:1.3.0"
    implementation "androidx.camera:camera-camera2:1.3.0"
    // CameraX Compose扩展
    implementation "androidx.camera:camera-compose:1.3.0"
    // CameraX预览用例
    implementation "androidx.camera:camera-preview:1.3.0"
    // CameraX拍照用例
    implementation "androidx.camera:camera-lifecycle:1.3.0"
}

2. 实现前置摄像头预览与拍照

步骤1:处理相机权限

在使用相机前,必须先申请android.permission.CAMERA权限,你可以用rememberPermissionState处理权限请求:

val context = LocalContext.current
val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA)

LaunchedEffect(Unit) {
    if (!cameraPermissionState.hasPermission) {
        cameraPermissionState.launchPermissionRequest()
    }
}

步骤2:初始化CameraX并绑定前置摄像头

通过CameraSelector.DEFAULT_FRONT_CAMERA指定前置摄像头,然后绑定预览和拍照用例:

if (cameraPermissionState.hasPermission) {
    val cameraProviderFuture = remember { ProcessCameraProvider.getInstance(context) }

    AndroidView(
        factory = { ctx ->
            val previewView = PreviewView(ctx)
            val executor = ContextCompat.getMainExecutor(ctx)

            cameraProviderFuture.addListener({
                val cameraProvider = cameraProviderFuture.get()

                // 创建预览用例
                val preview = Preview.Builder().build().also {
                    it.setSurfaceProvider(previewView.surfaceProvider)
                }

                // 创建拍照用例
                val imageCapture = ImageCapture.Builder().build()

                // 指定前置摄像头选择器
                val cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
                // 若设备有多个前置摄像头,可自定义筛选:
                // val cameraSelector = CameraSelector.Builder()
                //     .requireLensFacing(LensFacing.FRONT)
                //     .build()

                try {
                    // 先解绑所有已绑定用例,避免冲突
                    cameraProvider.unbindAll()
                    // 绑定前置摄像头与用例
                    cameraProvider.bindToLifecycle(
                        (context as ComponentActivity),
                        cameraSelector,
                        preview,
                        imageCapture
                    )
                } catch (exc: Exception) {
                    Log.e("CameraX", "用例绑定失败", exc)
                }
            }, executor)

            previewView
        },
        modifier = Modifier.fillMaxSize()
    )
} else {
    // 权限未授予时的提示UI
    Text(text = "请授予相机权限以使用前置摄像头")
}

关键说明

  • CameraSelector.DEFAULT_FRONT_CAMERA是CameraX提供的默认前置摄像头选择器,可直接使用快速切换
  • 绑定用例前必须调用cameraProvider.unbindAll(),避免重复绑定引发异常
  • 若设备存在多个前置摄像头,可通过CameraSelector.Builder添加额外筛选条件指定具体设备

内容的提问来源于stack exchange,提问作者CHETAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:45:39