web-dev-qa-db-fra.com

Android WebView ne charge pas une URL HTTPS

public void onCreate(Bundle savedInstance)
{       
    super.onCreate(savedInstance);
    setContentView(R.layout.show_voucher);
    webView=(WebView)findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setBuiltInZoomControls(true);
    String url ="https://www.paymeon.com/Vouchers/?v=%C80%8D%B1x%D9%CFqh%FA%84%C35%0A%1F%CE&iv=%25%EE%BEi%F4%DAT%E1"
    //webView.loadUrl(url); // Not Working... Showing blank
    webView.loadUrl("http://www.yahoo.com"); // its working    
}

Lorsque j'essaie de charger une URL dans WebBView, seul un écran vide apparaît. Si je charge Google.com ou Yahoo.com, cela fonctionne bien.

67
sumit

S'il vous plaît visitez ce lien:

Ajoutez cette méthode de substitution à votre implémentation WebViewClient. Vous devrez le compiler avec Android SDK 2.2 (API niveau 8) ou une version ultérieure. La méthode apparaît dans le SDK public à partir de la version 2.2 (API de niveau 8), mais nous l’avons testée sur des périphériques exécutant les versions 2.1, 1.6 et 1.5, et elle fonctionne également sur ces périphériques (le comportement a donc toujours été présent).

 @Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    handler.proceed(); // Ignore SSL certificate errors
}

cela vous aidera.

137
fargath

Par réponse correcte, voici un petit exemple de code qui pourrait aider.

Commencez par créer une classe qui étend WebViewClient et qui est configurée pour ignorer les erreurs SSL:

// SSL Error Tolerant Web View Client
private class SSLTolerentWebViewClient extends WebViewClient {

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed(); // Ignore SSL certificate errors
            }

}

Ensuite, avec votre objet d'affichage Web (initié dans la méthode OnCreate ()), définissez son client d'affichage Web comme une instance de la classe de substitution

 mWebView.setWebViewClient(
                new SSLTolerentWebViewClient()
        );
42
robnick

Pour gérer correctement la validation des certificats SSL et éviter le rejet des applications par Google conformément à la nouvelle stratégie de sécurité, modifiez votre code pour appeler SslErrorHandler.proceed () lorsque le certificat présenté par le serveur répond à vos attentes et appelez SslErrorHandler.cancel () sinon.

Par exemple, j’ajoute une boîte de dialogue d’alerte pour que l’utilisateur soit confirmé et semble que Google n’affiche plus d’avertissement.

    @Override
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    String message = "SSL Certificate error.";
        switch (error.getPrimaryError()) {
            case SslError.SSL_UNTRUSTED:
                message = "The certificate authority is not trusted.";
                break;
            case SslError.SSL_EXPIRED:
                message = "The certificate has expired.";
                break;
            case SslError.SSL_IDMISMATCH:
                message = "The certificate Hostname mismatch.";
                break;
            case SslError.SSL_NOTYETVALID:
                message = "The certificate is not yet valid.";
                break;
        }
        message += " Do you want to continue anyway?";

        builder.setTitle("SSL Certificate Error");
        builder.setMessage(message);
    builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.proceed();
        }
    });
    builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.cancel();
        }
    });
    final AlertDialog dialog = builder.create();
    dialog.show();
}

Après cela, aucun avertissement ne sera affiché.

27
Anant Shah

Supprimez le code ci-dessous, cela fonctionnera 

 super.onReceivedSslError(view, handler, error);
7
King of Masses

Pour gérer les URL SSL, utilisez la méthode onReceivedSslError () à partir de la classe WebViewClient. Voici un exemple:

 webview.setWebViewClient(new WebViewClient() {
              ...
              ...
              ...

            @Override
            public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
                String message = "SSL Certificate error.";
                switch (error.getPrimaryError()) {
                    case SslError.SSL_UNTRUSTED:
                        message = "The certificate authority is not trusted.";
                        break;
                    case SslError.SSL_EXPIRED:
                        message = "The certificate has expired.";
                        break;
                    case SslError.SSL_IDMISMATCH:
                        message = "The certificate Hostname mismatch.";
                        break;
                    case SslError.SSL_NOTYETVALID:
                        message = "The certificate is not yet valid.";
                        break;
                }
                message += "\"SSL Certificate Error\" Do you want to continue anyway?.. YES";

                handler.proceed();
            }

        });

Vous pouvez consulter mon exemple complet ici: https://github.com/Jorgesys/Android-WebView-Logging

 enter image description here

5
Elenasys

remplacer onReceivedSslError et supprimer 

super.onReceivedSslError (vue, gestionnaire, erreur)

Et pour résoudre la sécurité de Google:

setDomStorageEnabled (true);

Le code complet est:

webView.enableJavaScript();
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            // DOT CALL SUPER METHOD
            super.onReceivedSslError(view, handler, error);
        }
    });
4
FarshidABZ

J'ai suivi les réponses ci-dessus, mais cela ne semble toujours pas fonctionner pour moi. Le code ci-dessous a été un piège pour moi lors de l'intégration de passerelles de paiement qui sont généralement des requêtes https:

public class MainActivity extends Activity {

    WebView webView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.webView1);
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setDomStorageEnabled(true);
        webView.setWebViewClient(new MyWebViewClient());
        String postData = "amount=1000&firstname=mtetno&[email protected]&phone=2145635784&productinfo=Android&surl=success.php"
                + "&furl=failure.php&lastname=qwerty&curl=dsdsd.com&address1=dsdsds&address2=dfdfd&city=dsdsds&state=dfdfdfd&"
                + "country=fdfdf&zipcode=123456&udf1=dsdsds&udf2=fsdfdsf&udf3=jhghjg&udf4=fdfd&udf5=fdfdf&pg=dfdf";
        webView.postUrl(
                "http://Host/payment.php",
                EncodingUtils.getBytes(postData, "BASE64"));

    }

    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            webView.loadUrl(url);
            return true;
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler,
                SslError error) {
            handler.proceed();
        }
    }
}

Le code ci-dessus est en train de faire une demande de publication dans la visualisation Web et de le rediriger vers la passerelle de paiement.

Le réglage de settings.setDomStorageEnabled(true); m'a permis de réussir un tour

4
KOTIOS

Pour résoudre la sécurité Google, procédez comme suit:

Lignes vers le haut:

import Android.webkit.SslErrorHandler;
import Android.net.http.SslError;

Code:

class SSLTolerentWebViewClient extends WebViewClient {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        if (error.toString() == "piglet")
            handler.cancel();
        else
            handler.proceed(); // Ignore SSL certificate errors
    }
}
3
Ronen

Copiez et collez votre code de ligne bro, cela fonctionnera, faites-moi confiance :) Je pense, vous obtenez une erreur ssl. Si vous utilisez la méthode onReceivedSslError avec override et supprimez la méthode super it super. Il suffit d'écrire handler.proceed (), l'erreur sera résolue.

    webView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {

            activity.setTitle("Loading...");
            activity.setProgress(progress * 100);

            if (progress == 100)
                activity.setTitle(getResources().getString(R.string.app_name));
        }
    });

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.d("Failure Url :" , failingUrl);
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            Log.d("Ssl Error:",handler.toString() + "error:" +  error);
            handler.proceed();
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.loadUrl(Constant.VIRTUALPOS_URL + "token=" + Preference.getInstance(getContext()).getToken() + "&dealer=" + Preference.getInstance(getContext()).getDealerCode());
0
ozanurkan