Neerav Shah
Neerav Shah

Reputation: 743

How to open downloaded file in android with default availabe application in android

I am downloading a file from server on completion of download I have to open a file. Know the problem is the file could be of any type so I can't specify and Intent call to open a file with static name like we do to open a PDF file. What I want is when a file is downloaded it will search if any app is available to open the file else it will show pop up. I am doing all this inside fragment. Here my code for downloading :

public class DownloadFile extends AsyncTask<String, Void, Integer> {
    String file_name = "";
    File sdcard = Environment.getExternalStorageDirectory();
    @Override
    protected Integer doInBackground(String... params) {
        // TODO Auto-generated method stub
        try {
            HttpURLConnection url_conn = null;
            byte[] bffr;

            long totalSize = 0;
            File directory = new File(
                    Environment.getExternalStorageDirectory()
                            + "/xyz/download");
            directory.mkdirs();
            // 06-03 17:57:41.160: D/file name(6882):
            file_name = "";
            file_name = params[0];
            Log.d("file name", file_name.toString());
            url_conn = (HttpURLConnection) (new URL("http://example.com/uploads/" + file_name)).openConnection();
            url_conn.setRequestMethod("GET");
            url_conn.setDoOutput(true);
            url_conn.connect();

            if (url_conn.getContentLength() > 0) {
                File imgFile = new File(sdcard + "/xyz/download/",file_name);
                FileOutputStream fos = new FileOutputStream(imgFile);
                InputStream is = url_conn.getInputStream();
                totalSize = url_conn.getContentLength();
                // Log.d("File Download Size ",totalSize+"");
                long total = 0;
                bffr = new byte[1024];
                int bufferLength = 0;
                while ((bufferLength = is.read(bffr)) > 0) {
                    total += bufferLength;
                    publishProgress("" + (int) ((total * 100) / totalSize));
                    fos.write(bffr, 0, bufferLength);
                }
                fos.close();
            } else
                Log.w(file_name.toString(), "FILE NOT FOUND");
            return 0;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }

    }

    private void publishProgress(String... process) {
        // TODO Auto-generated method stub
        mprogressDialog.setProgress(Integer.parseInt(process[0]));
    }

    protected void onPostExecute(Integer unused) {
        Log.d("after downloading file ", "file downloaded ");
        switch (unused) {
        case 0:
            mprogressDialog.dismiss();
             Intent install = new Intent(Intent.ACTION_VIEW);
                install.setDataAndType(Uri.fromFile(new File(sdcard + "/xyz/download/",file_name)),
                        "MIME-TYPE");
                install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               app.getBaseContext().startActivity(install);
            break;
        }
    }
}

In post execute I have tried to open it using Intent but that didn't worked. Any Idea is appreciated

Upvotes: 5

Views: 13481

Answers (4)

Anoop M Maddasseri
Anoop M Maddasseri

Reputation: 10539

    File file = new File(filePath);
    MimeTypeMap map = MimeTypeMap.getSingleton();
    String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName());
    String type = map.getMimeTypeFromExtension(ext);

    if (type == null)
        type = "*/*";

    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri data = Uri.fromFile(file);

    intent.setDataAndType(data, type);

    startActivity(intent);

Upvotes: 8

Anand Prakash
Anand Prakash

Reputation: 401

After download do this--

 MimeTypeMap myMime = MimeTypeMap.getSingleton();
    Intent newIntent = new Intent(Intent.ACTION_VIEW);
    String mimeType = myMime.getMimeTypeFromExtension(fileExt(path).substring(1));
    newIntent.setDataAndType(Uri.fromFile(new File(path)), mimeType);
    newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    try {
        ReadMailActivity.this.startActivity(newIntent);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(ReadMailActivity.this, "No handler for this type of file.", Toast.LENGTH_LONG).show();
    }

Upvotes: 0

Sanket Kachhela
Sanket Kachhela

Reputation: 10856

i guess you have to pass valid mime-type to get app chooser popup. you can get mimeType from file name or file instance.

String fileName = "/path/to/file";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();

// only by file name
String mimeType = mimeTypesMap.getContentType(fileName);

source https://stackoverflow.com/a/1902146/942224

Upvotes: 0

Nilay Dani
Nilay Dani

Reputation: 896

 install.setDataAndType(Uri.fromFile(new File(sdcard + "/xyz/download/",file_name)),
                    "MIME-TYPE");

You have to set MIME-TYPE according to file type and it will open it in available apps in the device Refer this https://stackoverflow.com/a/24134677/3303075

Upvotes: 0

Related Questions