2012-05-09 130 views
2

私はこのwebviewコードを持っており、ユーザーがPDFリンクをクリックしたときにPDFファイルを開くことができるようにしたいと考えています。ここにコードがありますが、私はこれのPDF領域に何を入れなければならないのか教えていただけますか?私はいろいろな方法で試してみましたが、PDFをまったく見ることができません。助けてくれてありがとう。Android - webview内のPDFを読み込み

webview.setWebViewClient (new WebViewClient() { 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     // do your handling codes here, which url is the requested url 
     // probably you need to open that url rather than redirect: 
     if (url.startsWith("tel:")) { 
      startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url))); 
     } else if (url.startsWith("mailto:")) { 
      url = url.replaceFirst("mailto:", ""); 
      url = url.trim(); 
      Intent i = new Intent(Intent.ACTION_SEND); 
      i.setType("plain/text").putExtra(Intent.EXTRA_EMAIL, 
        new String[]{url}); 
      startActivity(i); 

     } else if (url.startsWith("geo:")) { 
      try { 
      } catch (Exception e) { 
       System.out.println(e); 
      } 

     } else if (url.endsWith("pdf")) { 

      try { 

      } catch (Exception e) { 
       System.out.println(e); 
      } 

     } else { 
      view.loadUrl(url); 
     } 
     return true; 
     // then it is not handled by default action 
    } 
}); 

答えて

10

これは、のような単純なものでした:私はこれを試していませんでしたけれども

try 
{ 
Intent intentUrl = new Intent(Intent.ACTION_VIEW); 
intentUrl.setDataAndType(url, "application/pdf"); 
intentUrl.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
myActivity.startActivity(intentUrl); 
} 
catch (ActivityNotFoundException e) 
{ 
Toast.makeText(myActivity, "No PDF Viewer Installed", Toast.LENGTH_LONG).show(); 
} 

アプリでは、PDFをアプリファイルシステムにダウンロードし、世界中で読めるようにしてから、インテントのパスをPDF閲覧アプリ(例:Acrobat Reader)を開くために渡します。これらのダウンロードされたPDFをクリーンアップすることにも心配する必要があることに注意してください!

public class DownloadPDFTask extends AsyncTask<String, Void, Integer> 
{ 
    protected ProgressDialog mWorkingDialog; // progress dialog 
    protected String mFileName;   // downloaded file 
    protected String mError;   // for errors 

    @Override 
    protected Integer doInBackground(String... urls) 
    { 

    try 
    { 
     byte[] dataBuffer = new byte[4096]; 
      int nRead = 0; 

      // set local filename to last part of URL 
      String[] strURLParts = urls[0].split("/"); 
      if (strURLParts.length > 0) 
      mFileName = strURLParts[strURLParts.length - 1]; 
      else 
       mFileName = "REPORT.pdf"; 

      // download URL and store to strFileName 

      // connection to url 
     java.net.URL urlReport = new java.net.URL(urls[0]); 
      URLConnection urlConn = urlReport.openConnection(); 
      InputStream streamInput = urlConn.getInputStream(); 
      BufferedInputStream bufferedStreamInput = new BufferedInputStream(streamInput); 
      FileOutputStream outputStream = myActivity.openFileOutput(mFileName,Context.MODE_WORLD_READABLE); // must be world readable so external Intent can open! 
      while ((nRead = bufferedStreamInput.read(dataBuffer)) > 0) 
       outputStream.write(dataBuffer, 0, nRead); 
      streamInput.close(); 
      outputStream.close(); 
     } 
     catch (Exception e) 
     { 
     Log.e("myApp", e.getMessage()); 
     mError = e.getMessage(); 
     return (1); 
     } 

    return (0); 
    } 

    //------------------------------------------------------------------------- 
    // PreExecute - UI thread setup 
    //------------------------------------------------------------------------- 

    @Override 
    protected void onPreExecute() 
    { 
    // show "Downloading, Please Wait" dialog 
    mWorkingDialog = ProgressDialog.show(myActivity, "", "Downloading PDF Document, Please Wait...", true); 
    return; 
    } 

