Search code examples
androidpdfandroid-intentandroidhttpclient

Android download pdf to internal storage and launch intent


I am trying to download a pdf from the internet, store the file in internal storage and then launch the pdf in an intent. I keep getting "The document is empty (size 0KB)" when it launches the intent.

class Pdf extends AsyncTask<Void, Void, String>{

     private Context ctx;

      public Pdf(Context ctx){
          this.ctx = ctx;

      }

    @Override
    protected String doInBackground(Void... params) {

         try {

             FileOutputStream f = ctx.openFileOutput("city.pdf", ctx.MODE_WORLD_READABLE);
             URL u = new URL("http://www.example.com/city.pdf");

             HttpURLConnection c = (HttpURLConnection) u.openConnection();
             c.setRequestMethod("GET");
             c.setDoOutput(true);
             c.connect();
             InputStream in = c.getInputStream();
             byte[] buffer = new byte[1024];
             int len1 = 0;
             while ((len1 = in.read(buffer)) > 0) {
                     f.write(buffer, 0, len1);
             }
             f.close();
     } catch (Exception e) {
             e.printStackTrace();
     }



         File file = new File(ctx.getFilesDir(), "city.pdf");
         PackageManager packageManager = ctx.getPackageManager();
         Intent testIntent = new Intent(Intent.ACTION_VIEW);
         testIntent.setType("application/pdf");
         List list = packageManager.queryIntentActivities(testIntent,
                 PackageManager.MATCH_DEFAULT_ONLY);
         Intent intent = new Intent();
         intent.setAction(Intent.ACTION_VIEW);
         Uri uri = Uri.fromFile(file);
         intent.setDataAndType(uri, "application/pdf");
         ctx.startActivity(intent);


        return null;
    }

}

This has been driving me crazy, any ideas?


Solution

  • You will not be able to do this from the filesDir. I had run into the same issue.

    You can do the following:

    private void playFile(String fileName)
    {
        try
        {
            File documentFile = new File(fileName);
    
            String externalStroageString = appContext.getExternalCacheDir()+"/Download/";
            File externalStroage = new File(externalStroageString);
    
            File documentFileExternal = new File(externalStroage, documentFile.getName());
            if(documentFileExternal.exists())
                documentFileExternal.delete();
            try 
            {
                FileUtils.copyFile(documentFile, documentFileExternal);
                documentFileExternal.setReadable(true, false);
    
            } 
            catch (IOException e) 
            {
    
            }
            MimeTypeMap map = MimeTypeMap.getSingleton();
            int index = documentFileExternal.getName().lastIndexOf(".");
            String ext = documentFileExternal.getName().substring(index+1);
            String type = map.getMimeTypeFromExtension(ext);
            Uri uri = Uri.parse("file://"+documentFileExternal.getAbsolutePath());
            if (type == null)
                type = "*/*";
    
            try
            {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                if(ext.equalsIgnoreCase("htm") || ext.equalsIgnoreCase("html"))
                {
                    intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");
                    intent.addCategory(Intent.CATEGORY_BROWSABLE);
                }
    
                intent.setDataAndType(uri, type);
    
                appContext.startActivity(intent);
            }
    
            catch(Exception ex)
            {
                ErrorManager.appContext = appContext;
                ErrorManager.errorCode = "UnsupportedFileType";
                ErrorManager.displayErrorDialog();
            }
        }
    
        catch(Exception ex)
        {}
    } 
    catch(Exception ex)
    {
    
    }
    

    }