Подтвердить что ты не робот

WebView не отображает локальную HTML-страницу при запуске приложения в Android 4.0.x Ice Cream Sandwich

Я знаю, что этот вопрос задавался в разных форматах на этом форуме, но ни один из ответов, принятых или не найденных мной, помог мне до сих пор.

Я работаю над гибридным приложением, которое использует собственные андроиды, HTML и Adboe Flex SDK (без каких-либо фреймворков, таких как PhoneGap и т.д., простой код с использованием собственного веб-браузера Android).

Здесь проблема, с которой я сталкиваюсь:

Когда приложение запускается, сначала запускается действие "AppEntry" для flex sdk, это пустая деятельность, которая просто устанавливает контекст и начальные настройки для Flex SDK. Затем запускается собственный MainActivity, который использует WebView для загрузки проекта HTML. В Android 4.0.x(ICS) веб-просмотр оказывается пустым (белый), даже если URL-адрес загружен (onPageFinished() успешно вызван для данного URL-адреса). Это происходит при первом запуске приложения и его запуске после остановки приложения (удалив его из панели последних приложений), страница загружается, как ожидалось. Повторное повторное запуски, как это, иногда воспроизводит проблему, но с непредсказуемой частотой.

Некоторые вещи для рассмотрения:

  • Из-за ограничений flex sdk эти HTML файлы не могут быть сохранены непосредственно в папке "/assets", но структура каталогов содержится в папке с ресурсами.

  • Проблема возникает только на Ice Cream Sandwich (известная проблема, я думаю)!

Что я уже пробовал:

  • Аппаратное ускорение выключено (включение/выключение не имеет значения, проверено с обоими)

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

Проблема заключается в том, что я убил комментарии к просмотру приложения в магазине воспроизведения. Любая помощь или понимание будут оценены.

4b9b3361

Ответ 1

веб-просмотр оказывается пустым (белый), даже считается, что URL-адрес загружен (onPageFinished() успешно вызван для рассматриваемого URL-адреса).

Я решил это с помощью mWebView.post()

Ответ 2

Если его только выше 4.0, чем я, я бы порекомендовал вам добавить разрешение на ваше приложение, так как Android нужно, чтобы загрузить файл с файлами другого поведения, является прерывистым.

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

Ответ 3

В Android 3.x - 4.0.x WebView имеет очень критическую ошибку при загрузке локального HTML, когда url содержит параметр запроса (?) или anchor (#). Эта проблема не устранена до Android 4.1. Вы должны применять пользовательские WebView и WebViewClient. Здесь - фиксированный WebView и WebViewClient.
Вы должны использовать WebViewEx и WebViewClientEx вместо WebView и WebViewClient, а также переопределить WebViewClientEx, как показано ниже. Это является обходным элементом участника проекта 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;
    }
});