Android – 在webview中加载PDF

我有这个webview代码,我希望能够在用户点击PDF链接时打开PDF文件。 这是代码,你能告诉我我要把它放在PDF区域吗? 我已经尝试了很多不同的方法,我根本无法查看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 } }); 

这可能很简单:

 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下载到应用程序文件系统,使其具有全局可读性,然后在Intent中传递路径以打开PDF查看应用程序(例如Acrobat Reader)。 请注意,您还需要关注清理这些下载的PDF文件!

在你的尝试块放

 new DownloadPDFTask().execute(url); 

DownloadPDFTask类:

 public class DownloadPDFTask extends AsyncTask { 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类的引用

我试图处理这个完全相同的情况。 我想出的解决方案如下。

 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链接。 还有点hacky,因为cleanUrl需要以“pdf”结尾,但只要这是真的,这应该有效。 如果你通过php脚本或其他东西提供pdf,你可能想要深入挖掘,根据MIME类型或其他东西处理事情。

在webview中加载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 – 将成为您的pdf链接

请在webview中查看处理重定向url的示例,无需下载即可打开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; } } 

FWIW,mozilla有一个PDF阅读器 – 完全在JavaScript中获得apache许可。 如果你不介意额外的尺寸,可能值得研究。 这样您就可以在浏览器中完成所有操作,而不必依赖第三方PDF阅读器。