0

在我的应用程序中,我的资产文件夹中存储了一些 pdf。我见过用于打开 pdf 页面的库,但我认为 quickoffice 等应用程序在显示 pdf 方面比我见过的库更好。因此,我希望使用 显示 pdf Intent.ACTION_VIEW,如下所示:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(fileUri, "application/pdf");
getActivity().startActivity(intent);

但是,这是不可能的,因为不允许第三方应用程序访问我的包中的文件。因此,我需要将文件复制到外部存储并将该文件提供给意图。

这带来了我的问题:我的 pdf 文件很大,所以我认为将它们存储两次(一次在我的资产文件夹中,一次在外部存储中)是愚蠢的。所以我想知道是否有解决方法。例如,我可以这样做:

//Copy file to external storage
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(fileUri, "application/pdf");
getActivity().startActivity(intent);
//Delete file from external storage

这是一个好的解决方法还是会导致 pdf 查看应用程序出现问题?还是有不同的解决方法?

4

1 回答 1

3

因此,我需要将文件复制到外部存储并将该文件提供给意图。

你也可以试试我的StreamProvider,一个罐头ContentProvider,基于谷歌的FileProvider,从资产中流出。

对于多个资产,这应该适用于StreamProviderXML 元数据:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">

    <asset
        name="whatevs"/>

</paths>

这应该将所有content://your.authority.name.goes.here/whatevs/* Uri值(对于 的各种值*)解析为assets/. 如果您想将范围限制为assets/(例如assets/goodstuff/)的某个特定子目录,您可以使用:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">

    <asset
        name="whatevs"
        path="goodstuff/"/>

</paths>

而且,如果这不起作用,它应该,所以请随意用可重现的测试用例提出问题。

这是一个好的解决方法还是会导致 pdf 查看应用程序出现问题?

startActivity()是异步的,因此外部 PDF 查看器将永远无法以这种方式访问​​文件。

于 2014-01-11T14:21:27.243 回答