10

First off, sorry if this has been asked but I cannot find it. I am downloading documents in my app from a remote resource. Once the document is downloaded, I want to open it for the user. What I want to know is how do I check if they have an application to handle Pdf or Tiff and launch it in the default application for them?

Thank you.

edit

here is part of the solution:

Intent viewDoc = new Intent(Intent.ACTION_VIEW);
viewDoc.setDataAndType(
    Uri.fromFile(getFileStreamPath("test.pdf")), 
    "application/pdf");

PackageManager pm = getPackageManager();
List<ResolveInfo> apps = 
    pm.queryIntentActivities(viewDoc, PackageManager.MATCH_DEFAULT_ONLY);

if (apps.size() > 0)
    startActivity(viewDoc);
Tom Fobear
  • 6,729
  • 7
  • 42
  • 74

2 Answers2

8

Step #1: Create an ACTION_VIEW Intent, using setDataAndType() to provide a Uri to your downloaded file (e.g., Uri.fromFile()) and the MIME type of the content (e.g., application/pdf).

From there, you have two options:

Step #2a: Use PackageManager and queryIntentActivities() with that Intent. If it returns a zero-length list, you know there are no candidates, and therefore can disable any buttons, menu choices, or whatever that would lead to calling startActivity() on that Intent.

or

Step #2b: Just call startActivity() when the user wants to view it, and catch the exception that occurs when there are no supported apps installed. This is simpler than #2a above, but not quite as user-friendly.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • If I have a byte[] of the file will this method still work if I dont want to save it to disk? – Tom Fobear Feb 11 '11 at 14:18
  • @Tom Fobear: You have no choice but to save it to disk, in a place that can be read by the other application. That means either storing it in external storage, or storing it as a `MODE_WORLD_READABLE` file in your app-local file store, or storing it as a normal (deny-all) file in the app-local file store and using a content provider to make it available to other apps. – CommonsWare Feb 11 '11 at 14:26
  • Ran into a problem, On my device there were multiple apps that claimed they supported my intent using your PackageManager method. I found out that the files were saving correctly. For example, once I downloaded adobe reader I could view pdfs I launched from my activity. Is there a more legit method to check for good apps besides hardcoding possible choices in? Thank you. – Tom Fobear Feb 13 '11 at 01:49
  • @Tom Fobear: Could you provide the exact `Intent` you were using with `PackageManager`? – CommonsWare Feb 13 '11 at 02:47
  • @Tom Fobear: That looks fine. What occurred when you called `startActivity()` on that `Intent`? – CommonsWare Feb 13 '11 at 15:12
  • For pdfs, it was launching in ThinkFree Office (think its inteded for DOC) and all pages had a rectangle with an X in it. It was the right number of pages, which lead me to the conclusion the file was right and the program couldnt handle it. For tiff It was ES Image viewer and all I saw was a black screen. I downloaded adobe and tiff-viewer light, which worked fine afterwards. On another note, is there a better viewer for Tiff other than tiff-viewer? – Tom Fobear Feb 14 '11 at 02:07
  • @Tom Fobear: Those are problems with those apps or the files, then, not with your `Intent` logic. With respect to TIFF, IMHO that file format should have died a long time ago, and so I have no personal experience with Android TIFF viewers. – CommonsWare Feb 14 '11 at 02:15
  • @CommonsWare: thank you for your help! I should be good. Also, I agree about tiffs but unfortunately we have to backwards support them. – Tom Fobear Feb 14 '11 at 04:30
3

The following code might help you

code for the file
write this code to get the url of file in main function

File myFile = new File("your any type of file url");
FileOpen.openFile(mContext, myFile);

Code to open default application present in the handset create another class

public class FileOpen {
    public static void openFile(Context context, File url) throws IOException {
        // Create URI
        File file=url;
        Uri uri = Uri.fromFile(file);

        Intent intent = new Intent(Intent.ACTION_VIEW);
        // Check what kind of file you are trying to open, by comparing the url with extensions.
        // When the if condition is matched, plugin sets the correct intent (mime) type, 
        // so Android knew what application to use to open the file
        if (url.toString().contains(".doc") || url.toString().contains(".docx")) {
            // Word document
            intent.setDataAndType(uri, "application/msword");
        } else if(url.toString().contains(".pdf")) {
            // PDF file
            intent.setDataAndType(uri, "application/pdf");
        } else if(url.toString().contains(".ppt") || url.toString().contains(".pptx")) {
            // Powerpoint file
            intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
        } else if(url.toString().contains(".xls") || url.toString().contains(".xlsx")) {
            // Excel file
            intent.setDataAndType(uri, "application/vnd.ms-excel");
        } else if(url.toString().contains(".zip") || url.toString().contains(".rar")) {
            // WAV audio file
            intent.setDataAndType(uri, "application/x-wav");
        } else if(url.toString().contains(".rtf")) {
            // RTF file
            intent.setDataAndType(uri, "application/rtf");
        } else if(url.toString().contains(".wav") || url.toString().contains(".mp3")) {
            // WAV audio file
            intent.setDataAndType(uri, "audio/x-wav");
        } else if(url.toString().contains(".gif")) {
            // GIF file
            intent.setDataAndType(uri, "image/gif");
        } else if(url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) {
            // JPG file
            intent.setDataAndType(uri, "image/jpeg");
        } else if(url.toString().contains(".txt")) {
            // Text file
            intent.setDataAndType(uri, "text/plain");
        } else if(url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) {
            // Video files
            intent.setDataAndType(uri, "video/*");
        } else {
            //if you want you can also define the intent type for any other file

            //additionally use else clause below, to manage other unknown extensions
            //in this case, Android will show all applications installed on the device
            //so you can choose which application to use
            intent.setDataAndType(uri, "*/*");
        }

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        context.startActivity(intent);
    }
}
also u can write this if condition
*** if(url.getPath().endsWith(".jpg") || url.getPath().endsWith(".jpeg")|| url.getPath().endsWith(".png")***
{
          intent.setDataAndType(uri,"image/*");
}*
Inzimam Tariq IT
  • 6,548
  • 8
  • 42
  • 69
Vaibhav Joshi
  • 145
  • 1
  • 5