Android Content Provider安全异常

时间:2018-06-23 06:21:47

标签: android android-contentprovider android-securityexception

我正在尝试通过其他阅读器应用程序(例如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开发者网站和其他论坛帖子中介绍的使用内容提供程序的过程,但是在这里找不到错误所在!

1 个答案:

答案 0 :(得分:0)

需要在传递到<!DOCTYPE html> <html> <head> <meta charset="utf-8" http-equiv="encoding" /> <title></title> <script> function subst() { var vars = {}; var query = document.location .toString() // get the query string .replace(/^.*?\?/, '') // and remove any existing hash string (thanks, @vrijdenker) .replace(/#.*$/, '') .split('&'); for (var i = 0, l = query.length; i < l; i++) { var aux = decodeURIComponent(query[i]).split('='); vars[aux[0]] = aux[1]; } var x = ['frompage', 'topage', 'page', 'webpage', 'section', 'subsection', 'subsubsection', 'test', 'totalValue']; for (var i in x) { var y = document.getElementsByClassName(x[i]); for (var j = 0; j < y.length; ++j) y[j].textContent = vars[x[i]]; } } </script> </head> <body onload="subst()"> <table class="table table-bordered;" style="font-family:'B Nazanin'" dir="rtl"> <tr> <td style="text-align:right"> جمع کل صورت حساب <span class="totalValue"></span> </td> <td style=" text-align:center"><img style="width:100px;" src="http://www.gammadesk.com/wp-content/uploads/2015/10/Gamma-2rang-22.png" /></td> <td>شماره سند:<span class="test"></span></td> </tr> </table> 的{​​{1}}上设置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()使用FLAG_ACTIVITY_NEW_TASK,因为授予许可标志也会在添加时添加到其中用chooser方法构造。

Intent