Android从网址下载并显示pdf

时间:2012-10-29 16:30:38

标签: android

我从聊天中获取.pdf文件,我想下载它并使用acrobat reader显示它。以下是我的代码

 public void showPDF(String pdf)
        {
            try
            {
                Log.i("pic", "  * * * in showPdf" + pdf);

                String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
                File folder = new File(extStorageDirectory, "pdf");
                folder.mkdir();
                String pdf_name = pdf.replace(".pdf", "");
                pdf_name = pdf_name.replace("/fileupload/data/chat/", "");
                File file = new File(folder, pdf_name + ".pdf");
                try
                {
                    file.createNewFile();
                }
                catch (IOException e1)
                {
                    e1.printStackTrace();
                }
                Log.i("pic", "  * * * ready to download");
                new DownloadFile(file, Functions.getServiceProtocol() + Functions.getServiceDomain() + pdf, pdf_name).execute();
            }
            catch (Exception e)
            {
                Log.i("pic", " CATCH * * * in showPdf");
            }
        }
      } 



  private class DownloadFile extends AsyncTask<String, Integer, String>
        {
            private String fileURL, pdfname;
            private File directory;
            private ProgressDialog dlg = new ProgressDialog(CameraWebview.this);

            public DownloadFile(File d, String f, String n)
            {
                directory = d;
                fileURL = f;
                pdfname = n;
            }

            @Override
            protected String doInBackground(String... sUrl)
            {
                try
                {
                    Log.i("pic", " TRY * * * download file");
                    FileOutputStream f = new FileOutputStream(directory);
                    URL u = new URL(fileURL);
                    HttpURLConnection c = (HttpURLConnection)u.openConnection();
                    c.setRequestMethod("GET");
                    c.setDoOutput(true);
                    c.connect();

                    InputStream in = c.getInputStream();

                    byte[] buffer = new byte[1024];
                    long total = 0;
                    int count;

                    while ((count = in.read(buffer)) != -1) {
                        total += count;
                        f.write(buffer, 0, count);
                    }

                    f.flush();
                    f.close();

                    try
                    {
                         Log.i("pic", " TRY * * * calling displayPdf");
                         displayPdf(pdfname);
                    }
                    catch(Exception ex)
                    {
                        Log.i("pic", " CATCH * * * calling displayPdf");
                    }
                }
                catch (Exception e)
                {
                }
                return null;
            }

            @Override
            protected void onPreExecute()
            {
                super.onPreExecute();
                dlg.setMessage("Downloading File ...");
                dlg.show();
            }

            @Override
            protected void onProgressUpdate(Integer... progress)
            {
                super.onProgressUpdate(progress);
                mProgressDialog.setProgress(progress[0]);
            }

            @Override
            protected void onPostExecute(String result)
            {
                super.onPostExecute(result);
                if (dlg.isShowing())
                    dlg.dismiss();
            }
        }

      public void displayPdf(String pdf_name)
        {
            try
            {
                Log.i("pic", " TRY * * * ready to show pdf");
                File file = new File(Environment.getExternalStorageDirectory() + "/pdf/" + pdf_name + ".pdf");
                PackageManager packageManager = 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");
                startActivity(intent);
                Log.i("pic", " TRY * * * here is the pdf");
            }
            catch (Exception e)
            {
                Log.i("pic", " CATCH * * * show pdf file" + e.toString());
            }

它总是说“已损坏的文件”。我检查了我正在使用的网址,这很好。我的应用程序也是Ice Cream Sandwitch。我做错了什么?

3 个答案:

答案 0 :(得分:1)

当你致电DownloadFile(File d, String f, String n)时,你如何获得目录?

如果您使用getExternalStorageDirectory(我假设您是),则该pdf对您的应用程序是私有的,并且其他应用程序无法访问。

如果您需要将该文件保密为您的应用程序,并且仍然可以使用其他应用程序打开,请使用ContentProvider

如果您可以将该文件保存在共享目录中,则应使用getExternalStoragePublicDirectory()获取保存文件的路径,然后再检索文件URI。

此问题与this问题有关,因此答案相似。

这应该可以解决问题:

内部showPDF

String extStorageDirectory = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DOWNLOADS).toString();

内部displayPdf

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/pdf/" + pdf_name + ".pdf");

答案 1 :(得分:1)

你在setRequestMethod(“GET”)之后使用setDoOutput(true)。

setDoOutput(true)将您的请求方法自动设置为POST。

答案 2 :(得分:0)

                        theurl = new URL(url);                       
                        InputStream in = null;
                        File dst = new File(Environment.getExternalStorageDirectory()+"/file.pdf");
                            try {
                                in = theurl.openStream();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }               
                            OutputStream out = null;
                        try {
                            out = new FileOutputStream(dst);
                        } catch (FileNotFoundException e) {
                            // TODO Auto-generated catch block
                        }
                             // Transfer bytes from in to out
                             try {
                                byte[] buf = new byte[100000];
                                int len;
                            while ((len = in.read(buf)) > 0) {
                              out.write(buf, 0, len);
                             }
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                             try {
                            in.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                             try {
                            out.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }