Camera started but can't see preview, Camera2 androidx compose

问题描述 投票:0回答:0

这几天我一直在尝试让 cameraX2 与 compose 一起工作。

问题是相机似乎启动了。它显示绿色标签表示相机正在拍摄,但预览不起作用。导航回来后,在转换过程中可以清楚地看到相机中的一张图像。

我在下面附上了屏幕截图,以便您了解它是如何工作的。

Camera2版本为1.2.1

private const val cameraVersion="1.2.1"
const val camera="androidx.camera:camera-camera2:$cameraVersion";
const val cameraLifecycle="androidx.camera:camera-lifecycle:$cameraVersion"
const val cameraView="androidx.camera:camera-view:$cameraVersion"

可组合

@Composable
@Destination
fun TakePictureScreen(
    viewModel: TakePictureViewModel = hiltViewModel()
) {


    val lensFacing = CameraSelector.LENS_FACING_FRONT
    val context = LocalContext.current
    val lifecycleOwner = LocalLifecycleOwner.current

    var cameraInit = remember {
        mutableStateOf(false)
    }
    val preview = Preview.Builder().build()
    val previewView = remember { PreviewView(context) }
    val imageCapture: ImageCapture = remember { ImageCapture.Builder().build() }
    val cameraSelector = CameraSelector.Builder()
        .requireLensFacing(lensFacing)
        .build()


    val cameraPermissionResultLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.RequestPermission(),
        onResult = { isGranted ->
            viewModel.onPermissionResult(
                permission = Manifest.permission.CAMERA,
                isGranted = isGranted
            )
        }
    )

    LaunchedEffect(key1 = true) {
        cameraPermissionResultLauncher.launch(Manifest.permission.CAMERA)
    }
    LaunchedEffect(lensFacing) {
        val cameraProvider = context.getCameraProvider()
        cameraProvider.unbindAll()
        cameraProvider.bindToLifecycle(
            lifecycleOwner,
            cameraSelector,
            preview
        )

        preview.setSurfaceProvider(previewView.surfaceProvider)
        delay(2000)
        cameraInit.value=true
    }

    if (cameraInit.value) {
        Icon(
            tint = MaterialTheme.colors.primary,
            modifier = Modifier
                .padding(8.dp)
                .fillMaxWidth()
                .height(IntrinsicSize.Max),
            painter = painterResource(R.drawable.can_location),
            contentDescription = stringResource(id = R.string.take_photo)
        )
        AndroidView(
            factory = { previewView }, modifier = Modifier
                .fillMaxSize(),
            update = {
                preview.setSurfaceProvider(previewView.surfaceProvider)
            }
        )
    }
}

第一张截图,之后我按下相机按钮,应用程序导航到不同的可组合屏幕。

这是应该渲染相机的可组合项。 你可以看到右上角有一个绿点,表示相机正在运行。

在我使用手势返回后,相机显示一帧,因为应用程序正在过渡到上一个屏幕

android android-jetpack-compose androidx android-camera2
© www.soinside.com 2019 - 2024. All rights reserved.