【问题标题】:Android webview with PDF load带有 PDF 加载的 Android webview
【发布时间】:2017-06-08 07:10:55
【问题描述】:

我正在 webview 中加载一个页面

webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("https://www.xxxxxxxxx/howtoguide.aspx");

然后在 webview 里面我有几个函数可以点击下面的事件

            @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            if (url.contains("concierge@xxxx.com.sg")) {
                final Intent eIntent = new Intent(
                        android.content.Intent.ACTION_SEND);
                eIntent.setType("plain/text");
                eIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
                        new String[]{"xxxxxx"});
                eIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
                        "");
                eIntent.putExtra(android.content.Intent.EXTRA_TEXT,
                        "Text to be send");
                startActivity(Intent.createChooser(eIntent,
                        "Send mail..."));

            } else if (url.startsWith("tel:")) {

            Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
                startActivity(intent);
                view.reload();

            } else if (url.contains(".pdf")) {
            //Intent intent = new Intent(Intent.ACTION_VIEW);
            //intent.setDataAndType(Uri.parse(url), "application/pdf");
            //try{
            //view.getContext().startActivity(intent);
            //} catch (ActivityNotFoundException e) {
            //user does not have a pdf viewer installed
            //}
            // view.loadUrl("https://docs.google.com/viewer?url=" + url);
               view.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + url);               
            } else {
                view.loadUrl(url);
            }
            return true;
        }

在这个 webview 中有一个 PDF 的点击事件。因此,如果我单击此 PDF 将不会加载

【问题讨论】:

  • 您确定 PDF 文件的链接中包含 .pdf 吗?您也可以在shouldOverrideUrlLoading 方法中设置断点,并使用调试自行检查问题所在。
  • 是的,它有.pdf。之后我静态添加了这个 PDF 字符串也不起作用

标签: android pdf webview


【解决方案1】:
view.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + url);

当我调用在 webview 中加载时,此方法调用对我有用。所以这个 webview 布局高度应该是 match_parent。

点击链接打开浏览器,然后像下面的代码一样简单地传递 URL。

 Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(url));
                startActivity(intent);

这解决了我的问题。

【讨论】:

    【解决方案2】:

    表示使用这些方法需要登录谷歌。

    其他方式使用pdf.js

    您必须将pdf文件保存到sdcard并在webview中加载。

    将 pdfjs 文件添加到您的资产目录

     else if (url.contains(".pdf"))
            {
               File file = new File(Environment.getExternalStorageDirectory() + "/test.pdf");
    
       view.loadUrl("file:///android_asset/pdfjs/web/viewer.html?file=" + file.getAbsolutePath() + "#zoom=page-width"); 
            }
    

    Full sample project

    【讨论】:

    • 最初我已将 URL 加载到 webview 中,然后在该 webview 中包含 PDF URL。因此,如果我单击该链接需要打开 PDF。从你的回答中我什么都不懂。
    • 你能解释一下吗??
    • 添加示例项目链接
    • pdfjs 页面在 webview 中渲染得很好……但 pdf 文件没有……任何线索?
    【解决方案3】:

    请检查以下示例代码以满足您的要求

    private void init()
    {
        WebView webview = (WebView) findViewById(R.id.webview);
        WebSettings settings = webview.getSettings();
        settings.setJavaScriptEnabled(true);
        webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    
        MyWebViewClient webViewClient = new MyWebViewClient(this, webview);
        webViewClient.loadUrl(YOUR_URL);
    }
    
    private class MyWebViewClient extends WebViewClient
    {
        private static final String TAG = "MyWebViewClient";
        private static final String PDF_EXTENSION = ".pdf";
        private static final String PDF_VIEWER_URL = "https://drive.google.com/viewerng/viewer?embedded=true&url=";
    
        private Context mContext;
        private WebView mWebView;
        private ProgressDialog mProgressDialog;
        private boolean isLoadingPdfUrl;
    
        public MyWebViewClient(Context context, WebView webView)
        {
            mContext = context;
            mWebView = webView;
            mWebView.setWebViewClient(this);
        }
    
        public void loadUrl(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 (url.contains("concierge@xxxx.com.sg"))
            {
                Intent eIntent = new Intent(android.content.Intent.ACTION_SEND);
                eIntent.setType("plain/text");
                eIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"xxxxxx"});
                eIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
                eIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Text to be send");
                startActivity(Intent.createChooser(eIntent, "Send mail..."));
                return true;
            }
            else if (url.startsWith("tel:"))
            {
                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
                startActivity(intent);
                return true;
            }
            else if (!isLoadingPdfUrl && isPdfUrl(url))
            {
                mWebView.stopLoading();
    
                final String pdfUrl = PDF_VIEWER_URL + url;
    
                new Handler().postDelayed(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        loadUrl(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;
        }
    }
    

    在 web 视图中查看用于处理重定向 url 和打开 PDF 而不下载的示例代码。 https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500

    【讨论】:

    猜你喜欢
    • 2012-05-18
    • 2018-05-20
    • 1970-01-01
    • 2015-12-09
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    相关资源
    最近更新 更多