2015-08-28 90 views
34

So che questa domanda è stata richiesta in diversi formati su questo forum, ma nessuna delle risposte - accettata o meno che ho trovato lì ha aiutato io fino ad ora.WebView non esegue il rendering della pagina HTML locale all'avvio dell'app su Android 4.0.x Ice Cream Sandwich

Sto lavorando a un'app ibrida che utilizza Android nativo, HTML e Flex SDK di Adboe (senza alcun framework come PhoneGap ecc., Codice semplice che utilizza la propria WebView di Android).

Ecco il problema che sto affrontando:

Quando l'applicazione viene avviata, in un primo momento l'attività "AppEntry" per l'SDK Flex è attivato, è un'attività vuoto che definisce semplicemente il contesto e impostazioni iniziali per Flex SDK. Successivamente, viene avviato il programma nativo MainActivity che utilizza una WebView per caricare il progetto HTML. Su Android 4.0.x (ICS), la visualizzazione Web risulta vuota (bianca) anche se l'URL è stato caricato (onPageFinished() viene chiamato correttamente per l'URL in questione). Ciò accade la prima volta che l'app viene installata e avviata, dopo aver arrestato l'app (rimuovendola dalla barra delle applicazioni recenti), la pagina viene caricata come previsto. Ripetuti rilanci come questo riproducono il problema a volte ma con frequenza imprevedibile.

Alcune cose da tenere in considerazione:

  1. a causa di vincoli di Flex SDK, questi file HTML non possono essere memorizzati direttamente nella cartella '/ attività', ma una struttura di directory contenute all'interno della cartella asset.

  2. Il problema si verifica solo su Ice Cream Sandwich (known issue I guess)!

Roba che ho già provato:

  1. accelerazione hardware è spento (on/off non importa, testati con entrambi)

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

Il problema sta uccidendo i commenti di revisione della mia app sul Play Store. Qualsiasi aiuto o intuizione sarebbe apprezzato.

+0

io non sono sicuro di come sia possibile mescolare Android con AIR e Flex SDK, ma si potrebbe provare a utilizzare il controllo AIR html e poi incorporare il file HTML e quindi la creazione di una stringa da quel modo dinamico e l'impostazione del htmlText di la visualizzazione Web o usa loadString se si utilizza un'istanza del caricatore HTML. –

+0

In realtà non è una singola pagina HTML ma un'intera applicazione HTML. Funziona come previsto per le versioni ad eccezione di Android 4.0.x. Pertanto sto cercando una correzione per 4.0 (ICS). –

+5

Prova a caricare la webview 500 millisecondi (o qualcosa di simile) in seguito utilizzando una chiamata 'postDelayed'. Questo sembra un problema di carico/sincronizzazione, il caricamento del contenuto web un po 'più tardi potrebbe risolverlo. –

risposta

0

Se è solo superiore a 4.0 di quanto consiglierei di aggiungere un permesso alla propria applicazione poiché Android ha bisogno di questo per caricare il file delle risorse, il comportamento è intermittente.

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

il WebView risulta essere vuoto (bianco) anche pensato l'URL viene caricato (onPageFinished() viene chiamato con successo per l'URL in questione).

ho risolto con l'uso mWebView.post()

0

In Android 3.x - 4.0.x, WebView ha un bug molto critico sul caricamento HTML quando URL contenente parametro di query o ancora (#) locale (?). Questo problema non è stato risolto fino a Android 4.1. È necessario applicare WebView personalizzato e WebViewClient. Here è il WebView fisso e WebViewClient.
È necessario utilizzare WebViewEx e WebViewClientEx anziché WebView e WebViewClient e anche sostituire WebViewClientEx come di seguito. This è una soluzione alternativa per il membro del progetto 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; 
    } 
});