如何仅从 WebViewClient 的新 onReceivedError 中的主页检测错误

How to detect errors only from the main page in new onReceivedError from WebViewClient

上下文

在 Android SDK 23 中,onReceivedError(WebView view, int errorCode, String description, String failingUrl) 已被弃用并替换为 onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)。但是根据 documentation:

Note that unlike the deprecated version of the callback, the new version will be called for any resource (iframe, image, etc), not just for the main page

问题

我们有一个应用程序,在已弃用的 onReceivedError 方法中有一段代码可以显示本机视图,而不是让用户在 WebView 中看到错误。

我们想用新方法替换已弃用的 onReceivedError 方法。但是我们不想显示任何资源错误的本机视图,只显示主页。

问题

我们如何在新的 onReceivedError 中识别错误不是来自主页?

PS 1:我们宁愿没有像 这样的解决方案来存储主要的 url 并检查失败的 url.

PS 2:如果解决方案只是使用已弃用的方法,那么如何保证新的 Android 版本仍会调用它?

WebResourceRequest 具有适用于您的方案的 isForMainFrame() 方法,从 API 版本 21 开始可用:

来源:https://developer.android.com/reference/android/webkit/WebResourceRequest.html

您不必存储原件 URL。您可以从传递给 onReceivedError 方法的 WebView 中获取它。用户看到的始终是当前页面的完整 URL。因此,您不必担心它们会导航到不同的页面。

@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
    if (request.getUrl().toString().equals(view.getUrl())) {
        notifyError();
    }
}

您可以像代码一样使用:

    WebView wv = (WebView) findViewById(R.id.webView);
     wv.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Log.i("WEB_VIEW_TEST", "error code:" + errorCode);
// here your custom logcat like as share preference or database or static varible.
                super.onReceivedError(view, errorCode, description, failingUrl);
        }
     });

祝你好运!