Tarandeepsingh
Tarandeepsingh

Reputation: 175

Intent not opening pdf file

i found this answer https://stackoverflow.com/a/10689094/11520105 ,and i tried this code ,it pops up dialog to select pdfviewer and when i tap Adobe reader then it simply just launches adobe reader but doesn't launch pdf file

code snippet

pdflistView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

               UploadPDF uploadPDF = list.get(position);
               String url = uploadPDF.getUrl();
               Log.i("url",url);
                Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url));
                intent.setType("application/pdf");
                PackageManager pm = getPackageManager();
                List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
                if (activities.size() > 0) {
                    startActivity(intent);
                } else {
                    // Do something else here. Maybe pop up a Dialog or Toast
                    Toast.makeText(ShowPdfActivity.this, "Can't open pdf", Toast.LENGTH_SHORT).show();
                }

logCat

2020-01-01 18:05:56.259 15148-15148/com.tarandeepsingh.inventory V/FA: onActivityCreated
2020-01-01 18:05:56.306 15148-15186/com.tarandeepsingh.inventory V/FA: Activity resumed, time: 2896415632
2020-01-01 18:05:56.320 15148-15186/com.tarandeepsingh.inventory D/FA: Logging event (FE): screen_view(_vs), Bundle[{ga_event_origin(_o)=auto, ga_previous_class(_pc)=MainActivity, ga_previous_id(_pi)=3485492302754114157, ga_screen_class(_sc)=ShowPdfActivity, ga_screen_id(_si)=3485492302754114159}]
2020-01-01 18:05:57.157 15148-15148/com.tarandeepsingh.inventory I/url: https://firebasestorage.googleapis.com/v0/b/inventory-b98d3.appspot.com/o/uploads%2F1577868311721.pdf?alt=media&token=e543f039-38bd-4881-bcff-48b533ff22bf
2020-01-01 18:05:57.165 15148-15148/com.tarandeepsingh.inventory I/Timeline: Timeline: Activity_launch_request time:644743239 intent:Intent { act=android.intent.action.VIEW typ=application/pdf }
2020-01-01 18:05:57.200 15148-15186/com.tarandeepsingh.inventory V/FA: Screen exposed for less than 1000 ms. Event not sent. time: 889
2020-01-01 18:05:57.207 15148-15186/com.tarandeepsingh.inventory V/FA: Activity paused, time: 2896416520
2020-01-01 18:05:59.218 15148-15186/com.tarandeepsingh.inventory D/FA: Application going to the background
2020-01-01 18:05:59.235 15148-15186/com.tarandeepsingh.inventory D/FA: Logging event (FE): app_background(_ab), Bundle[{ga_event_origin(_o)

as you can see in logcat , i am getting url but unable to launch default/already installed pdf viewer

thanks

Upvotes: 0

Views: 2003

Answers (2)

Tarandeepsingh
Tarandeepsingh

Reputation: 175

I need to download file to open it , i can't open it in inbuilt/default pdfviewer using uri

String url = "given";
 DownloadManager downloadmanager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
                    request.setTitle(name);
                    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI |
                            DownloadManager.Request.NETWORK_MOBILE);
                   request.setAllowedOverRoaming(false);
                    request.setDescription("Downloading");
                    request.allowScanningByMediaScanner();
                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,name);
                    request.setMimeType(".pdf");

                    id = downloadmanager.enqueue(request);

using downloadManager is better way, so i used it

Upvotes: 0

To handle your needs, you need to download the PDF and store it into the device storage, so you can use it as you want using their path.

Here's a full example of how to download a PDF file and open it when the download is finished :

String PDF_URL = "https://perso.univ-rennes1.fr/pierre.nerzic/Android/poly.pdf";



@SuppressLint("StaticFieldLeak")
private class DownloadFile extends AsyncTask<String, Integer, String> {

    String savedFilePath = null;
    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //To ignore the file URI exposure.
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());

        progressDialog = new ProgressDialog(PickLocationActivity.this);
        progressDialog.setTitle("Downloading PDF");
        progressDialog.setMessage("Please wait (0%)");
        progressDialog.show();
    }

    @Override
    protected String doInBackground(String... urlParams) {
        int count;
        String fileName = urlParams[1] + ".pdf";
        File storageDir = new File(
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                        + "/PDF_FOLDER/");
        boolean success = true;
        if (!storageDir.exists()) {
            success = storageDir.mkdirs();
        }
        if (success) {
            File file = new File(storageDir, fileName);
            savedFilePath = file.getAbsolutePath();
            if (!file.exists()) {
                try {
                    URL url = new URL(urlParams[0]);
                    URLConnection conexion = url.openConnection();
                    conexion.connect();
                    int lenghtOfFile = conexion.getContentLength();
                    InputStream input = new BufferedInputStream(url.openStream());
                    OutputStream output = new FileOutputStream(file);
                    byte data[] = new byte[1024];
                    long total = 0;
                    while ((count = input.read(data)) != -1) {
                        total += count;
                        publishProgress((int) (total * 100 / lenghtOfFile));
                        output.write(data, 0, count);
                    }
                    output.flush();
                    output.close();
                    input.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }
        return savedFilePath;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        progressDialog.setMessage("Please wait (" + values[0] + "%)");
    }

    @Override
    protected void onPostExecute(String pdfPath) {
        super.onPostExecute(pdfPath);
        if (pdfPath != null && !pdfPath.isEmpty()) {
            File pdfFile = new File(pdfPath);
            if (pdfFile.exists()) {
                progressDialog.dismiss();
                Uri path = Uri.fromFile(pdfFile);
                Intent Go = new Intent(Intent.ACTION_VIEW);
                Go.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                Go.setDataAndType(path, "application/pdf");
                Go.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(Go);
            }
        }
    }
}

call it like this : new DownloadFile().execute(PDF_URL, "PDF_NAME"); don't forget to add INTERNET, READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions on your AndroidManifest.xml


Otherwise, you can use this library PdfViewPager and go to Remote PDF's from a URL, it's doing the same thing (downloading PDF file into your device storage first)

Upvotes: 2

Related Questions