안드로이드 4.0 이후에서는 WebView에서 유튜브나 플래시 동영상의 전체화면 모드 사용시 NullPointerException이 발생합니다. 이를 해결하기 위해서는 WebView에 WebChromeClient 를 설정해주어야 합니다.
하지만 단순히 기본 WebChromeClient 객체를 생성하여 WebView에 설정할 경우 오류는 발생하지 않지만 영상이 정상적으로 재생이 안되는 문제가 있습니다.
전체화면 모드가 제대로 작동되게 하려면 아래와 같이 WebChromeClient 클래스를 상속받은 클래스를 만든 후 이를 WebView에 설정하면 됩니다.
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; } } }
_mWebView.setWebChromeClient(new FullscreenableChromeClient(this));
출처 : http://stackoverflow.com/questions/12398565/android-ics-flash-webview-full-screen-throws-nullpointerexception
'모바일프로그래밍 > Android' 카테고리의 다른 글
WebView 안의 콘텐츠(이미지, 동영상) 폰 화면에 맞추기 (2) | 2012.11.16 |
---|---|
Android Compile시 string.xml 관련 is not translated in ... Lint 에러 해결 방법 (0) | 2012.11.15 |
안드로이드 레이아웃 작업 시 기본 룰 (0) | 2012.11.08 |
해상도에 따른 레이아웃 폴더와, 이미지 폴더 분기 (0) | 2012.11.08 |
Target, minSdkVersion (0) | 2012.11.08 |
Proguard 적용하기 (1) | 2012.02.06 |
[펌] 성능을 위한 설계 (0) | 2012.01.13 |
this 사용에 따른 메모리 릭(Memory Leaks) (0) | 2012.01.13 |
Interpolation(보간법) 수식 (1) | 2012.01.06 |
Custom Widget에 사용자 속성 정의 및 사용하기 (0) | 2012.01.05 |