Убедитесь, что вы поместили свой файловый провайдер в манифест, а также внутри application
тега
<application
...>
....
<provider
android:authorities = "your_string"
android:name = "androidx.core.content.FileProvider"
android:exported = "false"
android:grantUriPermissions = "true">
<meta-data
android:resource = "@xml/file_path"
android:name = "android.support.FILE_PROVIDER_PATHS" />
</provider>
</application>
И мой file_path.xml
такой
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name = "my_images"
path = "Android/data/com.your.package/files/Pictures" />
</paths>
И из Javaкод
val authorities = "your_string"
val imageUri = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)
FileProvider.getUriForFile(context!!, authorities, imageFile)
else
Uri.fromFile(imageFile)
callCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri)
startActivityForResult(
callCameraIntent,
CAMERA_REQUEST_CODE
)
Обновление
ваши полномочия провайдера файлов в манифесте и ваши права доступа в вашем коде должны совпадать.Ваша проблема в том, что ваш authorities
отличается в манифесте и коде Java
`android:authorities = "${applicationId}.fileprovider"`
в вашем коде Java замените этот
photoUri = FileProvider.getUriForFile(a, a.applicationContext.packageName + ".provider", tempFile)
на этот
photoUri = FileProvider.getUriForFile(a, a.applicationContext.packageName + ".fileprovider", tempFile)
Второе обновление
В этой функции вы переходите в каталог, который не должен иметь место:
private fun createImageFile(): File {
val timeStamp = SimpleDateFormat(
"yyyyMMdd_HHmmss",
Locale.getDefault()
).format(Date())
val imageFileName = "IMG_" + timeStamp + "_"
val image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
null /* directory */
)
return image
}
Попробуйте это
private fun createImageFile(): File {
val timeStamp = SimpleDateFormat(
"yyyyMMdd_HHmmss",
Locale.getDefault()
).format(Date())
val imageFileName = "IMG_" + timeStamp + "_"
val image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) //null /* directory */
)
return image
}