【问题标题】:Opening pdf with other app from assets folder, workarounds使用资产文件夹中的其他应用程序打开 pdf,解决方法
【发布时间】:2014-01-11 14:09:54
【问题描述】:

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

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 查看应用出现问题?还是有不同的解决方法?

【问题讨论】:

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


    【解决方案1】:

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

    您也可以尝试my StreamProvider,一个罐头ContentProvider,基于Google 的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 查看应用出现问题?

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

    【讨论】:

    • 谢谢!正是我需要的!但是,演示只使用了 1 个 pdf,它如何处理多个 pdf?
    • @Merlin:查看更新的答案,因为这样做比将所有内容都塞进评论更容易...... :-)
    • 好的,但是我必须将每个 pdf 添加到 paths.xml 还是只需要添加所有 pdf 所在的目录?
    • 所以说我想参考goodstuff文件夹内的1.pdf。我可以使用 content://your.authority.name.goes.here/whatevs/1.pdf 作为 URI,而无需在 paths.xml 中添加 1.pdf 吗?对吗?
    • @Merlin:使用第二个示例 XML 元数据,应该可以正常工作(当然,可以适当地替换 your.authority.name.goes.here)。同样,如果没有,那就是一个错误。
    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2018-12-17
    • 2017-12-26
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多