programacion - WebView no muestra la página HTML local al iniciar la aplicación en Android 4.0.x Ice Cream Sandwich
manual android studio avanzado (3)
la vista web resulta ser en blanco (blanco) incluso si la URL está cargada (onPageFinished () se llama con éxito para la URL en cuestión).
Lo resolví usando mWebView.post()
Sé que esta pregunta se ha realizado en diferentes formatos en este foro, pero ninguna de las respuestas, aceptadas o no, que encontré allí me han ayudado hasta ahora.
Estoy trabajando en una aplicación híbrida que usa Android nativo, HTML y Adboe''s Flex SDK (sin ningún framework como PhoneGap, etc., código directo usando el propio WebView de Android).
Aquí está el problema que estoy enfrentando:
Cuando se lanza la aplicación, al principio se activa la actividad "AppEntry" para el sdk flexible, es una actividad en blanco que simplemente establece el contexto y las configuraciones iniciales para el SDK de flex. A continuación, se inicia la MainActivity nativa que utiliza una WebView para cargar el proyecto HTML. En Android 4.0.x (ICS) , la vista web resulta en blanco (blanco) incluso si se carga la URL (en la página se llama con éxito () para la URL en cuestión). Esto ocurre la primera vez que se instala y se inicia la aplicación, después de detenerla (quitándola de la barra de aplicaciones recientes), la página se carga como se esperaba. El relanzamiento repetido como este reproduce el problema a veces pero con una frecuencia impredecible.
Algunas cosas para consideración:
Debido a las restricciones de flex sdk, estos archivos HTML no se pueden almacenar directamente en la carpeta ''/ assets'', sino en una estructura de directorio contenida en la carpeta de activos.
¡El problema ocurre solo en Ice Cream Sandwich (problema conocido, supongo) !
Cosas que ya he probado:
- La aceleración de hardware está desactivada (activar / desactivar no importa, probado con ambos)
2.
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
settings.setSupportMultipleWindows(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setLoadsImagesAutomatically(true);
settings.setDomStorageEnabled(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
settings.setSaveFormData(true);
settings.setAllowFileAccess(true);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
settings.setAllowContentAccess(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
}
}
settings.setAppCacheEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setLoadsImagesAutomatically(true);
boolean enableZoom = true;
settings.setBuiltInZoomControls(enableZoom);
settings.setSupportZoom(enableZoom);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR_MR1) {
initializePluginAPI(webView);
}
settings.setDatabaseEnabled(true);
El problema está matando los comentarios de revisión de mi aplicación en Play Store. Cualquier ayuda o vision sería apreciada.
En Android 3.x - 4.0.x, WebView tiene un error muy crítico al cargar HTML local cuando la URL contiene un parámetro de consulta (?) O un anclaje (#). Este problema no se soluciona hasta Android 4.1. Debería aplicar WebView personalizado y WebViewClient. Here está el WebViewClient y el WebViewClient fijos.
Debería usar WebViewEx
y WebViewClientEx
lugar de WebView
y WebViewClient
, y también anular WebViewClientEx
como a continuación. This es la solución del miembro del proyecto Android.
webViewEx.setWebViewClient(new WebViewClientEx(getContext()) {
@Override
public boolean shouldOverrideUrlLoadingEx(WebView view, String url) {
boolean redirected = super.shouldOverrideUrlLoadingEx(view, url);
if (!redirected) {
if (url != null && URLUtil.isHttpUrl(url) || URLUtil.isHttpsUrl(url)) {
view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
redirected = true;
}
}
return redirected;
}
@Override
public WebResourceResponse shouldInterceptRequestEx(WebView view, String url) {
InputStream stream = inputStreamForAndroidResource(url);
if (stream != null) {
return new WebResourceResponse(null, null, stream);
}
return super.shouldInterceptRequestEx(view, url);
}
private InputStream inputStreamForAndroidResource(String url) {
final String ANDROID_ASSET = "file:///android_asset/";
if (url.startsWith(ANDROID_ASSET)) {
url = url.replaceFirst(ANDROID_ASSET, "");
try {
AssetManager assets = getContext().getAssets();
Uri uri = Uri.parse(url);
return assets.open(uri.getPath(), AssetManager.ACCESS_STREAMING);
} catch (IOException e) {
}
}
return null;
}
});
Si solo está por encima de 4.0, le recomendaría que agregue un permiso a su aplicación, ya que Android necesita esto para cargar el archivo de activos, de lo contrario, el comportamiento es intermitente.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />