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
}
Cuando intento cargar una URL en WebBView, solo muestra una pantalla en blanco. Si cargo Google.com o yahoo.com, funciona bien.
android
webview
https
android-webview
sumitir
fuente
fuente
Respuestas:
Por favor visite este enlace:
Agregue este método primordial a su implementación de WebViewClient. Deberá compilarlo con Android SDK 2.2 (API nivel 8) o posterior. El método aparece en el SDK público a partir de 2.2 (API nivel 8) pero lo hemos probado en dispositivos que ejecutan 2.1, 1.6 y 1.5 y también funciona en esos dispositivos (por lo que obviamente el comportamiento ha estado ahí todo el tiempo).
@Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); // Ignore SSL certificate errors }
Esto te ayudara.
fuente
Your app(s) listed at the end of this email have an unsafe implementation of the WebViewClient.onReceivedSslError handler. Specifically, the implementation ignores all SSL certificate validation errors, making your app vulnerable to man-in-the-middle attacks.
Apps with vulnerabilities that expose users to risk of compromise may be considered Dangerous Products in violation of the Content Policy and section 4.4 of the Developer Distribution Agreement.
Por respuesta correcta por fargth, a continuación se muestra una pequeña muestra de código que podría ayudar.
Primero, cree una clase que amplíe WebViewClient y que esté configurada para ignorar los errores de 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 } }
Luego, con su objeto de vista web (iniciado en el método OnCreate ()), configure su cliente de vista web para que sea una instancia de la clase de anulación:
mWebView.setWebViewClient( new SSLTolerentWebViewClient() );
fuente
Para manejar correctamente la validación del certificado SSL y evitar el rechazo de aplicaciones de Google de acuerdo con la nueva Política de seguridad, cambie su código para invocar SslErrorHandler.proceed () siempre que el certificado presentado por el servidor cumpla con sus expectativas, e invoque SslErrorHandler.cancel () de lo contrario.
Por ejemplo, agrego un cuadro de diálogo de alerta para que el usuario haya confirmado y parece que Google ya no muestra una advertencia.
@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(); }
Después de estos cambios, no mostrará ninguna advertencia.
fuente
Elimine el siguiente código, funcionará
super.onReceivedSslError(view, handler, error);
fuente
anular onReceivedSslError y eliminar
Y para solucionar la seguridad de Google:
El código completo es:
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); } });
fuente
Copie y pegue su línea de código hermano, funcionará, confíe en mí :) Estoy pensando, obtiene un error ssl. Si usa override onReceivedSslError método y elimina super es super método. Simplemente escriba handler.proceed (), el error se resolverá.
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());
fuente
onReceivedSslError
save my dayPara manejar URLs SSL, el método onReceivedSslError () de la clase WebViewClient, este es un ejemplo:
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(); } });
Puede consultar mi ejemplo completo aquí: https://github.com/Jorgesys/Android-WebView-Logging
fuente
Para resolver la seguridad de Google, haga esto:
Líneas al principio:
import android.webkit.SslErrorHandler; import android.net.http.SslError;
Código:
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 } }
fuente
Seguí las respuestas anteriores, pero aún parece que no me funciona a continuación, el código me hizo un truco al integrar las vías de pago, que generalmente son solicitudes 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(); } } }
El código anterior está haciendo una solicitud de publicación en la vista web y redirigiendo a la pasarela de pago.
La configuración me
settings.setDomStorageEnabled(true);
hizo un truco Espero que esto ayude.fuente
webview.getSettings.setDomStorageEnabled(true);
mágicamente funcionó. Tal vez la página web esté usando algún tipo de API HTML 5, por lo que habilitar DomStorage funcionó para mí.El enfoque recomendado será
1. No llame al súper método (elimine la súper llamada del método anulado)
2.Google recomienda llamar al método SslErrorHandler.cancel () si surge algún error
3. Cuadro de diálogo No preguntar para exponer errores de SSL
¿Cuál es la mejor solución? Eliminar este método de anulación
@Override public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) { }
fuente
Establecer estas dos propiedades fue suficiente para que me funcionara y no me expone a problemas de seguridad:
WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true);
fuente
Utilice esta línea webview.getSettings (). SetDomStorageEnabled (true) en su código java
WebView webView = (WebView) findViewById(R.id.webview); webView.getSettings().setDomStorageEnabled(true); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webView.loadUrl(yourUrl);
fuente
En caso de que desee utilizar el APK fuera de Google Play Store, por ejemplo, una solución privada como la siguiente probablemente funcionará:
@Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { /*...*/ handler.proceed(); }
En caso de que desee agregar una capa de seguridad opcional adicional, puede intentar hacer uso de la fijación de certificados . En mi humilde opinión, esto no es necesario para uso privado o interno.
Si planeas publicar la aplicación en Google Play Store, debes evitar @Override onReceivedSslError (...) {...}. Especialmente haciendo uso de handler.proceed (). Google encontrará este fragmento de código y rechazará su aplicación con seguridad, ya que la solución con handler.proceed () suprimirá todo tipo de mecanismos de seguridad integrados .
En mi caso, la cadena de certificados SSL se rompió. Puede probar rápidamente estos problemas con SSL Checker o más intermedio con SSLLabs . Pero, por favor, no me pregunten cómo puede suceder esto. No tengo la menor idea.
De todos modos, después de reinstalar el certificado SSL, todos los errores relacionados con el " certificado SSL que no es de confianza en WebView " desaparecieron finalmente. También eliminé @Override para onReceivedSslError (...) y me deshice de handler.proceed () , y voila, mi aplicación no fue rechazada por Google Play Store (nuevamente).
fuente