Notice
Recent Posts
Recent Comments
Link
투케이2K
534. (kotlin/코틀린) [간단 소스] Webview 웹뷰 onShowCustomView , onHideCustomView 사용해 비디오 재생 전체 화면 및 닫기 처리 본문
Kotlin
534. (kotlin/코틀린) [간단 소스] Webview 웹뷰 onShowCustomView , onHideCustomView 사용해 비디오 재생 전체 화면 및 닫기 처리
투케이2K 2024. 11. 19. 20:37[개발 환경 설정]
개발 툴 : AndroidStudio
개발 언어 : Kotlin
[소스 코드]
// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------
- 언어 : Kotlin
- 개발 툴 : Android Studio
- 구분 : 간단 소스
- 사전 필요 설정 : 웹 HTML 화면에서 비디오 태그 생성 및 비디오 재생 수행 >> 비디오 태그 전체 화면 클릭 , 전체 화면 종료 이벤트 클릭
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------
// ----------------------------------------------
// TODO [전역 변수 선언]
// ----------------------------------------------
var mCustomView: View? = null // [비디오 태그 전체 화면]
var windowManagers: WindowManager? = null // [비디오 태그 전체 화면]
// ----------------------------------------------
// TODO [webview 웹뷰 옵션 설정 수행]
// ----------------------------------------------
main_webview!!.settings.javaScriptEnabled = true
main_webview!!.settings.domStorageEnabled = true
main_webview!!.settings.mediaPlaybackRequiresUserGesture = false
// ----------------------------------------------
// TODO [setWebChromeClient 생성 및 비디오 태그 전체 화면 처리 수행]
// ----------------------------------------------
main_webview!!.webChromeClient = object : WebChromeClient() {
// TODO [비디오 태그 전체 화면 클릭 시 호출 됨]
override fun onShowCustomView(view: View, callback: CustomViewCallback) {
S_Log._W_("WebChromeClient :: onShowCustomView :: Start", null)
// [이미 생성 된 뷰가 있으면 제거 수행]
if (mCustomView != null) {
callback.onCustomViewHidden()
return
}
// [사전 API 레벨 체크 및 퍼미션 권한 부여]
if (Build.VERSION.SDK_INT >= 23) {
if (!Settings.canDrawOverlays(this@A_Webview)) {
S_Log._E_(
"WebChromeClient :: onHideCustomView :: Permission Not Grant",
null
)
val intent = Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:$packageName")
)
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
startActivity(intent)
main_webview!!.reload() // [웹뷰 리로드 처리]
return
}
}
// [비디오 태그 재생 화면 전체 화면 전환] : [mCustomView 뷰 할당]
mCustomView = view
mCustomView!!.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
// [WindowManager 생성 뷰 최상단 표시 설정]
try {
windowManagers = getSystemService(WINDOW_SERVICE) as WindowManager
val LAYOUT_FLAG: Int
LAYOUT_FLAG = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
} else {
WindowManager.LayoutParams.TYPE_PHONE
}
val params = 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 or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
)
// 윈도우 초기 위치 설정
params.gravity = Gravity.START or Gravity.TOP
params.x = 0
params.y = 100
// 윈도우 뷰 추가
windowManager!!.addView(mCustomView, params)
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
// [super.onShowCustomView]
super.onShowCustomView(view, callback)
}
// TODO [비디오 태그 화면 전체 >> 축소 시 이벤트 발생 확인]
override fun onHideCustomView() {
super.onHideCustomView()
S_Log._E_("WebChromeClient :: onHideCustomView :: Start", null)
// [사전 null 체크 및 리턴 수행]
if (mCustomView == null || windowManager == null) {
return
}
// [뷰 제거 및 null 초기화]
windowManager!!.removeView(mCustomView)
mCustomView = null
windowManagers = null
}
}
// -----------------------------------------------------------------------------------
반응형
'Kotlin' 카테고리의 다른 글
Comments