在 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 【问题描述】:

我知道这个问题已经在这个论坛上以不同的形式提出过,但到目前为止,没有一个答案对我有帮助——无论是接受的还是我发现的其他答案。

我正在开发一个使用原生 androidhtml 和 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。 您应该使用WebViewExWebViewClientEx 而不是WebViewWebViewClient,并像下面一样覆盖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 页面的主要内容,如果未能解决你的问题,请参考以下文章

tyvj1117 拯救ice-cream

Ice Cream Tower

hdu 2121 Ice_cream’s world II

E. Sonya and Ice Cream(开拓思维)

Ice_cream’s world III//最小生成树kruskal

Problem D. Ice Cream Tower