在我的应用程序中,我的资产文件夹中存储了一些pdf文件。我看过用于打开pdf页面的库,但我认为Quickoffice之类的应用比我所见的库更能显示pdf。因此,我希望使用显示pdf Intent.ACTION_VIEW,如下所示:
Intent.ACTION_VIEW
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(fileUri, "application/pdf"); getActivity().startActivity(intent);
但是,这是不可能的,因为不允许第三方应用访问我程序包中的文件。因此,我需要将文件复制到外部存储并将该文件提供给意图。
这使我想到了一个问题:我的pdf很大,因此我认为将它们存储两次(一次在我的Assets文件夹中,一次在外部存储器中)是愚蠢的。所以我想知道是否有解决方法。我可以例如这样做:
//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查看应用出现问题?还是有其他解决方法?
因此,我需要将文件复制到外部存储并将该文件提供给意图。
您也可以尝试从资产流式生成的myStreamProvider(ContentProvider基于Google的罐头)FileProvider。
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/)的某些特定子目录,则可以使用:
content://your.authority.name.goes.here/whatevs/*
Uri
*
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查看器将永远无法以这种方式访问文件。
startActivity()