    //------------------------------------------------------------------------- 
    // PostExecute - UI thread finish 
    //------------------------------------------------------------------------- 

    @Override 
    protected void onPostExecute (Integer result) 
    { 
     if (mWorkingDialog != null) 
     { 
     mWorkingDialog.dismiss(); 
     mWorkingDialog = null; 
     } 

     switch (result) 
     { 
     case 0:       // a URL 

      // Intent to view download PDF 
      Uri uri = Uri.fromFile(myActivity.getFileStreamPath(mFileName)); 

      try 
      { 
       Intent intentUrl = new Intent(Intent.ACTION_VIEW); 
       intentUrl.setDataAndType(uri, "application/pdf"); 
       intentUrl.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       myActivity.startActivity(intentUrl); 
      } 
      catch (ActivityNotFoundException e) 
      { 
       Toast.makeText(myActivity, "No PDF Viewer Installed", Toast.LENGTH_LONG).show(); 
      } 

      break; 

     case 1:       // Error 

      Toast.makeText(myActivity, mError, Toast.LENGTH_LONG).show(); 
      break; 

     } 

    } 

} 

"myActivity" への言及、私がしようとしていたあなたのActivityクラス

+0

非同期ダウンロードタスクを実行せずにwebview形式でPDFファイルを表示することはできますか? – user1363871

+1

いいえ、iOSのUIWebViewとは異なり、Android WebViewはPDFコンテンツを表示しません。インテントを直接呼び出してみることができます(つまり、AsyncDownloadTaskは使用できません)。 – CSmith

+0

ええと、アンドロイドの最善の方法は、ファイルをダウンロードして保存するためにasyncを呼び出すことです。プロセスがファイル名を自動的に見つけてその名前をSDカードに保存できるかどうか知っていますか?私はいつもこれを使用するときに名前を指定しました。ありがとう! – user1363871

1

を参照して置き換える必要があります:あなたのtryブロック内

はDownloadPDFTaskクラスは

new DownloadPDFTask().execute(url); 
を置きますこのまったく同じシナリオを処理します。私が思いついた解決策は以下の通りです。

public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      String cleanUrl = url; 
      if (url.contains("?")) { 
       // remove the query string 
       cleanUrl = url.substring(0,url.indexOf("?")); 
      } 

      if (cleanUrl.endsWith("pdf")) { 

       try { 
        Uri uriUrl = Uri.parse(cleanUrl); 
        Intent intentUrl = new Intent(Intent.ACTION_VIEW, uriUrl); 
        startActivity(intentUrl); 
        return true; 

       } catch (Exception e) { 
        System.out.println(e); 
        Toast.makeText(context,"No PDF Viewer Installed", Toast.LENGTH_LONG).show(); 
       } 
      } 

      return false; 
     } 

クエリ文字列があっても、pdfリンクを確実に処理する必要がありました。 cleanUrlが "pdf"で終わる必要があるので、ちょっとハッキーですが、それが真実である限り、これはうまくいくはずです。あなたがpdfをPHPスクリプトなどで扱っているなら、少し深く掘り下げて、MIMEの種類などに基づいて処理したいかもしれません。

0

FWIWのmozillaには、Apacheのライセンスを受けたPDF-reader-entirely-in-JavaScriptがあります。あなたが余分なサイズを気にしないかどうか調べる価値があるかもしれません。そうすれば、ブラウザ内のすべてを行うことができ、サードパーティのPDFリーダーに頼る必要はありません。 WebViewの内

1

ロードPDF:

WebView wv = (WebView) view.findViewById(R.id.webPage); 
      wv.getSettings().setJavaScriptEnabled(true); 
      wv.setWebViewClient(new WebClient()); 
      wv.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + mUrl); 
      wv.getSettings().setBuiltInZoomControls(true); 

mUrlは -

+0

良い答えです。 .. –

1

はWebViewの中で、ダウンロードせずにURLと開いたPDFをリダイレクト処理するための一例をチェックアウトしてください、あなたのPDFのリンクになります。

