web-dev-qa-db-fra.com

Android WebView onReceivedError ()

Quelqu'un sait-il s'il existe un moyen d'intercepter une "page non trouvée" ou une "erreur de chargement de la page" dans WebView?

Selon la documentation Android Android, onReceivedError() devrait être en mesure d'intercepter. Mais je l'ai testé dans une application que j'ai délibérément donné la mauvaise URL, et cela n'a rien fait .

Je souhaite que mon application puisse afficher mon propre message d'erreur personnalisé si l'URL n'est jamais disponible pour une raison quelconque.

c'est le code qui n'a rien fait:

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

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

Selon la documentation et mon expérience, cela devrait fonctionner très bien. Il vous suffit de définir votre WebClient avec la méthode surchargée onReceivedError dans votre WebView.

Voici l'extrait de certaines de mes anciennes applications de test:

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

Je l'ai testé et cela fonctionne très bien. Vérifiez vos journaux et voyez quel type d'erreur de code obtenez-vous. J'espère que cela aide.

29
androdevo

J'ai essayé d'utiliser onReceivedError à la fois à l'intérieur de shouldOverrideUrlLoading () et à l'extérieur de cette méthode, mais dans WebViewClient. J'ai même essayé à l'extérieur dans la classe d'activité principale. Je n'étais pas satisfait des résultats incohérents. J'ai donc décidé d'utiliser une méthode de test, isOnline (), et d'appeler cela avant d'appeler 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;
}

Ensuite, cette onReceivedError se trouve dans le WebViewClient mais en dehors de la méthode overloadurlthingy. Cela semble empêcher systématiquement les pages d'erreur Android stupides et narquoises.

    @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();
    }

Certaines personnes pourraient considérer que cette ressource est lourde. Eh bien, pas lourd comme les applications Android Facebook et Google+. Et pas comme les services Google. Franchement, cela ne me dérange pas d'utiliser un peu de ces applications oxygène. Appelez-moi un mauvais garçon...

11
R Earle Harris

N'oubliez pas d'utiliser les deux méthodes onReceivedError car la méthode avec le paramètre de description est obsolète. Nous utilisons cette méthode obsolète pour la prise en charge de l'API 23 ci-dessous. Par conséquent, nous pouvons l'utiliser dans toutes les versions du SDK.

Voici comment je le fais -

   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();
        }
  });
0
Smarpit Singh