调用 ActivityResultContracts.TakePicture() 返回 false,因此图像未按预期保存

Jam*_*ack 5 android android-camera kotlin android-jetpack

我试图从相机中保存图像,但它一直返回错误。我以为图像没有被显示,但是当我查看文件系统时,我有很多文件,但它们的长度都为零。

这里只是设置了一些。

val pictureResult = remember { mutableStateOf<Boolean?>(null)}
val context = LocalContext.current
val cameraLauncher = rememberLauncherForActivityResult(ActivityResultContracts.TakePicture()) {
    pictureResult.value = it
    // $it is false
}
Run Code Online (Sandbox Code Playgroud)

这将创建屏幕截图中的文件。

fun createImageFile(extension:String): File {
    // Create an image file name
    val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    val storageDir: File? = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    val imagePath: File = File(context.filesDir, directoryFromExtension(extension))
    return File(imagePath, "justme${timeStamp}${extension}"
    ).apply {
        myNewsCreatorViewModel.currentPhotoPath = absolutePath
    }
}
Run Code Online (Sandbox Code Playgroud)

单击该按钮后,我会从上一个方法返回的文件开始执行这些步骤。

                val uri = FileProvider.getUriForFile(context, "com.mine.fileprovider", file)
                cameraLauncher.launch(uri)
Run Code Online (Sandbox Code Playgroud)

这是我设置 后的结果,想法是然后显示图像,或者如果文件未保存为 false,pictureResult.value我当前会显示一条短信。imageSaved

        pictureResult.value?.let { imageSaved ->
            run {
                // imageSaved is false
            }
        }
Run Code Online (Sandbox Code Playgroud)

我不知道我做错了什么,也不知道如何获取更多信息来了解为什么无法正确保存图像。

显示长度为零的文件的文件系统屏幕截图

Jam*_*ack 0

看来解决方案是添加:

val storageDir: File? = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), directoryFromExtension(extension))
if(storageDir?.exists() == false && ".jpg" == extension) {
    storageDir.mkdirs()
}
Run Code Online (Sandbox Code Playgroud)

我不确定它是否有帮助,但如果我也将其放在调用意图之前,它就会起作用。

context.grantUriPermission("com.mine.android", uri,
    Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
Run Code Online (Sandbox Code Playgroud)