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