Joe Winfield
Joe Winfield

Reputation: 829

Android WebView onReceivedError()

Does anyone know if there is a way to intercept a "page not found" or "page not loading error" in WebView?

According to the android documentation, onReceivedError() should be able to intercept. but i tested it in an app which I deleberately gave the wrong URL, and it didn't do anything.

I want my app to be able to give my own custom error message if the URL is ever unavailable for any reason.

this is the code that did nothing:

public void onReceivedError(WebView view, int errorCode,
        String description, String failingUrl) {

    // custom error handling ... show and alert or toast or something
}

Upvotes: 36

Views: 77760

Answers (4)

Smarpit
Smarpit

Reputation: 109

Remember use both onReceivedError methods because the method with the description parameter is deprecated. We use this deprecated method for below API 23 support. Hence we can use it in all SDK versions.

Here how I do it -

   webview.setWebViewClient(new WebViewClient() {


        @SuppressWarnings("deprecation")
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

            try {
                webview.stopLoading();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (webview.canGoBack()) {
                webview.goBack();
            }

            showkError();
        }

        @TargetApi(android.os.Build.VERSION_CODES.M)
        @Override
        public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
            // Redirect to deprecated method, so you can use it in all SDK versions
            try {
                webview.stopLoading();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (webview.canGoBack()) {
                webview.goBack();
            }

            showError();
        }

        @Override
        public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
            super.onReceivedHttpError(view, request, errorResponse);

            try {
                webview.stopLoading();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (webview.canGoBack()) {
                webview.goBack();
            }

            showError();
        }
  });

Upvotes: 1

Harsh Mittal
Harsh Mittal

Reputation: 3018

You should use this after the on Page finished

 @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error){
           //Your code to do
        Toast.makeText(getActivity(), "Your Internet Connection May not be active Or " + error , Toast.LENGTH_LONG).show();
    }

Upvotes: 2

R Earle Harris
R Earle Harris

Reputation: 983

I have tried using onReceivedError both inside shouldOverrideUrlLoading() and outside that method but in the WebViewClient. I even tried outside in the main Activity class. I was not happy with the inconsistent results. So I settled on using a test method, isOnline(), and calling that before calling loadUrl().

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getBaseContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo i = cm.getActiveNetworkInfo();
    if ((i == null) || (!i.isConnected())) {
        Toast toast = Toast.makeText(getBaseContext(),
                "Error: No connection to Internet", Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
        toast.show();
        return false;
    }
    return true;
}

Then this onReceivedError is in the WebViewClient but outside the overloadurlthingy method. This seems to consistently prevent the stupid, smirking-android error pages.

    @Override
    public void onReceivedError(WebView view, int errorCode,
            String description, String failingUrl) {
        if (view.canGoBack()) {
            view.goBack();
        }
        Toast toast = Toast.makeText(getBaseContext(), description,
                Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
        toast.show();
    }

Some people might consider this resource-heavy. Well, not heavy the way the Android Facebook and Google+ apps are. And not the way Google services are. I frankly don't mind using up a little of those apps oxygen. Call me a bad boy...

Upvotes: 13

androdevo
androdevo

Reputation: 752

According to documentation and my experience it should work quite fine. You just have to set your WebClient with overriden method onReceivedError in your WebView.

Here is the snippet from some of my old test app:

 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);
            super.onReceivedError(view, errorCode, description, failingUrl);
    }
 });

I've tested it and it works quite fine. Check your logs and see what kind of code error do you get. Hope it helps.

Upvotes: 34

Related Questions