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

如何使用camera-viewfinder-compose库在Jetpack Compose中获取相机预览?

在Jetpack Compose中使用androidx.camera:camera-viewfinder-compose:1.0.0-alpha02实现相机预览

1. 添加依赖

在Module级别的build.gradle文件中引入CameraX相关依赖:

dependencies {
    // Viewfinder Compose组件
    implementation "androidx.camera:camera-viewfinder-compose:1.0.0-alpha02"
    // CameraX核心依赖
    implementation "androidx.camera:camera-core:1.3.0"
    implementation "androidx.camera:camera-camera2:1.3.0"
    implementation "androidx.camera:camera-lifecycle:1.3.0"
}

2. 配置相机权限

在AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<!-- 如需录像功能,添加录音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />

3. 完整实现流程

3.1 权限检查与请求

在Compose中先处理相机权限授权逻辑:

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

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

3.2 初始化CameraX并获取预览所需参数

通过ProcessCameraProvider绑定相机生命周期,生成SurfaceRequest和ViewfinderTransformationInfo:

val lifecycleOwner = LocalLifecycleOwner.current
val cameraProviderFuture = remember { ProcessCameraProvider.getInstance(context) }

var surfaceRequest by remember { mutableStateOf<SurfaceRequest?>(null) }
var transformationInfo by remember { mutableStateOf<ViewfinderTransformationInfo?>(null) }

LaunchedEffect(cameraPermissionState.hasPermission) {
    if (cameraPermissionState.hasPermission) {
        val cameraProvider = cameraProviderFuture.get()
        val preview = Preview.Builder().build()
        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

        try {
            // 解绑原有相机绑定
            cameraProvider.unbindAll()
            val camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview)

            // 监听Surface请求
            preview.setSurfaceProvider { request ->
                surfaceRequest = request as SurfaceRequest
                // 提供Surface完成预览请求
                request.provideSurface(request.surface, context.mainExecutor) {
                    // 处理Surface释放逻辑
                }
            }

            // 获取画面变换信息,适配屏幕旋转与相机传感器方向
            transformationInfo = ViewfinderTransformationInfo(
                cameraInfo = camera.cameraInfo,
                displayRotation = context.display?.rotation ?: 0
            )
        } catch (e: Exception) {
            // 处理相机绑定失败异常
            e.printStackTrace()
        }
    }
}

3.3 渲染Viewfinder组件

将获取到的参数传入Viewfinder,实现相机预览:

if (surfaceRequest != null && transformationInfo != null) {
    Viewfinder(
        surfaceRequest = surfaceRequest!!,
        // 可选PERFORMANCE(优先硬件加速)或COMPATIBILITY(适配旧设备)
        implementationMode = ViewfinderImplementationMode.PERFORMANCE,
        transformationInfo = transformationInfo!!
    )
} else {
    // 相机未准备或权限未授权时的占位UI
    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
        Text(text = "相机准备中或未授权")
    }
}

关键参数说明

  • surfaceRequest: 由CameraX的Preview组件提供,是相机预览画面的Surface请求载体,负责将相机输出渲染到Viewfinder。
  • implementationMode: 控制预览的渲染模式,PERFORMANCE优先使用硬件加速,性能更优;COMPATIBILITY适配更多旧设备,性能稍低。
  • transformationInfo: 包含相机传感器信息与屏幕旋转数据,用于自动调整预览画面的缩放、旋转角度,保证画面无畸变、方向正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:28:24