通过意图拍照 returns -1 作为结果代码

Take photo via intent returns -1 as result code

我的目标是通过相机应用拍照并将其保存到目录中。就像本教程解释的那样:https://developer.android.com/training/camera/photobasics

但是,在某些设备上,onActivityResult returns -1 作为 return 代码。 问题很可能是相机应用无法将照片文件写入我提供的URI,但我不明白为什么。

这是我的测试结果:

这是我的做法:

在清单中声明提供者(以及适当的权限)

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.mypackage.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>

声明正确的文件路径

    <paths>
        <external-path name="my_images"  path="Android/data/com.mypackage/files/Pictures" />
    </paths>

在 activity 中,启动带有 intent 的相机应用程序

        Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->

            takePictureIntent.resolveActivity(requireContext().packageManager)?.also {

                val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.FRANCE).format(Date())

                requireContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES)?.let { storageDir ->

                    File.createTempFile("JPEG_${timeStamp}_", ".jpg", storageDir).also {

                        fileUri = FileProvider.getUriForFile(requireContext(), "com.mypackage.fileprovider", it)
                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri)
                        startActivityForResult(takePictureIntent, TAKE_PIC_CODE)
                    }
                }
            }
        }
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) 

onActivityResultreturns -1如return码,你其实很幸运:-1不过是Activity.RESULT_OK。实际上,在 ACTION_IMAGE_CAPTURE 意图下,您不关心 return 代码是什么;检查您在 storageDir 中打开的临时文件是否不为空就足够了(在您的应用程序中创建了一个空文件,图像由相机应用程序存储在那里)。

这就是说,我建议使用<external-files-path name="my_images" path="Pictures" />,以减少对getExternalFilesDir()的实现细节的依赖。

如果您的 activity 只有一次调用 startActivityForResult(),您甚至不需要检查 requestCode

最后,在您的场景中,requestData 可能是 null。只有当您的 ACTION_IMAGE_CAPTURE 意图未指定 MediaStore.EXTRA_OUTPUT 时,此参数才相关。幸运的是,您不需要 requestData Intent 可以传递给您的信息。