it-swarm.it

Android WebView non sta caricando un 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    
}

Quando provo a caricare un URL in WebBView mostra solo uno schermo vuoto. Se carico Google.com o yahoo.com, funziona correttamente.

67
sumit

Si prega di visitare questo link:

Aggiungi questo metodo di sovrascrittura all'implementazione di WebViewClient. Dovrai compilarlo con Android SDK 2.2 (livello API 8) o successivo. Il metodo appare nell'SDK pubblico a partire dal 2.2 (livello API 8) ma lo abbiamo testato su dispositivi con 2.1, 1.6 e 1.5 e funziona anche su quei dispositivi (quindi ovviamente il comportamento è sempre stato presente).

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

questo ti aiuterà.

137
fargath

Per risposta corretta da parte di fargth, segue un piccolo esempio di codice che potrebbe essere d'aiuto.

Innanzitutto, creare una classe che estenda WebViewClient e che sia impostata per ignorare gli errori 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
            }

}

Quindi, con l'oggetto vista Web (avviato nel metodo OnCreate ()), impostare il client di visualizzazione Web come un'istanza della classe di sovrascrittura:

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

Per gestire correttamente la convalida dei certificati SSL ed evitare il rifiuto dell'applicazione da parte di Google in base alla nuova politica di sicurezza, modificare il codice per richiamare SslErrorHandler.proceed () ogni volta che il certificato presentato dal server soddisfa le proprie aspettative e invocare SslErrorHandler.cancel () in caso contrario.

Ad esempio, aggiungo una finestra di avviso per confermare l'utente e Google sembra non mostrare più alcun avviso.

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

Dopo questa modifica non mostrerà un avvertimento.

27
Anant Shah

Rimuovere il codice qui sotto funzionerà 

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

Per gestire gli URL SSL, il metodo onReceivedSslError () della classe WebViewClient, Questo è un esempio:

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

        });

Puoi controllare il mio esempio completo qui: https://github.com/Jorgesys/Android-WebView-Logging

 enter image description here

5
Elenasys

override onReceivedSslError e remove 

super.onReceivedSslError (visualizzazione, gestore, errore)

E per risolvere la sicurezza di Google:

setDomStorageEnabled (true);

Il codice completo è:

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

Ho seguito le risposte di cui sopra ma ancora sembra non funzionare per me sotto codice ha fatto un trucco per me quando si integrano i gateway di pagamento che di solito sono richieste 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();
        }
    }
}

Sopra codice sta facendo una richiesta di posta in webview e reindirizzamento al gateway di pagamento.

Impostare settings.setDomStorageEnabled(true); ha fatto un trucco per me Spero che questo aiuti.

4
KOTIOS

Per risolvere la sicurezza di Google, fai questo:

Linee verso l'alto:

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

Codice:

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

Copia e incolla la tua riga di codice bro, funzionerà con fiducia in me :) sto pensando, ottieni un errore ssl. Se si utilizza il metodo override onReceivedSslError e si rimuove super è il metodo super. Basta scrivere handler.proceed (), l'errore risolverà.

    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