使用资产文件夹中的其他应用程序打开pdf,解决方法

时间:2014-01-11 14:09:55

标签: java android pdf android-intent android-external-storage

在我的应用中,我有一些pdf存储在我的资源文件夹中。我已经看过用于打开pdf页面的库,但我认为像quickoffice这样的应用程序比我见过的库更能显示pdf。因此,我希望使用Intent.ACTION_VIEW来显示pdf,如下所示:

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

但是,这是不可能的,因为不允许第三方应用访问我的包中的文件。因此,我需要将文件复制到外部存储器并将该文件提供给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-viewing应用程序出现问题?或者有不同的解决方法吗?

1 个答案:

答案 0 :(得分:3)

  

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

您还可以尝试my StreamProvider,一个基于Google ContentProvider的固定FileProvider,来自资源。

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

<?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>

并且,如果这不起作用,它应该是file an issue随意使用可重现的测试用例。

  

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

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