2

チャットから.pdfファイルを取得しています。ダウンロードして、acrobatReaderを使用して表示したいと思います。以下は私のコードです

 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());
            }

常に「破損したファイル」と表示されます。使用しているURLを確認しましたが、問題ありません。また、私のアプリはアイスクリームサンドウィッチです。私は何を間違っているのですか?

4

3 に答える 3

1

電話をかけるときDownloadFile(File d, String f, String n)、どのようにしてディレクトリを取得しますか?

getExternalStorageDirectory(私はあなたがそうだと思います)を使用している場合、そのpdfはアプリケーション専用であり、他のアプリケーションからアクセスすることはできません。

そのファイルをアプリケーションに対して非公開にする必要があり、それでも別のアプリケーションを使用して開くことができる場合は、ContentProvider

そのファイルを共有ディレクトリに保持できる場合は、を使用getExternalStoragePublicDirectory()してファイルを保存するためのパスを取得し、後でファイルURIを取得する必要があります。

この問題はこれに関連しているため、同様の答えです。

これで問題が解決するはずです。

内部showPDF

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

中身displayPdf

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/pdf/" + pdf_name + ".pdf");
于 2012-10-29T16:39:34.107 に答える
1

setRequestMethod( "GET")の後にsetDoOutput(true)を使用しています。

setDoOutput(true)は、リクエストメソッドをPOSTに自動的に設定します。

于 2012-10-29T17:54:11.733 に答える
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();
                        }
于 2012-10-29T17:59:46.167 に答える