Notice
Recent Posts
Recent Comments
Link
투케이2K
902. (Android/Java) [간단 소스] Webview 웹뷰 onShowCustomView , onHideCustomView 사용해 비디오 재생 전체 화면 및 닫기 처리 본문
Android
902. (Android/Java) [간단 소스] Webview 웹뷰 onShowCustomView , onHideCustomView 사용해 비디오 재생 전체 화면 및 닫기 처리
투케이2K 2024. 11. 19. 20:06[개발 환경 설정]
개발 툴 : AndroidStudio
개발 언어 : Java / Kotlin
[소스 코드]
// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------
- 언어 : Java
- 개발 툴 : Android Studio
- 구분 : 간단 소스
- 사전 필요 설정 : 웹 HTML 화면에서 비디오 태그 생성 및 비디오 재생 수행 >> 비디오 태그 전체 화면 클릭 , 전체 화면 종료 이벤트 클릭
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------
// ----------------------------------------------
// TODO [전역 변수 선언]
// ----------------------------------------------
View mCustomView = null;
WindowManager windowManager = null;
// ----------------------------------------------
// TODO [webview 웹뷰 옵션 설정 수행]
// ----------------------------------------------
main_webview.getSettings().setJavaScriptEnabled(true);
main_webview.getSettings().setDomStorageEnabled(true);
main_webview.getSettings().setMediaPlaybackRequiresUserGesture(false);
// ----------------------------------------------
// TODO [setWebChromeClient 생성 및 비디오 태그 전체 화면 처리 수행]
// ----------------------------------------------
main_webview.setWebChromeClient(new WebChromeClient() {
// TODO [비디오 태그 전체 화면 클릭 시 호출 됨]
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
S_Log._W_("WebChromeClient :: onShowCustomView :: Start", null);
// [이미 생성 된 뷰가 있으면 제거 수행]
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
// [사전 API 레벨 체크 및 퍼미션 권한 부여]
if (Build.VERSION.SDK_INT >= 23) {
if (!Settings.canDrawOverlays(A_Webview.this)) {
S_Log._E_("WebChromeClient :: onHideCustomView :: Permission Not Grant", null);
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
main_webview.reload(); // [웹뷰 리로드 처리]
return;
}
}
// [비디오 태그 재생 화면 전체 화면 전환] : [mCustomView 뷰 할당]
mCustomView = view;
mCustomView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
// [WindowManager 생성 뷰 최상단 표시 설정]
try {
windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
int LAYOUT_FLAG;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
}
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT, // 프레임 최대 크기
WindowManager.LayoutParams.MATCH_PARENT, // 프레임 최대 크기
LAYOUT_FLAG, // API 레벨에 따라 TYPE_SYSTEM_ALERT 등을 사용 필요
//WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // 윈도우가 포커스를 가져오지 않도록 설정
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
// 윈도우 초기 위치 설정
params.gravity = Gravity.START | Gravity.TOP;
params.x = 0;
params.y = 100;
// 윈도우 뷰 추가
windowManager.addView(mCustomView, params);
}
catch (Exception e){
e.printStackTrace();
}
// [super.onShowCustomView]
super.onShowCustomView(view, callback);
}
// TODO [비디오 태그 화면 전체 >> 축소 시 이벤트 발생 확인]
@Override
public void onHideCustomView() {
super.onHideCustomView();
S_Log._E_("WebChromeClient :: onHideCustomView :: Start", null);
// [사전 null 체크 및 리턴 수행]
if (mCustomView == null || windowManager == null) {
return;
}
// [뷰 제거 및 null 초기화]
windowManager.removeView(mCustomView);
mCustomView = null;
windowManager = null;
}
});
// -----------------------------------------------------------------------------------
반응형
'Android' 카테고리의 다른 글
Comments