尝试通过 Intent.EXTRA_STREAM 共享文件时出现权限错误

问题描述 投票:0回答:1

尝试使用 Intent.EXTRA_STREAM 共享文件时出现以下异常:

java.lang.SecurityException:权限拒绝:读取 androidx.core.content.FileProvider uri content://... 需要 提供者被导出,或 grantUriPermission()

我的文件提供程序设置为:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:grantUriPermissions="true"
    android:exported="false">

    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths"/>
</provider>

文件共享工作正常,但是我注意到日志中的异常,我读到这可能是访问剪辑数据的问题。

我确实无法以二进制形式显示该文件,因此我尝试创建自己的剪辑数据来解决该问题:

val shareIntent = Intent.createChooser(Intent().apply {
   action = Intent.ACTION_SEND
   putExtra(Intent.EXTRA_STREAM, uri)
   type = "application/octet-stream"
   clipData = ClipData.newPlainText("Label", "Text")
}, null)

shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

但是,这仍然会导致日志中出现相同的异常。

我还使用 ShareCompat.IntentBuilder() 创建共享意图,并引发了相同的异常。

最后尝试:

val intent = Intent(Intent.ACTION_SEND).apply {
   clipData = ClipData.newPlainText("Label", "Text")
   putExtra(Intent.EXTRA_STREAM, uri)
   type = "application/octet-stream"
   addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}

share(Intent.createChooser(intent, null))
  1. 关于为什么在提供 ClipData 时抛出此异常有什么想法吗?
  2. 我可以提供自己的 ClipData 以在共享屏幕中提供更好的 UI/UX,例如自定义图标或图像吗?
android android-intent
1个回答
0
投票

尝试以下

ShareCompat
片段,我使用它没有任何问题:

ShareCompat.IntentBuilder(context)
    .addStream(fileUri)
    .setType("*/*")
    .startChooser()

使用

Intent.createChooser
方法共享时,如下设置剪辑数据:

shareIntent.clipData = ClipData("description", arrayOf("*/*"), ClipData.Item(fileUri))
val chooser = Intent.createChooser(shareIntent, "Share..")

此外,此方法需要您设置

FLAG_GRANT_READ_URI_PERMISSION

© www.soinside.com 2019 - 2024. All rights reserved.