我正在使用Jetpack Compose,当我调用该方法用照相机拍照时,ActivityResultContracts.TakePicture
的结果总是false。
样本代码:
@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun SomeScreen() {
val photoUri by remember { mutableStateOf(value = Uri.EMPTY) }
val cameraLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.TakePicture(),
onResult = { success ->
if (success) {
println("success")
println("photo uri: $photoUri")
} else println("result failed")
}
)
val cameraPermissionState = rememberPermissionState(
permission = Manifest.permission.CAMERA,
onPermissionResult = { granted ->
if (granted) cameraLauncher.launch(photoUri)
else print("camera permission is denied")
}
)
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Button(onClick = cameraPermissionState::launchPermissionRequest) {
Text(text = "Take a photo with Camera")
}
}
}
我使用了accompanist-permissions
库来简化操作,打开相机应用和拍照的部分显然工作正常,但来自cameraLauncher
的结果总是错误的...
有人能指导我解决这个问题吗?
1条答案
按热度按时间axr492tv1#
您的代码问题在于,您向
launch
传递了一个empty Uri
,而相机应用无法将图像保存在该Uri
中。如果您打开TakePicture
类或将鼠标光标放在该类上,您将看到以下信息:拍摄图片并将其保存到提供的content-Uri的ActivityResultContract。如果图像已保存到给定的Uri,则返回true。
换句话说,
TakePicture
类不会自动为您创建File
,您必须自己创建File
并提供Uri
。我将假设一个简单的场景,你想为应用程序中的一些临时任务拍照。为了实现这个目标,你需要了解代码中缺少的一些步骤:
1.由于您需要创建
File
并将其暴露给Camera应用,因此需要使用File Provider创建规则并在Manifest
文件中声明。1.创建
File
并通过FileProvider
公开其Uri
的函数。让我们从
file_paths.xml
(在 res/xml 中)开始:我在这里使用
cache-path
是为了临时保存文件。在
Manifest
文件中:用于创建
File
并返回Uri
的扩展:在此示例中该高速缓存文件夹与
cacheDir
一起使用。如果在此处更改为filesDir
,请确保在cache-path
中将file_paths.xml
上的缓存文件夹更改为files-path
。现在在
Composable Screen
中,你可以有这样的代码: