web-dev-qa-db-ja.com

Android WebViewがHTTPS URLをロードしていません

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    
}

WebBViewでURLをロードしようとすると、空白の画面しか表示されません。 Google.comまたはyahoo.comを読み込むと、正常に機能します。

78
sumit

このリンクをご覧ください:

このオーバーライドメソッドをWebViewClient実装に追加します。 Android SDK 2.2(APIレベル8)以降でコンパイルする必要があります。このメソッドは、2.2(APIレベル8)の時点でパブリックSDKに表示されますが、2.1、1.6、および1.5を実行するデバイスでテストし、それらのデバイスでも動作します(したがって、明らかに動作はずっと続いています)。

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

これはあなたを助けます。

144
fargath

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
            }

}

次に、Webビューオブジェクト(OnCreate()メソッドで開始)を使用して、Webビュークライアントをオーバーライドクラスのインスタンスに設定します。

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

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

この変更後、警告は表示されません。

33
Anant Shah

動作する以下のコードを削除します

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

onReceivedSslErrorをオーバーライドして削除します

super.onReceivedSslError(view、handler、error)

Googleのセキュリティを解決するには:

setDomStorageEnabled(true);

完全なコードは次のとおりです。

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

SSL URLを処理するには、WebViewClientクラスのメソッド onReceivedSslError() を使用します。これは例です。

 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

6
Jorgesys

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
    }
}
5
Ronen

私は上記の回答に従いましたが、通常は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();
        }
    }
}

上記のコードは、webviewで送信リクエストを実行し、支払いゲートウェイにリダイレクトしています。

settings.setDomStorageEnabled(true);を設定すると、私にとってはうまくいきました。

4
KOTIOS

あなたのコード行仲間をコピーして貼り付けてください、それは私を信頼して動作します:)私は考えています、あなたは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());
3
ozanurkan