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

时间:2015-08-28 09:00:04

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

我知道这个问题已经在这个论坛上以不同的格式提出,但没有一个答案 - 我接受的或其他方面的帮助到目前为止帮助了我。

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

这是我面临的问题:

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

需要考虑的一些事项:

  1. 由于flex sdk约束,这些HTML文件无法直接存储在'/ assets'文件夹中,而是存储在assets文件夹中的目录结构。

  2. 问题仅发生在Ice Cream Sandwich (known issue I guess)

  3. 我已经尝试过的东西:

    1. 硬件加速关闭(开/关无关紧要,两者都测试)
    2. 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商店中删除我的应用评论评论。任何帮助或见解将不胜感激。

3 个答案:

答案 0 :(得分:1)

  

即使加载了URL,webview也会变成空白(白色)(对于所讨论的URL,onPageFinished()被成功调用)。

我使用mWebView.post()

解决了这个问题

答案 1 :(得分:0)

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

'    static THD_WORKING_AREA(waRead5, 128);
static THD_FUNCTION(Thread5,arg) {
  chRegSetThreadName("th_Riempio_Buffer");
  msg_t charbuf;
  int count=0;
  uint8_t c;
  event_listener_t Uart1Data;

  eventmask_t flags;
chEvtRegisterMask((event_source_t *)chnGetEventSource(&SD1), &Uart1Data, EVENT_MASK(1));

  while (TRUE) {
       chEvtWaitOneTimeout(EVENT_MASK(1), MS2ST(10));
       chSysLock();
       flags =chEvtGetAndClearFlags(&Uart1Data);
      chSysUnlock();
       if (flags & CHN_INPUT_AVAILABLE)
                {
                   do
                   {
                     charbuf = chnGetTimeout(&SD1,TIME_IMMEDIATE);
                      if (charbuf != Q_TIMEOUT)
                             {
                         while((charbuf != '\n') && (count < 128)) {
                           sdWrite(&SD2, (uint8_t *)B3,4); // va bene
                            bufferMsg[count]= charbuf;
                                     count++;
                                   }
                                }
                             }
                   while (charbuf != Q_TIMEOUT);
                }
      }
}
'

答案 2 :(得分:0)

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