使用 FileProvider 打开我的应用程序中包含的 PDF?

Using FileProvider to open PDF included in my app?

我已经包含了两个我想从我的应用程序打开的 PDF。它们应该使用用户安装的任何 PDF 查看器打开。我将 PDF 放在 /res/raw 中。我使用了这段代码:

File file = new File(getContext().getFilesDir().getPath(), s);
            Uri pdfUri = FileProvider.getUriForFile(getContext(), getContext().getApplicationContext().getPackageName() + ".provider", file);
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(pdfUri, "application/pdf");
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

我的 filepaths.xml 看起来像这样:

<paths>
<files-path path="raw/" name="raw" />

我收到一条错误消息:

java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.dsv2019.pvt15.prepapp/files/hjartlugnraddning.pdf

为什么会这样?

你有一些问题。

首先,<files-path path="raw/" name="raw" /> 表示它提供 getFilesDir()raw/ 子目录中的文件。但是,new File(getContext().getFilesDir().getPath(), s)不会有这样的目录,除非不知何故在s中,而错误提示不是。顺便说一句,您可以将其简化为 new File(getContext().getFilesDir(), s).

其次,我认为您假设 getFilesDir() 中存在 raw/ 目录。除非您创建该目录,否则它将不存在。

第三,我认为您认为原始资源是设备上的文件。他们不是。它们是您开发机器上的文件。它们只是设备上 APK 文件中的条目。

因此,要实现此功能,您需要将代码添加到:

  • getFilesDir()

  • 中创建一个 raw/ 子目录
  • Resources 对象上使用 openRawResource() 将资源复制到该 newly-created raw/ 子目录中的文件

  • 将上一步中的 File 对象与 FileProvider.getUriForFile()

  • 一起使用