这几天我一直在尝试让 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)
}
)
}
}
第一张截图,之后我按下相机按钮,应用程序导航到不同的可组合屏幕。
这是应该渲染相机的可组合项。 你可以看到右上角有一个绿点,表示相机正在运行。
在我使用手势返回后,相机显示一帧,因为应用程序正在过渡到上一个屏幕