【问题标题】:WebView does not render local HTML page on app launch in Android 4.0.x Ice Cream Sandwich在 Android 4.0.x Ice Cream Sandwich 中,WebView 不会在应用启动时呈现本地 HTML 页面
【发布时间】: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 也显示为空白(白色)。这发生在第一次安装和启动应用程序时,在停止应用程序(通过从最近的应用程序栏中删除它)后,页面按预期加载。像这样反复重新启动有时会重现问题,但频率不可预测。

一些需要考虑的事情:

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

  2. 问题仅出现在 Ice Cream Sandwich (known issue I guess)!

我已经尝试过的东西:

  1. 硬件加速已关闭(开启/关闭无关紧要,两者都经过测试)

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/…,希望对您更好。

标签: android apache-flex webview android-webview android-4.0-ice-cream-sandwich


【解决方案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,并像下面一样覆盖WebViewClientExThis 是 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;
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-02
        相关资源
        最近更新 更多