尝试使用 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))
尝试以下
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