private void init() 
{ 
    WebView webview = (WebView) findViewById(R.id.webview); 
    WebSettings settings = webview.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 

    PdfWebViewClient pdfWebViewClient = new PdfWebViewClient(this, webview); 
    pdfWebViewClient.loadPdfUrl(
       "https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjgwIfp3KXSAhXrhFQKHQqEDHYQFggZMAA&url=http%3A%2F%2Fwww.orimi.com%2Fpdf-test.pdf&usg=AFQjCNERYYcSfMLS5ukBcT2Qy11YxEhXqw&cad=rja"); 
} 

private class PdfWebViewClient extends WebViewClient 
{ 
    private static final String TAG = "PdfWebViewClient"; 
    private static final String PDF_EXTENSION = ".pdf"; 
    private static final String PDF_VIEWER_URL = "http://docs.google.com/gview?embedded=true&url="; 

    private Context mContext; 
    private WebView mWebView; 
    private ProgressDialog mProgressDialog; 
    private boolean isLoadingPdfUrl; 

    public PdfWebViewClient(Context context, WebView webView) 
    { 
     mContext = context; 
     mWebView = webView; 
     mWebView.setWebViewClient(this); 
    } 

    public void loadPdfUrl(String url) 
    { 
     mWebView.stopLoading(); 

     if (!TextUtils.isEmpty(url)) 
     { 
      isLoadingPdfUrl = isPdfUrl(url); 
      if (isLoadingPdfUrl) 
      { 
       mWebView.clearHistory(); 
      } 

      showProgressDialog(); 
     } 

     mWebView.loadUrl(url); 
    } 

    @SuppressWarnings("deprecation") 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView webView, String url) 
    { 
     return shouldOverrideUrlLoading(url); 
    } 

    @SuppressWarnings("deprecation") 
    @Override 
    public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) 
    { 
     handleError(errorCode, description.toString(), failingUrl); 
    } 

    @TargetApi(Build.VERSION_CODES.N) 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request) 
    { 
     final Uri uri = request.getUrl(); 
     return shouldOverrideUrlLoading(webView, uri.toString()); 
    } 

    @TargetApi(Build.VERSION_CODES.N) 
    @Override 
    public void onReceivedError(final WebView webView, final WebResourceRequest request, final WebResourceError error) 
    { 
     final Uri uri = request.getUrl(); 
     handleError(error.getErrorCode(), error.getDescription().toString(), uri.toString()); 
    } 

    @Override 
    public void onPageFinished(final WebView view, final String url) 
    { 
     Log.i(TAG, "Finished loading. URL : " + url); 
     dismissProgressDialog(); 
    } 

    private boolean shouldOverrideUrlLoading(final String url) 
    { 
     Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url); 

     if (!isLoadingPdfUrl && isPdfUrl(url)) 
     { 
      mWebView.stopLoading(); 

      final String pdfUrl = PDF_VIEWER_URL + url; 

      new Handler().postDelayed(new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        loadPdfUrl(pdfUrl); 
       } 
      }, 300); 

      return true; 
     } 

     return false; // Load url in the webView itself 
    } 

    private void handleError(final int errorCode, final String description, final String failingUrl) 
    { 
     Log.e(TAG, "Error : " + errorCode + ", " + description + " URL : " + failingUrl); 
    } 

    private void showProgressDialog() 
    { 
     dismissProgressDialog(); 
     mProgressDialog = ProgressDialog.show(mContext, "", "Loading..."); 
    } 

    private void dismissProgressDialog() 
    { 
     if (mProgressDialog != null && mProgressDialog.isShowing()) 
     { 
      mProgressDialog.dismiss(); 
      mProgressDialog = null; 
     } 
    } 

    private boolean isPdfUrl(String url) 
    { 
     if (!TextUtils.isEmpty(url)) 
     { 
      url = url.trim(); 
      int lastIndex = url.toLowerCase().lastIndexOf(PDF_EXTENSION); 
      if (lastIndex != -1) 
      { 
       return url.substring(lastIndex).equalsIgnoreCase(PDF_EXTENSION); 
      } 
     } 
     return false; 
    } 
} 
関連する問題