Android WebView не загружает URL-адрес HTTPS - PullRequest
74 голосов
/ 14 сентября 2011
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    
}

Когда я пытаюсь загрузить URL в WebBView, он показывает только пустой экран.Если я загружаю Google.com или yahoo.com, он работает нормально.

Ответы [ 9 ]

144 голосов
/ 22 ноября 2011

Пожалуйста, перейдите по этой ссылке:

Добавьте этот переопределяющий метод в вашу реализацию WebViewClient.Вам нужно будет скомпилировать его с Android SDK 2.2 (уровень API 8) или выше.Этот метод появляется в общедоступном SDK начиная с версии 2.2 (уровень API 8), но мы проверили его на устройствах под управлением 2.1, 1.6 и 1.5, и он работает на этих устройствах тоже (поэтому, очевидно, поведение было там все время).*

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

это поможет вам.

45 голосов
/ 30 декабря 2013

За правильный ответ от fargth следует небольшой пример кода, который может помочь.

Сначала создайте класс, расширяющий WebViewClient и настроенный на игнорирование ошибок 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
            }

}

Затем с вашим объектом веб-представления (инициируемым в методе OnCreate ()) установите его клиент веб-представления в качестве экземпляра класса переопределения:

 mWebView.setWebViewClient(
                new SSLTolerentWebViewClient()
        );
31 голосов
/ 15 июля 2016

Чтобы правильно обрабатывать проверку SSL-сертификата и избежать отклонения приложения от Google в соответствии с новой политикой безопасности, измените свой код так, чтобы он вызывал SslErrorHandler.proceed () всякий раз, когда сертификат, представленный сервером, соответствует вашим ожиданиям, и в противном случае вызывайте SslErrorHandler.cancel ().

Например, я добавляю диалоговое окно с предупреждением, чтобы пользователь подтвердил, и кажется, что Google больше не показывает предупреждение.

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

После этих изменений предупреждение не будет отображаться.

10 голосов
/ 29 февраля 2016

Удалите приведенный ниже код, он будет работать

 super.onReceivedSslError(view, handler, error);
6 голосов
/ 15 мая 2018

переопределить onReceivedSslError и удалить

super.onReceivedSslError (просмотр, обработчик, ошибка)

И для решения безопасности Google:

setDomStorageEnabled (истина);

Полный код:

webView.enableJavaScript();
**webView.getSettings().setDomStorageEnabled(true);**
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            // DO NOT CALL SUPER METHOD
            <strike>super.onReceivedSslError(view, handler, error);</strike>
        }
    });
6 голосов
/ 24 апреля 2017

Для обработки SSL URL-адресов метод onReceivedSslError () из класса WebViewClient. Это пример:

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

        });

Вы можете проверить мой полный пример здесь: https://github.com/Jorgesys/Android-WebView-Logging

enter image description here

4 голосов
/ 23 февраля 2015

Я следовал за ответами выше, но все же он, кажется, не работает для меня, код ниже помог мне при интеграции платежных шлюзов, которые обычно представляют собой запросы 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=mttee@gmail.com&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();
        }
    }
}

Выше кода выполняет почтовый запрос в веб-просмотре и перенаправляет на платежный шлюз.

Настройка settings.setDomStorageEnabled(true); сделала трюк для меня Надеюсь, это поможет.

3 голосов
/ 04 декабря 2017

Чтобы решить проблему безопасности Google, сделайте следующее:

Строки наверх:

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

Код:

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
    }
}
1 голос
/ 25 января 2019

Скопируйте и вставьте строку кода, братан, она будет работать, поверьте мне :) Я думаю, вы получите ошибку ssl.Если вы используете метод переопределения onReceivedSslError и удаляете super, это метод super.Просто напишите handler.proceed (), ошибка решит.

    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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...