티스토리 뷰

안드로이드 웹뷰로 동영상 화면 확대 / 축소 기능이 있어 WebChromeClient를 상속받아 작업을 하였는데

동영상 전체화면에서 축소기능 선택을 해도 동영상 화면이 축소가 안되고

web에 fullscreenChange listener에 이벤트가 발생하지 않는 문제가 있었네요.

 

유튜브에서는 문제가 없는데

개발하고 있는 페이지에 문제가 있다고 생각했으나,

담당자 분께서 확인해 주셨는데 화면 하단의 navigation bar가 동영상 컨트롤 부분위에 위치해서 이벤트가

발생하지 않는것으로 확인해주셨습니다.

 

동영상 축소 안되는 문제는 navigation bar를 안보이게 처리하고 진행하기로 하였네요.

 

    @Override
    public void onShowCustomView(View view, CustomViewCallback callback) {
        if (mCustomView != null) {
            callback.onCustomViewHidden();
            return;
        }


        ......
        
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decor.setSystemUiVisibility(uiOptions);

onShowCustomView에 decor에 화면 관련 속성을 변경하여 navigation bar를 숨겼습니다.

 

그리고 앱이 세로화면 고정으로 사용중이라

동영상 전체화면일 때에 세로 화면에 동영상 전체화면이 보이는 문제가 있어

동영상 확대/축소일때에 화면 가로/세로 전환 기능을 추가하였습니다.

 

이 코드는 setFullscreen에 추가하여 확대/축소 설정을 하였습니다.

    private void setFullscreen(boolean enabled) {

        if (enabled) {
            this.mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        } else {
            this.mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        
        ......
    }

 

이렇게 하여 동영상 재생 기능은 마무리 되면 좋겠네요.

 

아래는 WebChromeClient 상속받은 파일 전체 내용입니다.

public class FullScreenableChromeClient extends WebChromeClient {
    private Activity mActivity;

    private View mCustomView;
    private WebChromeClient.CustomViewCallback mCustomViewCallback;
    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, CustomViewCallback callback) {
        if (mCustomView != null) {
            callback.onCustomViewHidden();
            return;
        }

        FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();
        mFullscreenContainer = new FullscreenHolder(mActivity);
        mFullscreenContainer.addView(view, COVER_SCREEN_PARAMS);
        decor.addView(mFullscreenContainer, COVER_SCREEN_PARAMS);

        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decor.setSystemUiVisibility(uiOptions);

        mCustomView = view;
        setFullscreen(true);
        mCustomViewCallback = callback;

        super.onShowCustomView(view, callback);
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback) {
        this.onShowCustomView(view, 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();
    }

    private void setFullscreen(boolean enabled) {
        if (enabled) {
            this.mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        } else {
            this.mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }

        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);
            }
        }
        win.setAttributes(winParams);
    }

    private static class FullscreenHolder extends FrameLayout {
        public FullscreenHolder(Context ctx) {
            super(ctx);
            setBackgroundColor(ContextCompat.getColor(ctx, android.R.color.black));
        }
//        @Override
//        public boolean onTouchEvent(MotionEvent evt) {
//            return true;
//        }
    }
}

'안드로이드' 카테고리의 다른 글

인앱 업데이트  (0) 2022.11.25
Activity 높이 변경  (1) 2022.09.26
Volley를 이용한 이미지(?) 파일 업로드  (0) 2022.05.13
ContentResolver 파일경로 가져오기  (0) 2022.05.03
안드로이드 log4j 적용  (0) 2022.01.27