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
}
}
onPermissionRequest
에 RESOURCE_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
}
}