简体   繁体   English

带有PDF加载的Android webview

[英]Android webview with PDF load

I am loading a page inside the webview 我正在webview中加载一个页面

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

then inside the webview I have several function to click event below 然后在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;
        }

in this webview there is a click event for PDF. 在此webview中有一个PDF的点击事件。 So if I click this the PDF not loading 所以如果我点击这个PDF没有加载

Please check the below example code for your requirement 请查看以下示例代码以了解您的要求

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

Checkout the example code for handling redirect urls and open PDF without download, in webview. 在webview中查看用于处理重定向网址的示例代码,无需下载即可打开PDF。 https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500 https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500

view.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + url);

This method call working for me, when I called to load inside the webview. 当我调用加载到webview内部时,这个方法调用对我有用。 So this webview layout height should be match_parent. 所以这个webview布局高度应该是match_parent。

Link click open the browser then simply pass the URL like below code. 链接点击打开浏览器,然后只需传递如下代码的URL。

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

This is solved my problem. 这解决了我的问题。

That the use of these methods need to log in to Google. 使用这些方法需要登录Google。

Other way use pdf.js 其他方式使用pdf.js

You must save pdf file into sdcard and load in webview. 您必须将pdf文件保存到SD卡中并加载到webview中。

Add the pdfjs files to your Assets directory 将pdfjs文件添加到Assets目录

 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 完整的示例项目

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM