android - 초기화 - 안드로이드 웹뷰 팝업창




WebView는 Android 4.0.x에서 실행되는 앱에서 로컬 HTML 페이지를 렌더링하지 않습니다. Ice Cream Sandwich (2)

나는이 질문이이 포럼에서 다른 형식으로 질문을 받았음을 알고있다. 그러나 내가 찾은 대답이나 받아 들여지지 않은 답변은 지금까지 나를 도왔다.

나는 네이티브 안드로이드, HTML 및 Adboe의 Flex SDK를 사용하는 하이브리드 응용 프로그램 (PhoneGap 등의 프레임 워크없이 Android의 WebView를 사용하는 간단한 코드)을 개발하고 있습니다.

내가 직면 한 문제는 다음과 같습니다 .

앱이 시작되면 flex sdk에 대한 "AppEntry" 활동이 시작되고 간단히 컨텍스트와 Flex SDK의 초기 설정을 지정하는 빈 활동입니다. 그런 다음 WebView를 사용하여 HTML 프로젝트를로드하는 기본 MainActivity 가 시작됩니다. Android 4.0.x (ICS) 에서 URL이로드되었다고해도 webview는 공백 (흰색)으로 나타납니다 (onPageFinished ()가 해당 URL에 대해 성공적으로 호출 됨). 이것은 응용 프로그램이 설치되고 실행될 때 발생합니다. 응용 프로그램을 중지 한 후 (최근 응용 프로그램 막대에서 제거하여) 페이지가 예상대로로드됩니다. 이렇게 다시 시작하면 반복적으로 문제가 재현되지만 예측할 수없는 빈도로 재생됩니다.

고려해야 할 사항 :

  1. flex sdk 제약으로 인해 이러한 HTML 파일은 '/ assets'폴더에 직접 저장할 수 없으며 assets 폴더에 포함 된 디렉토리 구조에 저장할 수 있습니다.

  2. Ice Cream Sandwich에서만 문제가 발생합니다 (알려진 문제) .

이미 시도한 것들 :

  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 스토어에서 내 앱의 리뷰 댓글을 죽이는 것입니다. 어떤 도움이나 통찰력도 인정 될 것입니다.


webview는 URL이로드되었다고 생각하더라도 (흰색) 공백으로 표시됩니다 (onPageFinished ()가 해당 URL에 대해 성공적으로 호출 됨).

나는 mWebView.post() 를 사용하여 그것을 해결했다.


Android 3.x - 4.0.x에서 WebView는 검색어 매개 변수 (?) 또는 앵커 (#)가 포함 된 URL의 경우 로컬 HTML로드시 매우 중대한 버그가 있습니다. 이 문제는 Android 4.1에서만 해결됩니다. 사용자 지정 WebView 및 WebViewClient를 적용해야합니다. Here 은 고정 된 WebView 및 WebViewClient입니다.
WebViewWebViewClientEx 대신 WebViewExWebViewClientEx 를 사용해야 WebViewEx 아래처럼 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;
    }
});




android-4.0