【问题标题】:Error- Loading PDF from URL inside android Webview错误-从 android Webview 中的 URL 加载 PDF
【发布时间】:2019-11-26 13:10:48
【问题描述】:

我正在尝试从 Web 视图中的 URL 加载 PDF 文件,而不在 android 中下载。大多数时候它的加载很完美,但有时会出现下面提到的错误。

错误:1

 ERROR:gles2_cmd_decoder.cc(2787)] [GroupMarkerNotSet(crbug.com/242999)!:B0F7473971000000] GL ERROR :GL_INVALID_FRAMEBUFFER_OPERATION : BackFramebuffer::Create: <- error from previous GL command

错误:2

validate_display:99 error 3008 (EGL_BAD_DISPLAY)

代码片段:

init() 方法在 On-create 内部调用

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(
                "YOUR URL for Loading PDF");
}

PdfWebViewClient.java

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

【问题讨论】:

  • 我无法得到错误是怎么回事,但不要使用 webview 来查看图像或 pdf 其他东西,这会占用太多内存。你最好使用原生库视图来显示 pdf

标签: android webview android-webview


【解决方案1】:

有时缓冲区问题与缓存溢出有关。尝试将webview.clearCache(true) 添加到您的代码中。

更新:

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

    PdfWebViewClient pdfWebViewClient = new PdfWebViewClient(this, webview);
    pdfWebViewClient.loadPdfUrl(
            "YOUR URL for Loading PDF");

}

【讨论】:

    【解决方案2】:

    您实际上可以使用this great library 在您的应用中通过 URL 查看 PDF。

    【讨论】:

    • 是在下载 PDF 吗?
    • 不,但如果你愿意,你可以
    • @Kumar 等一下,很抱歉误导您这是一个库,您可以在其中查看设备中已经存在的 PDF,因此首先,您需要使用该 URL 下载 pdf并可以使用这个库查看它
    • @Kumar 如果你愿意,我可以添加代码如何下载和文件并在 PDF 查看器中查看
    • 我不想将任何 PDF 文件下载到我的设备中,只需要从 URL 加载到 webveiw
    猜你喜欢
    • 2015-12-09
    • 2020-02-13
    • 2020-07-21
    • 2012-05-18
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2016-07-18
    相关资源
    最近更新 更多