我的目标是通过相机应用程序拍摄照片并将其保存到目录中。就像本教程解释的一样:https://developer.android.com/training/camera/photobasics
但是,在某些设备上,onActivityResult返回-1作为返回码。问题很可能是相机应用无法将照片文件写入我提供的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>
在活动中,有意启动相机应用程序
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
返回-1
作为返回代码时,您实际上很幸运:-1
只是Activity.RESULT_OK。实际上,出于[[ACTION_IMAGE_CAPTURE的意图,您无需关心返回代码是什么;足以检查您在storageDir中打开的临时文件是否不为空(在您的应用程序中创建了一个空文件,并且图像由Camera应用程序存储在其中)。
<external-files-path name="my_images" path="Pictures" />
,以减少对getExternalFilesDir()的实现细节的依赖。如果您的活动只有一个呼叫startActivityForResult()
,则甚至无需检查
requestCode
。最后,在您的情况下,requestData
可能为null。仅当您的[[ACTION_IMAGE_CAPTURE意向未指定MediaStore.EXTRA_OUTPUT
时,此参数才相关。幸运的是,您不需要requestData意向可以传递给您的信息。