android - 与 FileProvider 共享文件时权限被拒绝

标签 android android-intent android-permissions android-fileprovider

我正在尝试与 FileProvider 共享文件。我检查了文件是否与 Gmail、Google Drive 等应用程序正确共享。即使抛出以下异常:

2019-08-28 11:43:03.169 12573-12595/com.example.name E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.example.name.provider/external_files/Android/data/com.example.name/files/allergy_report.pdf from pid=6005, uid=1000 requires the provider be exported, or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:729)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:602)
        at android.content.ContentProvider$Transport.query(ContentProvider.java:231)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:104)
        at android.os.Binder.execTransactInternal(Binder.java:1021)
        at android.os.Binder.execTransact(Binder.java:994)

提供商:

<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/file_provider_paths" />
</provider>

file_provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="." />
</paths>

分享 Intent

Intent intentShareFile = new Intent(Intent.ACTION_SEND);
File fileWithinMyDir = new File(targetPdf);

if (fileWithinMyDir.exists()) {
    intentShareFile.setType("application/pdf");
    Uri uri = FileProvider.getUriForFile(getActivity(), BuildConfig.APPLICATION_ID + ".provider", fileWithinMyDir);
    intentShareFile.putExtra(Intent.EXTRA_STREAM, uri);
    intentShareFile.putExtra(Intent.EXTRA_SUBJECT, "Sharing File...");
    intentShareFile.putExtra(Intent.EXTRA_TEXT, "Sharing File...");
    intentShareFile.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(Intent.createChooser(intentShareFile, "Share File"));
}

希望您能指出我的错误,为什么当应用程序似乎已正确授予权限并且共享工作正常时会抛出此异常。

编辑:

我发现问题出在一行:

startActivity(Intent.createChooser(intentShareFile, "Share File"));

当我简单地将其更改为

startActivity(intentShareFile);

但是,它为挑选应用程序显示的布局略有不同。但我仍然无法弄清楚为什么原始选择器不起作用。

最佳答案

抱歉回复晚了。我是这样解决的:

Intent chooser = Intent.createChooser(intentShareFile, "Share File");

List<ResolveInfo> resInfoList = this.getPackageManager().queryIntentActivities(chooser, PackageManager.MATCH_DEFAULT_ONLY);

for (ResolveInfo resolveInfo : resInfoList) {
    String packageName = resolveInfo.activityInfo.packageName;
    this.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}

startActivity(chooser);

这对我有帮助:Permission Denial with File Provider through intent

关于android - 与 FileProvider 共享文件时权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57689792/

相关文章:

android - 如何检测是否有任何 native 应用程序在 android 中启动

android - 当具有 "singleTask"launchMode 的 Activity 进入前台时 - Android

android - Android-并获得权限WRITE_SETTINGS ?!

Android - 修正 onTouchEvent() 中状态栏的高度

Android如何计算最佳缩放级别?

使用 Service 或 IntentService 的 Android Client/Server Socket 通信

android - 将额外的 Intent 传递给 android 广播接收器

android - 图片 URL 从一个 Activity 传递到另一个 Activity ,但未分配给变量

android - Easypermissions 不返回方法

java - 在存储中保存文本的权限android不工作