简体   繁体   中英

Opening pdf with other app from assets folder, workarounds

In my app, I've got some pdf's stored in my assets folder. I've seen libraries for opening pdf-pages, but I think that apps such as quickoffice are better at showing the pdf's than the libraries I've seen. Therefore, i wish to show the pdf using Intent.ACTION_VIEW , like this:

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

However, this is not possible because third party apps are not allowed to acces files in my package. Therefore I need to copy the files to the external storage and provide that file to the intent.

That brings my to my question: my pdf's are quite big in size, so I think it'd be stupid to store them twice (once in my assets folder and once on the external storage). So I'm wondering if there is a work-around for this. Could i for example do:

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

Is this a good work-around or will this cause problems with the pdf-viewing app? Or is there a different work-around?

Therefore I need to copy the files to the external storage and provide that file to the intent.

You can also try my StreamProvider , a canned ContentProvider , based on Google's FileProvider , that streams from assets.

For multiple assets, this should work for the StreamProvider XML metadata:

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

    <asset
        name="whatevs"/>

</paths>

That should resolve all content://your.authority.name.goes.here/whatevs/* Uri values (for various values of * ) to files inside of assets/ . If you want to limit the scope to some specific subdirectory of assets/ (say, assets/goodstuff/ ), you would use:

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

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

</paths>

And, if this does not work, it should, so feel free to file an issue with a reproducible test case.

Is this a good work-around or will this cause problems with the pdf-viewing app?

startActivity() is asynchronous, and so the external PDF viewer will never be able to access the file this way.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM