Error en Webview con targetSdkVersion 24

Mi aplicación tiene un WebView que carga una página HTML simple con un iFrame que se utiliza para cargar una URL para el proceso de pago de una empresa asociada (y no tengo acceso a esa fuente de url).

Cuando targetSdkVersion el targetSdkVersion a 19 todo funciona bien y puedo hacer pagos a través del iFrame. Sin embargo, cuando la targetSdkVersion se señala a 24 no tengo la misma suerte.

En ese caso, el WebView arregla para cargar el iFrame que se muestra con algunos EditText para introducir con información de tarjeta de crédito y un Button para enviarlo, pero siempre tengo un error 500 cuando hago clic en ese botón.

Dado que la URL de pago es externalizada, llegué a nuestra empresa asociada para conocer el origen del error 500. Y me dijeron que el error proviene de una llamada doble que me hace pensar que algo en el WebView de api 24 lo está haciendo.

Impresión del error 500: Introduzca aquí la descripción de la imagen

El archivo HTML payment_html es el siguiente:

 <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> </head> <body id="bodyContent" onload="addListener()" style="margin:0px;padding:0px;overflow:hidden;height:355px"> <iframe id="ifrPagamento" src="partner_url" frameborder="0" style="overflow:hidden;width:100%;height:100%"></iframe> </body> <script type="text/javascript"> function addListener() { window.addEventListener("message", receiveMessage, false); } function receiveMessage(message) { if (message) { var data = JSON.parse(message.data); if (data.code) { if(data.code === "0") { app.returnStatus(0); } else { app.returnStatus(1); } } } } </script> </html> 

El partner_url es reemplazado por el URL de la empresa asociada y lo obtengo dinámicamente como abajo:

 private void loadPage() { String url = (String) Session.getObject(Session.Key.PARTNER_URL, ""); InputStream inputStream = mActivity.getResources().openRawResource(R.raw.payment_html); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); try { int i = inputStream.read(); while (i != -1) { byteArrayOutputStream.write(i); i = inputStream.read(); } inputStream.close(); String html = byteArrayOutputStream.toString(); html = html.replace("partner_url", url); mWebView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null); } catch (IOException e) { Funcoes.printError(e.getMessage()); } } 

He fijado el WebView arriba como el siguiente:

 private void setupWebView() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); } WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setSupportMultipleWindows(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); webSettings.setAllowUniversalAccessFromFileURLs(true); webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); webSettings.setAppCacheEnabled(false); webSettings.setDomStorageEnabled(true); mWebView.setWebChromeClient(new WebChromeClient()); mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); mWebView.addJavascriptInterface(new MyJavaScriptInterface(mActivity), "app"); mWebView.setWebViewClient(new WebViewClient() { @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { view.loadUrl(request.getUrl().toString()); return true; } }); } 

Y finalmente el layout.xml :

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="10dp" android:paddingBottom="10dp" android:background="@color/white"> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none"> </WebView> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:visibility="gone"/> </RelativeLayout> 

Como he dicho antes, no tengo la fuente de la url porque es externalizar. Así que no puedo compartirlo.

He estado luchando con este problema por un par de semanas. ¿Alguien puede ayudarme?

2 Solutions collect form web for “Error en Webview con targetSdkVersion 24”

Después de unas semanas, me enteré de este https://developer.android.com/about/versions/android-5.0-changes.html#BehaviorWebView que explica los cambios de api 21. Eche un vistazo a la parte de WebView que dice:

Si su aplicación funciona con API de nivel 21 o posterior:

  • El sistema bloquea el contenido mixto y las cookies de terceros de forma predeterminada. Para permitir contenido mixto y cookies de terceros, utilice los métodos
    SetMixedContentMode () y setAcceptThirdPartyCookies (), respectivamente.

Por lo tanto, sólo agregó estas configuraciones en WebView y funcionó perfectamente.

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webSettings.setMixedContentMode(MIXED_CONTENT_ALWAYS_ALLOW); CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true); } 

Para aplicaciones orientadas al nivel JELLY_BEAN_MR1 de API y superiores, sólo los métodos públicos que se anotan con JavascriptInterface se pueden acceder desde JavaScript. Para aplicaciones orientadas al nivel de API JELLY_BEAN o inferior, se puede acceder a todos los métodos públicos (incluidos los heredados) …

// Código

@RequiresApi (api = Build.VERSION_CODES.M) @Override public void onReceivedError (vista WebView, solicitud WebResourceRequest, error WebResourceError) {super.onReceivedError (vista, solicitud, error); Log.d (TAG, error.getErrorCode () + ":" + error.getDescription ()); }

 @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); Log.d(TAG, failingUrl + "\t" + errorCode + ": " + description); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { super.onReceivedHttpError(view, request, errorResponse); Log.d(TAG, String.valueOf(errorResponse.getStatusCode())); } 
  • Pantalla Splash mientras carga una url en una vista web en la aplicación Android
  • El video IFRAME incorporado sigue reproduciéndose en segundo plano después de salir de la pantalla completa en Android
  • Videos que no se reproducen en modo de pantalla completa
  • Rendimiento de la vista web de Android a bitmap, html5 javascript, problema de devolución de llamada
  • Inicio y fin de solicitudes de registro HTTP desde WebView incorporado de Android
  • No más Text Reflow después de ampliar KitKat WebView
  • Vista web de Android en Unity3d (C #)
  • Reproducción de archivos de audio locales en la aplicación de visualización web de Android
  • ¿Cómo detengo Flash después de dejar un WebView?
  • Android Talkback no lee caracteres utf-8 en la vista Web usando html
  • La navegación privada está obsoleta en Android WebView desde la API 17. ¿Cuál es la alternativa?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.