Detecting Webview Error and Show Message

后端 未结 6 1730
鱼传尺愫
鱼传尺愫 2020-12-04 22:07

I\'d like to show an error message when there is an error loading a webview page (No connection). This is what I have so far, without the error handling code:



        
相关标签:
6条回答
  • 2020-12-04 22:21
    public class WebClient extends WebViewClient {
    
        @Override
        @TargetApi(Build.VERSION_CODES.M)
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
            final Uri uri = request.getUrl();
            handleError(view, error.getErrorCode(), error.getDescription().toString(), uri);
        }
    
        @SuppressWarnings("deprecation")
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            final Uri uri = Uri.parse(failingUrl);
            handleError(view, errorCode, description, uri);
        }
    
        private void handleError(WebView view, int errorCode, String description, final Uri uri) {
            final String host = uri.getHost();// e.g. "google.com"
            final String scheme = uri.getScheme();// e.g. "https"
            // TODO: logic
        }
    }
    
    0 讨论(0)
  • 2020-12-04 22:25

    in onReceivedError methode handle like below

    @SuppressWarnings("deprecation")
    @Override
    public void onReceivedError(WebView view, int errorCode, String description,        String failingUrl) {
        handleError(errorCode,view);
    }
    
    @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
        onReceivedError(view, rerr.getErrorCode(),rerr.getDescription().toString(),req.getUrl().toString());
    
    }
    

    HandleError methode below

    public static void handleError(int errorCode, WebView view) {
        
        String message = null;
        if (errorCode == WebViewClient.ERROR_AUTHENTICATION) {
            message = "User authentication failed on server";
        } else if (errorCode == WebViewClient.ERROR_TIMEOUT) {
            message = "The server is taking too much time to communicate. Try again later.";
        } else if (errorCode == WebViewClient.ERROR_TOO_MANY_REQUESTS) {
            message = "Too many requests during this load";
        } else if (errorCode == WebViewClient.ERROR_UNKNOWN) {
            message = "Generic error";
        } else if (errorCode == WebViewClient.ERROR_BAD_URL) {
            message = "Check entered URL..";
        } else if (errorCode == WebViewClient.ERROR_CONNECT) {
            message = "Failed to connect to the server";
        } else if (errorCode == WebViewClient.ERROR_FAILED_SSL_HANDSHAKE) {
            message = "Failed to perform SSL handshake";
        } else if (errorCode == WebViewClient.ERROR_HOST_LOOKUP) {
            message = "Server or proxy hostname lookup failed";
        } else if (errorCode == WebViewClient.ERROR_PROXY_AUTHENTICATION) {
            message = "User authentication failed on proxy";
        } else if (errorCode == WebViewClient.ERROR_REDIRECT_LOOP) {
            message = "Too many redirects";
        } else if (errorCode == WebViewClient.ERROR_UNSUPPORTED_AUTH_SCHEME) {
            message = "Unsupported authentication scheme (not basic or digest)";
        } else if (errorCode == WebViewClient.ERROR_UNSUPPORTED_SCHEME) {
            message = "unsupported scheme";
        } else if (errorCode == WebViewClient.ERROR_FILE) {
            message = "Generic file error";
        } else if (errorCode == WebViewClient.ERROR_FILE_NOT_FOUND) {
            message = "File not found";
        } else if (errorCode == WebViewClient.ERROR_IO) {
            message = "The server failed to communicate. Try again later.";
        }
        if (message != null) {
            Toast.makeText(getActivity(), "" + message, Toast.LENGTH_LONG).show();
        }
    }
    
    0 讨论(0)
  • 2020-12-04 22:26

    You're most of the way there... Just implement onReceivedError and handle the errors that you want.

    0 讨论(0)
  • 2020-12-04 22:26

    Updated answer as per API 23 Marshmallow

    WebViewClient Errors Handling

        /*
         * Added in API level 23 replacing :-
         *
         * onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
        */
        @Override
        public void onReceivedError(WebView view, WebResourceRequest request,
                WebResourceError error) {
    
            Toast.makeText(getActivity(),
                    "WebView Error" + error.getDescription(),
                    Toast.LENGTH_SHORT).show();
    
            super.onReceivedError(view, request, error);
    
        }
    
        /*
          Added in API level 23
        */
        @Override
        public void onReceivedHttpError(WebView view,
                WebResourceRequest request, WebResourceResponse errorResponse) {
    
            Toast.makeText(getActivity(),
                    "WebView Error" + errorResponse.getReasonPhrase(),
                    Toast.LENGTH_SHORT).show();
    
    
            super.onReceivedHttpError(view, request, errorResponse);
        }
    

    Network Error Handling

            webView.loadUrl(urlToLoad);
    
            if (!isConnected(getActivity())) {
                Toast.makeText(getActivity(), "You are offline ", Toast.LENGTH_SHORT).show();
    
            }
    
         /**
         * Check if there is any connectivity
         * 
         * @param context
         * @return is Device Connected
         */
        public static boolean isConnected(Context context) {
    
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
    
            if (null != cm) {
                NetworkInfo info = cm.getActiveNetworkInfo();
    
                return (info != null && info.isConnected());
            }
            return false;
        }
    
    0 讨论(0)
  • 2020-12-04 22:33

    Add this after onpagefinished :

        public void onReceivedError(WebView view, int errorCod,String description, String failingUrl) {
                Toast.makeText(Webform.this, "Your Internet Connection May not be active Or " + description , Toast.LENGTH_LONG).show();
            }
    

    Don't forget to import android.widget.Toast;

    0 讨论(0)
  • 2020-12-04 22:38

    All answer above are deprecated. You should use this code after 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.getDescription(), Toast.LENGTH_LONG).show();
        }
    
    0 讨论(0)
提交回复
热议问题