[英]Kotlin Permission Denied when using crop intent
当我在使用意图“com.android.camera.action.CROP”时将不同的文件指定为 output 数据时。 我收到权限错误。
错误->
2022-01-25 14:26:40.552 11666-11678/com.volant.social.alpha E/DatabaseUtils: Writing exception to parcel
java.lang.SecurityException: Permission Denial: writing androidx.core.content.FileProvider uri content://com.volant.social.alpha.provider/social/Pictures/social_16431099969072139377949.jpg from pid=5157, uid=10049 requires the provider be exported, or grantUriPermission()
at android.content.ContentProvider.enforceWritePermissionInner(ContentProvider.java:682)
at android.content.ContentProvider$Transport.enforceWritePermission(ContentProvider.java:497)
at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:469)
at android.content.ContentProvider$Transport.openAssetFile(ContentProvider.java:384)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:262)
at android.os.Binder.execTransact(Binder.java:565)
我的代码->
try {
val cropIntent = Intent("com.android.camera.action.CROP")
cropIntent.setDataAndType(picUri, "image/*")
cropIntent.putExtra("crop", true)
cropIntent.putExtra("aspectX", 1)
cropIntent.putExtra("aspectY", 1)
cropIntent.putExtra("outputX", 512)
cropIntent.putExtra("outputY", 512)
cropIntent.putExtra("return-data", true)
cropIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
cropIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
cropImageLauncher.launch(cropIntent)
}
catch (e: ActivityNotFoundException) {
val toast = Toast.makeText(binding.root.context, "_crop_error_message".toLocalized(), Toast.LENGTH_SHORT)
toast.show()
}
AndroidManifest ->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
xml->
<paths>
<external-files-path name="social" path="/" />
photoUri -> 这就是我从我创建的文件夹中获取 uri 的方式
val photoURI: Uri? = context?.let {
createImageFile().let { it1 ->
currentImagePath = it1.path
FileProvider.getUriForFile(
it,
requireContext().applicationContext.packageName.toString() + ".provider",
it1
)
}
}
创建文件->这就是我为 output 值创建文件夹的方式
private fun createImageFile(): File {
val timeStamp: String = Calendar.getInstance().time.time.toString()
val storageDir: File? = binding.root.context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
return File.createTempFile(
"social_${timeStamp}", /* prefix */
".jpg", /* suffix */
storageDir /* directory */
).apply {
currentImagePath = absolutePath
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.