如何解决从 Android 11 上的内存直接访问文件
我的应用程序与来自“外部”并保留在下载文件夹中的一些 pdf 报告交互(报告由用户通过浏览器下载)。
我的目标是使用外部 PDF 查看器打开此 pdf 报告。就像 Google 文档(或其他)一样。
我的代码如下所示:
final String reportName="/storage/emulated/0/Download/1.pdf";
File file = new File(reportName);
Intent target = new Intent(Intent.ACTION_VIEW);
Uri fileURI = FileProvider.getUriForFile(context,context.getApplicationContext().getPackageName() + ".provider",file);
target.setDataAndType(fileURI,"application/pdf");
target.setFlags(target.getFlags() | Intent.FLAG_GRANT_READ_URI_PERMISSION );
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(target,PackageManager.MATCH_DEFAULT_ONLY);
Log.d("FileWorker","Size is"+resInfoList.size());
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName
context.grantUriPermission(packageName,fileURI,Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
startActivity(target);
在 API 级别低于 30 时一切正常。 在 Android 30 上这不起作用,失败(来自日志):
com.google.android.apps.docs E/displayData: openFd: java.io.FileNotFoundException: open Failed: EACCES (Permission denied)
com.google.android.apps.docs E/PdfLoader: Can't load file (doesn't open) display Data [PDF : 1.pdf] +ContentOpenable,uri: content://org.qtproject.example.provider/root/storage/emulated/0/Download/1.pdf
我猜这是因为范围存储政治。
我的尝试:
-
使用 ACTION_OPEN_DOCUMENT 和文件选择器获取 PDF 文件 URI。然后将此 URI 与 ACTION_VIEW 一起使用。这工作正常,但我真的不想使用文件选择器。
-
我知道
android:requestLegacyExternalStorage="true"
,但它不适用于 Android 30。 -
<queries> <package android:name="com.google.android.apps.docs"/> <intent> <action android:name="android.intent.action.VIEW"/> <data android:mimeType="application/pdf"/> </intent> </queries>
也无济于事。
除了使用 ACTION_OPEN_DOCUMENT 之外,我还能做些什么来解决这个问题?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。