在Android 4.0.x Ice Cream Sandwich中,WebView不会在应用程序启动时呈现本地HTML页面

我知道这个问题已经在这个论坛上以不同的格式被提出,但是没有任何答案被接受,或者我在那里find的答案都没有帮助我。

我正在使用原生android,HTML和Adboe的Flex SDK(没有任何像PhoneGap等框架,使用Android自己的WebView的简单代码)的混合应用程序。

这是我面临的问题:

当应用程序启动时,首先触发flex sdk的活动“AppEntry” ,这是一个空白的活动,它只是为flex SDK设置上下文和初始设置。 接下来,启动使用WebView加载HTML项目的本机MainActivity在Android 4.0.x(ICS)上 ,甚至认为URL已加载(onPageFinished()被调用成功的URL ,webview变成空白(白色)。 这发生在第一次安装和启动应用程序后,停止应用程序(通过从最近的应用程序栏中删除),页面按预期方式加载。 像这样反复重新启动有时会重现问题,但频率不可预知。

有些事情需要考虑:

  1. 由于flex sdk约束,这些HTML文件不能直接存储在“/ assets”文件夹中,而是存储在资产文件夹中的目录结构。

  2. 问题只发生在冰淇淋三明治(我猜的已知问题) !

我已经尝试过的东西:

  1. 硬件加速closures(开/关并不重要,两者都testing)

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); 

这个问题正在杀死我的应用在Play商店的评论评论。 任何帮助或见解,将不胜感激。

即使认为URL已加载(web页面已成功调用onPageFinished()),webview变成空白(白色)。

我解决了它通过使用mWebView.post()

如果它只有4.0以上,我会build议你添加一个权限给你的应用程序,因为Android需要这个来加载资产文件,否则行为是间歇性的。

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

在Android 3.x – 4.0.x中,当包含查询参数(?)或锚点(#)的url时,WebView在加载本地HTML时存在非常严重的错误。 这个问题直到Android 4.1才能解决。 您应该应用自定义的WebView和WebViewClient。 这里是固定的WebView和WebViewClient。
您应该使用WebViewExWebViewClientEx而不是WebViewWebViewClient ,并像下面一样覆盖WebViewClientEx 。 这是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; } });