微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Android 11 上的内存直接访问文件

如何解决从 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。

  • 我试过在 Manifest 中添加这样的查询

       <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 举报,一经查实,本站将立刻删除。