Flash Player вылетает при попытке войти в полноэкранный режим Android 4.0 - PullRequest
2 голосов
/ 29 декабря 2011

Итак, я создал приложение для Android, которое воспроизводит видео с blip.tv и других веб-сайтов с поддержкой Flash.Я использую Webview для отображения видео.Вот мой код:

try{
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);


        view = new WebView(this);
        view.getSettings().setPluginsEnabled(true);
        view.getSettings().setPluginState(WebSettings.PluginState.ON);

        view.getSettings().setJavaScriptEnabled(true);
        view.getSettings().setLoadWithOverviewMode(true);
        view.getSettings().setUseWideViewPort(true);
        view.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        view.setScrollbarFadingEnabled(true);


        // get the html code
        String html = getIntent().getStringExtra("VIDEO_CONTENT");

        view.loadData(html, "text/html", null);
        setContentView(view);
    }
    catch(Exception e){

    }

Проблема с android 4 (Ice Cream Sandwich).Когда я пытаюсь перевести приложение в полноэкранный режим, оно вылетает.Однако приложение НЕ вылетает на Android 2.3 или 3.0.Есть идеи, чтобы это исправить?

Ответы [ 3 ]

4 голосов
/ 08 февраля 2012

Это происходит в ICS, потому что метод show() в android.webkit.PluginFullScreenHolder вызывается при попытке перейти в полноэкранный режим. Этот метод делает следующее:

WebChromeClient client = mWebView.getWebChromeClient();
client.onShowCustomView(mLayout, mOrientation, mCallback);

Если вы не установите WebChromeClient на WebView, вы получите NPE.

Это исправило наш сбой, однако WebView исчезает и полноэкранное видео не отображается.

См .: Android ICS 4.0 Размещение Flash WebView в полноэкранных вызовах hideAll Method?

*** Обновление:

В конечном счете, чтобы заставить WebView воспроизводить флэш-видео в полноэкранном режиме, мне пришлось реализовать метод onShowCustomView() в моем WebChromeClient способом, аналогичным тому, что было сделано в исходном коде для Android браузер. Реализация этого метода, который я использовал для вдохновения, была в классе BaseUI:

https://github.com/android/platform_packages_apps_browser/blob/master/src/com/android/browser/BaseUi.java

Я не до конца понимаю, что здесь происходит. Мне также хотелось бы, чтобы я понял, почему разработчики на ICS решили требовать реализации этого метода. Хотелось бы знать ценность или какую проблему это решило. В прошлых версиях этот полноэкранный режим «просто работал», теперь он требует много копаний.

2 голосов
/ 10 мая 2013

Я столкнулся с той же проблемой.Я спросил и получил следующий ответ, который мне подходит.
Надеюсь, это поможет некоторым людям:
Создайте FullscreenableChromeClient и добавьте эту строку:

WebView.setWebChromeClient( new FullscreenableChromeClient(this));


    public class FullscreenableChromeClient extends WebChromeClient {
        protected Activity mActivity = null;

        private View mCustomView;
        private WebChromeClient.CustomViewCallback mCustomViewCallback;
        private int mOriginalOrientation;

        private FrameLayout mContentView;
        private FrameLayout mFullscreenContainer;

        private static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

        public FullscreenableChromeClient(Activity activity) {
            this.mActivity = activity;
        }

        @Override
        public void onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                if (mCustomView != null) {
                    callback.onCustomViewHidden();
                    return;
                }

                mOriginalOrientation = mActivity.getRequestedOrientation();
                FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();
                mFullscreenContainer = new FullscreenHolder(mActivity);
                mFullscreenContainer.addView(view, COVER_SCREEN_PARAMS);
                decor.addView(mFullscreenContainer, COVER_SCREEN_PARAMS);
                mCustomView = view;
                setFullscreen(true);
                mCustomViewCallback = callback;
                mActivity.setRequestedOrientation(requestedOrientation);
            }

            super.onShowCustomView(view, requestedOrientation, callback);
        }

        @Override
        public void onHideCustomView() {
            if (mCustomView == null) {
                return;
            }

            setFullscreen(false);
            FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();
            decor.removeView(mFullscreenContainer);
            mFullscreenContainer = null;
            mCustomView = null;
            mCustomViewCallback.onCustomViewHidden();
            mActivity.setRequestedOrientation(mOriginalOrientation);
        }

        private void setFullscreen(boolean enabled) {
            Window win = mActivity.getWindow();
            WindowManager.LayoutParams winParams = win.getAttributes();
            final int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN;
            if (enabled) {
                winParams.flags |= bits;
            } else {
                winParams.flags &= ~bits;
                if (mCustomView != null) {
                    mCustomView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
                } else {
                    mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
                }
            }
            win.setAttributes(winParams);
        }

        private static class FullscreenHolder extends FrameLayout {
            public FullscreenHolder(Context ctx) {
                super(ctx);
                setBackgroundColor(ctx.getResources().getColor(android.R.color.black));
            }

            @Override
            public boolean onTouchEvent(MotionEvent evt) {
            return true;
        }
    }
}
1 голос
/ 19 января 2012

Хорошо, я думаю, что это проблема Android 4.0.2 / флэш-плеера, потому что другие приложения, такие как browser и dolphin mini, аварийно завершают работу, когда вспышка переводится в полноэкранный режим.

...