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

Jetpack Compose相机预览与拍摄输出不一致问题求助

问题:Jetpack Compose相机预览与拍摄输出不一致的解决需求

我开发了一款基于Jetpack Compose的相机视图应用,期望拍摄输出的图片与Android预览视图完全一致。当前预览画面和拍摄输出图片存在差异,我需要解决该问题——因为后续将在预览中心添加框体,并利用其在预览中的位置对输出图片进行裁剪。

以下是我的CameraView Composable代码:

@Composable
fun CameraView(
    isOpenFrontCamera: Boolean,
    outputDirectory: File,
    executor: Executor,
    onImageCaptured: (Uri) -> Unit,
    onError: (ImageCaptureException) -> Unit,
    onCloseCameraClick: () -> Unit
) {
    val lensFacing: Int =
        if (isOpenFrontCamera) CameraSelector.LENS_FACING_FRONT else CameraSelector.LENS_FACING_BACK
    val context = LocalContext.current
    val lifecycleOwner = LocalLifecycleOwner.current

    val preview = Preview.Builder().build()
    val previewView = remember { PreviewView(context) }

    val imageCapture: ImageCapture = remember {
        ImageCapture.Builder().setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY).build()
    }

    val cameraSelector = CameraSelector.Builder()
        .requireLensFacing(lensFacing)
        .build()

    LaunchedEffect(lensFacing) {
        val cameraProvider = context.getCameraProvider()
        cameraProvider.unbindAll()
        cameraProvider.bindToLifecycle(
            lifecycleOwner,
            cameraSelector,
            preview,
            imageCapture
        )

        preview.setSurfaceProvider(previewView.surfaceProvider)
    }

    //Screen
    Box(
        contentAlignment = Alignment.BottomCenter,
        modifier = Modifier
            .fillMaxSize()) {
        AndroidView({ previewView }, modifier = Modifier.fillMaxSize())

        IconButton(
            modifier = Modifier.padding(bottom = 20.dp),
            onClick = {
                Log.d("takePhoto", "ON CLICK")
                takePhoto(
                    imageCapture = imageCapture,
                    outputDirectory = outputDirectory,
                    executor = executor,
                    onImageCaptured = { imageUri ->
                            onImageCaptured(imageUri)
                    },
                    onError = onError
                )
            },
            content = {
                Icon(
                    painter = painterResource(id = R.drawable.ic_baseline_camera_24),
                    contentDescription = stringResource(R.string.take_picture),
                    tint = Color.White,
                    modifier = Modifier
                        .fillMaxSize(0.2f)
                )
            }
        )
    }
}

应用预览截图:
应用预览图

拍摄输出截图:
拍摄输出图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:57:29