flex cos'è - WebView non esegue il rendering della pagina HTML locale all'avvio dell'app su Android 4.0.x Ice Cream Sandwich




guida xamarin (4)

So che questa domanda è stata fatta in diversi formati su questo forum, ma nessuna delle risposte - accettate o meno che ho trovato mi hanno aiutato finora.

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

Ecco il problema che sto affrontando:

Quando l'app viene avviata, inizialmente viene avviata l'attività "AppEntry" per Flex sdk, un'attività vuota che semplicemente imposta il contesto e le impostazioni iniziali per Flex SDK. Successivamente, viene avviato il MainActivity nativo che utilizza una WebView per caricare il progetto HTML. Su Android 4.0.x (ICS) , la webview risulta vuota (bianca) anche se l'URL è stato caricato (onPageFinished () è 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 considerare:

  1. A causa dei limiti di flex sdk, questi file HTML non possono essere archiviati direttamente nella cartella '/ assets' ma una struttura di directory contenuta all'interno della cartella delle risorse.

  2. Il problema si verifica solo su Ice Cream Sandwich (noto problema credo) !

Cose che ho già provato:

  1. L'accelerazione hardware è disattivata (l'attivazione / disattivazione non è importante, testata 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.


Answers

la webview risulta essere vuota (bianca) anche se l'URL è stato caricato (onPageFinished () è chiamato con successo per l'URL in questione).

L'ho risolto usando mWebView.post()


Se è solo superiore alla 4.0 di quanto consiglierei di aggiungere un'autorizzazione alla tua 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" />

In Android 3.x - 4.0.x, WebView ha un bug molto critico sul caricamento dell'HTML locale quando url contiene il parametro query (?) O ancora (#). 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 invece di WebView e WebViewClient e anche sovrascrivere 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;
    }
});

È un permesso dell'utente:

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




android flex webview android-webview android-4.0