通过意图拍照 returns -1 作为结果代码
Take photo via intent returns -1 as result code
我的目标是通过相机应用拍照并将其保存到目录中。就像本教程解释的那样:https://developer.android.com/training/camera/photobasics
但是,在某些设备上,onActivityResult returns -1 作为 return 代码。
问题很可能是相机应用无法将照片文件写入我提供的URI,但我不明白为什么。
这是我的测试结果:
- 带有 Android 7 的 Moto G:工作正常
- 小米 Mi A1 Android 7.1:失败
- 三星 Galaxy A40 Android 9:失败
这是我的做法:
在清单中声明提供者(以及适当的权限)
<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?)
当onActivityResult
returns -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 可以传递给您的信息。
我的目标是通过相机应用拍照并将其保存到目录中。就像本教程解释的那样:https://developer.android.com/training/camera/photobasics
但是,在某些设备上,onActivityResult returns -1 作为 return 代码。 问题很可能是相机应用无法将照片文件写入我提供的URI,但我不明白为什么。
这是我的测试结果:
- 带有 Android 7 的 Moto G:工作正常
- 小米 Mi A1 Android 7.1:失败
- 三星 Galaxy A40 Android 9:失败
这是我的做法:
在清单中声明提供者(以及适当的权限)
<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?)
当onActivityResult
returns -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 可以传递给您的信息。