如何使用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
相关产品推荐
相关产品推荐

