Android 从 url 下载并显示 pdf

标签 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 Sandwich 。我做错了什么?

最佳答案

当调用DownloadFile(File d, String f, String n)时,如何获取目录?

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

如果您需要将该文件保密到您的应用程序,并且仍然能够使用其他应用程序打开,请使用 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");

关于Android 从 url 下载并显示 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13125757/

相关文章:

android - ExpandableListView 子项目的 CheckBox 被随机检查

android - 单线程应用程序在android中使用多核吗?

android - 在应用安装时添加 Android 小部件

Android Gradle 插件 : Create AAR with Jar Dependencies and Proguard

java - 更改 Java 方法中传递的参数值?

android - 关于 android.R.drawable 中 'private' 可绘制对象的说明

android - 如何让Android按钮 View 保持在屏幕底部?

android - 从其依赖项中获取父应用程序的包名称和版本

android - 从编辑文本中获取日期

android - 冷启动时难以获得自定义 View 的高度