繁体   English   中英

Kotlin 使用裁剪意图时权限被拒绝

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM