Android WebView не загружает 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
}
Когда я пытаюсь загрузить URL-адрес в WebBView, он показывает только пустой экран. Если я загружаю Google.com или yahoo.com, он работает нормально.
Ответы
Ответ 1
Пожалуйста, перейдите по этой ссылке:
Добавьте этот метод переопределения в реализацию 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
}
это поможет вам.
Ответ 2
В правильном ответе с помощью 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()
);
Ответ 3
Чтобы правильно обрабатывать 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();
}
После этого изменения не будут отображаться предупреждения.
Ответ 4
Удалите приведенный ниже код, который будет работать
super.onReceivedSslError(view, handler, error);
Ответ 5
переопределить 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);
}
});
Ответ 6
Для обработки 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]()
Ответ 7
Чтобы решить проблему безопасности 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
}
}
Ответ 8
Я следил за ответами выше, но все же, похоже, что это не работает для меня, ниже код помогло, когда вы интегрировали способы оплаты, которые обычно являются 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);
сделала трюк для меня
Надеюсь, это поможет.
Ответ 9
Скопируйте и вставьте строку кода, братан, она будет работать, поверьте мне :) Я думаю, вы получите ошибку ssl. Если вы используете переопределить метод onReceivedSslError и удалите метод super it 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());