웹뷰 QR 권한 관련 세팅

상상코딩·2023년 4월 11일
0

안드로이드

목록 보기
20/21
post-custom-banner
  1. 웹뷰 옵션 세팅에 mediaPlaybackRequireUserGesture = false
        binding.webView.apply {
            webViewClient = MyWebViewClientImpl(this@MyWebViewActivity)
            webChromeClient = MyWebChromeClientImpl(this@MyWebViewActivity)

            settings.apply {
                javaScriptEnabled = true
                domStorageEnabled = true
                javaScriptCanOpenWindowsAutomatically = true
                defaultTextEncodingName = "UTF-8"
                loadWithOverviewMode = true
                useWideViewPort = true
                setSupportMultipleWindows(false)
                setGeolocationEnabled(true)
                mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
                cacheMode = WebSettings.LOAD_DEFAULT
                setAppCacheEnabled(true)
                textZoom = 100
                mediaPlaybackRequiresUserGesture = false
            }
        }        
  1. 웹뷰 chromeClient의 onPermissionRequestRESOURCE_VIDEO_CAPTURE 권한 추가
class MyWebChromeClientImpl(
    private val activity: MyWebViewActivity
) : WebChromeClient() {

    override fun onPermissionRequest(request: PermissionRequest?) {
    //super.onPermissionRequest(request) 를 꼭 빼야함.
        val resources = request?.resources ?: return
        for (r in resources) {
            if (r == PermissionRequest.RESOURCE_VIDEO_CAPTURE) {
                request.grant(arrayOf(PermissionRequest.RESOURCE_VIDEO_CAPTURE))
                break
            }
        }
    }
}



주의사항

2번 onPermissionRequest 함수에서 super.onPermissionRequest(request) 를 꼭 빼야함. 여기 내부에서 grant/deny 처리를 따로 하고 있는지 이걸 빼지 않으면 아래와 같은 에러가 났다.
.IllegalStateException: Either grant() or deny() has been already called.




그리고 의도치 않게 권한을 부여하는 일이 없도록 특정권한을 꼭 체크하여 넣으라고 권장하고 있다.

        request?.grant(request.resources)

이렇게 어떤 권한이 들어와도 부여되게 하지 말고 아래처럼 특정 권한만을 체크하여 부여하도록.

        val resources = request?.resources ?: return
        for (r in resources) {
            if (r == PermissionRequest.RESOURCE_VIDEO_CAPTURE) {
                request.grant(arrayOf(PermissionRequest.RESOURCE_VIDEO_CAPTURE))
                break
            }
        }

profile
히히낙낙
post-custom-banner

0개의 댓글