在 Android 4.0.x Ice Cream Sandwich 中,WebView 不会在应用启动时呈现本地 HTML 页面
Posted
技术标签:
【中文标题】在 Android 4.0.x Ice Cream Sandwich 中,WebView 不会在应用启动时呈现本地 HTML 页面【英文标题】:WebView does not render local HTML page on app launch in Android 4.0.x Ice Cream Sandwich 【发布时间】:2015-11-22 21:17:31 【问题描述】:我知道这个问题已经在这个论坛上以不同的形式提出过,但到目前为止,没有一个答案对我有帮助——无论是接受的还是我发现的其他答案。
我正在开发一个使用原生 android、html 和 Adboe 的 Flex SDK 的混合应用程序(没有任何框架,如 PhoneGap 等,使用 Android 自己的 WebView 的简单代码)。
这是我面临的问题:
当应用程序启动时,首先触发 flex sdk 的 Activity"AppEntry",它是一个空白 Activity,它只是为 flex SDK 设置上下文和初始设置。接下来,启动原生 MainActivity,它使用 WebView 加载 HTML 项目。 在 Android 4.0.x (ICS) 上,即使 URL 已加载(为相关 URL 成功调用 onPageFinished()),webview 也显示为空白(白色)。这发生在第一次安装和启动应用程序时,在停止应用程序(通过从最近的应用程序栏中删除它)后,页面按预期加载。像这样反复重新启动有时会重现问题,但频率不可预测。
一些需要考虑的事情:
由于 flex sdk 的限制,这些 HTML 文件不能直接存储在“/assets”文件夹中,而是包含在 assets 文件夹中的目录结构中。
问题仅出现在 Ice Cream Sandwich (known issue I guess)!
我已经尝试过的东西:
-
硬件加速已关闭(开启/关闭无关紧要,两者都经过测试)
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 商店中杀死我的应用的评论 cmets。任何帮助或见解将不胜感激。
【问题讨论】:
我不确定如何将 Android 与 AIR 和 Flex SDK 混合使用,但您可以尝试使用 AIR html 控件,然后嵌入 HTML 文件,然后从中动态创建一个字符串并设置如果使用 HTML 加载器实例,则使用 webview 的 htmlText 或 loadString。 它实际上不仅仅是一个 HTML 页面,而是一个完整的 HTML 应用程序。它对除 Android 4.0.x 以外的版本按预期工作。因此,我正在寻找 4.0 (ICS) 的修复程序。 尝试在 500 毫秒(或类似的时间)后使用postDelayed
调用加载 webview。这看起来像一个加载/同步问题,稍后加载网络内容可能会解决它。
settings.setPluginsEnabled(true);
?
我想,您或许可以尝试一下自定义标签:android-developers.blogspot.com/2015/09/…,希望对您更好。
【参考方案1】:
即使加载了 URL(onPageFinished() 已为相关 URL 成功调用),webview 也显示为空白(白色)。
我通过使用mWebView.post()
解决了它
【讨论】:
【参考方案2】:如果它仅高于 4.0,我建议您向应用程序添加权限,因为 Android 需要此权限来加载资产文件,否则行为是间歇性的。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
【讨论】:
【参考方案3】:在 Android 3.x - 4.0.x 中,当 url 包含查询参数 (?) 或锚点 (#) 时,WebView 在加载本地 HTML 时有一个非常严重的错误。这个问题直到 Android 4.1 才解决。您应该应用自定义 WebView 和 WebViewClient。 Here是固定的WebView和WebViewClient。
您应该使用WebViewEx
和WebViewClientEx
而不是WebView
和WebViewClient
,并像下面一样覆盖WebViewClientEx
。 This 是 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;
);
【讨论】:
以上是关于在 Android 4.0.x Ice Cream Sandwich 中,WebView 不会在应用启动时呈现本地 HTML 页面的主要内容,如果未能解决你的问题,请参考以下文章