1

我正在尝试使用其他阅读器应用程序(如 Google Drive PDF 查看器等)从我的应用程序中打开 PDF 或文本文件。但它显示以下错误。

java.lang.SecurityException: Permission Denial: opening provider com.my.app.provider.GenericFileProvider from ProcessRecord{87fdcbb 31761:com.google.android.apps.docs/u0a37} (pid=31761, uid=10037) that is not exported from uid 10081

清单文件:

<provider
        android:name="com.my.app.provider.GenericFileProvider"
        android:authorities="${applicationId}.my.package.name.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

provider_paths 文件:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

代码:

Intent intent = new Intent(Intent.ACTION_VIEW);
String mimeType = myMime.getMimeTypeFromExtension(ChatAdapterHelper.Document.getDocumentExtension(message.content));

String authority = AppContext.getAccess().getContext().getPackageName() + ".my.package.name.provider";

Uri fileUri = GenericFileProvider.getUriForFile(AppContext.getAccess().getContext(), authority, file);
Log.d("fileUri", "openDocument: fileUri " + fileUri);

intent.setDataAndType(fileUri, mimeType);
Intent chooser = Intent.createChooser(intent, context.getString(R.string.open_file_with));

chooser.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
chooser.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
chooser.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

AppContext.getAccess().getContext().startActivity(chooser);

SDK版本:

minSdkVersion 16
targetSdkVersion 27

我正在尝试按照 Android 开发者网站和其他论坛帖子中解释的使用内容提供程序的过程,但这里不知道有什么问题!

4

1 回答 1

0

FLAG_GRANT_*_URI_PERMISSION需要在Intent传入的标志上设置标志createChooser();在这种情况下,intent

另外,请注意这setFlags()将取代之前对它的任何调用。也就是说,最后一次调用的标志将完全替换任何以前的调用。您可以在一次调用中组合多个标志|,或addFlags()单独使用该方法。例如:

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

或者:

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

另外,请确保使用addFlags()on FLAG_ACTIVITY_NEW_TASKchooser Intent因为在createChooser()方法中构造它时,授予权限标志也将添加到其中。

chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
于 2018-06-23T10:48:59.327 回答