El caché de WebView no funciona en Android 4.4

He estado trabajando en una aplicación que almacena en caché una imagen de la web y la muestra incluso cuando el usuario está fuera de línea. Esto funcionó bastante bien hasta que salió Android 4.4. Ahora, todo lo que veo es un error "No se puede cargar la página web". Supongo que podría tener que hacer algo con el hecho de que Kitkat utiliza Chromium para cargar las webviews, pero no estoy muy seguro. ¿Alguna corrección para esto?

Aquí está mi código:

mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); mWebView.setWebViewClient(new MyWebViewClient()); mWebViewSettings = mWebView.getSettings(); mWebViewSettings.setJavaScriptEnabled(true); mWebViewSettings.setAllowFileAccess(true); mWebViewSettings.setAppCacheEnabled(true); if (Build.VERSION.SDK_INT < 18) mWebViewSettings.setAppCacheMaxSize(5 * 1024 * 1024); // 5MB mWebViewSettings.setLoadsImagesAutomatically(true); mWebViewSettings.setAppCachePath(getActivity().getApplicationContext() .getCacheDir().getAbsolutePath()); mWebViewSettings.setBuiltInZoomControls(true); if(Build.VERSION.SDK_INT<=18) mWebViewSettings.setDefaultZoom((WebSettings.ZoomDensity.FAR)); mWebViewSettings.setUseWideViewPort(true); mWebViewSettings.setLoadWithOverviewMode(true); 

Lo estoy cargando usando el siguiente código:

 if (NetworkUtil.IS_ONLINE_WITH_DATA_CONNECTION) { MyPrefs = getActivity().getSharedPreferences( "AHSelectionPreffs", Context.MODE_PRIVATE); Date CAMPUS_MAP_LAST_UPDATE_DATE = new Date(); String CAMPUS_MAP_LAST_UPDATE_DATE_STRING = MyPrefs .getString("CAMPUS_MAP" + String.valueOf(StorageHelper.ID), null); SimpleDateFormat simpleDateFormatter = new SimpleDateFormat( "EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); if (CAMPUS_MAP_LAST_UPDATE_DATE_STRING != null) { try { CAMPUS_MAP_LAST_UPDATE_DATE = simpleDateFormatter .parse(CAMPUS_MAP_LAST_UPDATE_DATE_STRING); } catch (ParseException e1) { e1.printStackTrace(); System.out.println("Cant format date!!!!"); } int n = (int) ((curDate.getTime() - CAMPUS_MAP_LAST_UPDATE_DATE .getTime()) / (1000 * 60 * 60)); if (n < 24 * UPDATE_DURATION_IN_DAYS) { mWebView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK); } else { updateCampusMapData(); } } else { updateCampusMapData(); } } else { mWebView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK); } if (StorageHelper.campus_map_link.Mobile_Link_URL != null) { mWebView.loadUrl(StorageHelper.campus_map_link.Mobile_Link_URL); } private void updateCampusMapData() { mWebView.getSettings().setCacheMode( WebSettings.LOAD_NO_CACHE); MyPrefs = getActivity().getSharedPreferences( "AHSelectionPreffs", Context.MODE_PRIVATE); SharedPreferences.Editor editor = MyPrefs.edit(); editor.putString("CAMPUS_MAP" + String.valueOf(StorageHelper.ID), curDate.toString()); editor.commit(); } 

Lo he resuelto yo mismo. Me di cuenta de que Chromium no es el almacenamiento en caché de imágenes con un tamaño superior a 1 MB. En otros casos, funciona perfectamente bien. Informó esto a Google, por ahora.

Sí, esto se debe a los siguientes problemas:

http://code.google.com/p/android/issues/detail?id=63501 (necesita ser reabierto! Cc Rahulrit)

http://code.google.com/p/chromium/issues/detail?id=240043

Algunos Hacks:

1> si está utilizando su propio servidor cambiar la implementación del servidor web para MultipartCache tal que las imágenes se almacenarán como parte por parte, Esta no es la solución correcta darle una oportunidad!

2> Otra solución es guardar todo el archivo HTML en el almacenamiento como este (no recomendado)

 // saving page from web to file File file = new File(this.getExternalFilesDir(null), "fileName.html"); FileUtils.copyURLToFile(new URL("http://www.bmimobile.co.uk/why-bmi.php"), file); // loading saved file in webview webview.loadUrl("file://" + file.getPath()); 

Crédito: Nazar Merza

Nota: ¡Todas estas soluciones no son la solución del 100% al problema antedicho! Podemos considerar esto como una solución temporal!

  • Agregar una barra de progreso en WebView
  • "Acción completa usando" al intentar cargar en un WebView
  • ¿Cuál es la diferencia entre LOAD_DEFAULT y LOAD_NORMAL para WebSettings?
  • ¿Por qué no Webview de Android verifica la caché por defecto?
  • Permitir llamadas ajax remotas en una vista Web de Android + móvil jquery
  • cómo mostrar la vista web como OverviewMode (completamente alejado) en android? ¿cómo?
  • ¿Cómo mostraría una vista como una superposición de otra?
  • Android: WebView mejora la velocidad de carga de los archivos html locales
  • Activar / desactivar el zoom en Android WebView
  • Error de parpadeo de WebView de Android al animar la vista en el dispositivo
  • Android: WebView shouldInterceptRequest no agregar RequestProperties en el WebView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.