투케이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
    }
}

// -----------------------------------------------------------------------------------
​

 

반응형
Comments