我正在尝试使用其他阅读器应用程序(如Google云端硬盘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);
开发工具包版本:
minSdkVersion 16
targetSdkVersion 27
我正在尝试按照Android开发人员网站和其他论坛帖子中解释的使用内容提供程序的过程进行操作,但无法理解这里有什么问题!
FLAG_GRANT_*_URI_PERMISSION
标志需要在传递到createChooser()
的Intent
上设置;在这种情况下,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);
此外,请确保对chooser
Intent
上的FLAG_ACTIVITY_NEW_TASK
使用addFlags()
,因为在createChooser()
方法中构造时,授予权限标志也将添加到其中。
chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);