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:
- Detectar el error de carga de recursos de la webview de android
- La precarga de Webview de Android no funciona con Nexus
- Android: vista web dentro del cuadro de diálogo o emergente
- No se puede cargar el archivo HTML local en Android WebView
- Geolocalización en Webview (Android 6.0)
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(); }
- Anulación de la barra de acciones contextuales predeterminada para la selección de texto (en WebView) en Android
- Android: Cómo comprobar la carga exitosa de url al usar webview.loadUrl
- Cargando jQuery desde activos locales en Android para una página html remota
- Androide WebView - contenido no editable
- El teclado de Android WebView oculta el campo de entrada en el fragmento en android
- Android WebView getContentHeight () siempre devuelve 0
- Android WebView no cargar contenido mixto
- Los datos no se cargan en WebView pero se cargan después de bloquear - desbloquear el dispositivo
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!
- ClearableEditText – requestLayout () incorrectamente llamado en Android 4.3
- ¿Puedo portar mis aplicaciones de python existentes en ASE?