Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Videos not playing in fullscreen mode

I am getting a NPE when trying to play embeded video in webview in FULLSCREEN. It is working fine with 3.0 honeycomb but not with ICS 4.0+. Any idea how this can be resolved?

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)

Any suggestion will be really appreciated. Thanks

like image 810
fdmirza Avatar asked Feb 02 '12 07:02

fdmirza


People also ask

Why can't I watch videos in full screen mode?

Sometimes a YouTube page will load incorrectly, causing graphical issues in the process. If this is the reason you're encountering a full-screen error, pressing the F5 key or clicking the "Refresh" button will reload the YouTube page and fix the problem. Try using full-screen mode while Chrome isn't maximized.

Why does full screen not work on Chrome?

An outdated version of Chrome can also cause full screen on Chrome not working. So, you can go to check whether you are using the latest version of Chrome. You can click the three-dot menu and then go to Settings > About Chrome to check whether it is up-to-date. If not, you need to upgrade it to the latest version.


2 Answers

Try adding a WebChromeClient to your WebView:

webView.setWebChromeClient(new WebChromeClient());

That should stop the crash (I think it's similar to what we were experiencing) but I don't think it will get the video to play in full screen.

To do that I think you will have to do something like this: Android ICS 4.0 Placing Flash WebView into full screen calls hideAll Method? Which I am still trying to figure out.

like image 69
selsine Avatar answered Oct 04 '22 12:10

selsine


The problem is a bug in android OS. You need a work around to resolve this problem.
I was facing the same problem. The following work around worked for me.
Hope this will help some people:
Create the FullscreenableChromeClient and add this line:

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;
        }
    }
}
like image 36
Lazy Ninja Avatar answered Oct 03 '22 12:10

Lazy Ninja