Видео не воспроизводится в полноэкранном режиме

Я получаю NPE при попытке воспроизвести встроенное видео в веб-просмотре в полноэкранном режиме. Он отлично работает с сотами 3.0, но не с ICS 4.0+. Любая идея, как это можно решить?

java.lang.NullPointerException
    at android.webkit.PluginFullScreenHolder.show(PluginFullScreenHolder.java:85)
    at android.webkit.WebView$PrivateHandler.handleMessage(WebView.java:8849)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4424)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)

Любое предложение будет действительно оценено. Спасибо


person fdmirza    schedule 02.02.2012    source источник
comment
Если вы получаете трассировку стека Java, это ошибка Android. У вас может быть или не быть обходного пути, скорее всего, нет. Надеюсь, это будет исправлено в будущих версиях ICS.   -  person Mikko Ohtamaa    schedule 02.02.2012


Ответы (2)


Попробуйте добавить WebChromeClient в свой WebView:

webView.setWebChromeClient(new WebChromeClient());

Это должно остановить сбой (я думаю, что это похоже на то, что мы испытали), но я не думаю, что это заставит видео воспроизводиться в полноэкранном режиме.

Для этого, я думаю, вам придется сделать что-то вроде этого: -calls-hideall-method">Android ICS 4.0 Размещение Flash WebView в полноэкранном режиме вызывает метод hideAll? Что я все еще пытаюсь выяснить.

person selsine    schedule 23.05.2012

Проблема заключается в ошибке в ОС Android. Вам нужен обходной путь, чтобы решить эту проблему.
Я столкнулся с той же проблемой. Мне помог следующий обходной путь.
Надеюсь, это поможет некоторым людям:
Создайте 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;
        }
    }
}
person Lazy Ninja    schedule 23.05.2013