使用 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()
一起使用
我已经包含了两个我想从我的应用程序打开的 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()
中创建一个 在
Resources
对象上使用openRawResource()
将资源复制到该 newly-createdraw/
子目录中的文件将上一步中的
File
对象与FileProvider.getUriForFile()
一起使用
raw/
子目录