记录关于H5在Android的webView中申请语音、相机等资源权限开发过程
1、申请权限的JavaScript端(Vue)
这里申请权限时一直走了catch异常,提示语音权限禁止获取。
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { // 请求麦克风权限 navigator.mediaDevices .getUserMedia({ audio: true }) .then(function (stream) { console.log('录音权限已获取') }) .catch(function (err) { // 用户拒绝或者发生错误 console.log('无法获取录音权限:', err) }) }
2、Android端的 Webview授权(Kotlint)
这里使用AgentWeb做为Webview框架,可参考:github地址,gitee地址
webViewAgentWeb = AgentWeb.with(this) .setAgentWebParent(webViewContainer, -1, LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)) .useDefaultIndicator(ContextCompat.getColor(this, R.color.light_blue), 3) .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK) .setMainFrameErrorView(R.layout.agentweb_error_page, -1) .setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.DISALLOW) .setWebChromeClient(object : WebChromeClient(){ // H5授权检查 override fun onPermissionRequest(request: PermissionRequest?) { try { if (request != null) { if( !request.resources.contains(PermissionRequest.RESOURCE_AUDIO_CAPTURE)) return if(allPermissionsGranted()){ //允许H5申请资源权限 request.grant(request.resources) //如果需要限制H5资源申请的权限类型,则使用For循环进行检查授权即可// for (r in request.resources){// if (r == PermissionRequest.RESOURCE_AUDIO_CAPTURE){// request.grant(arrayOf(PermissionRequest.RESOURCE_AUDIO_CAPTURE))// }// break// } } else { requestPermissions() } } }catch (e:Exception){ Log.d("WebView", "onPermissionRequest / Exception: ${e} ") return } } }) .interceptUnkownUrl() .createAgentWeb() .ready() .go(url)
3、报错问题:如果H5端申请资源权限时 ,出现Android端一直报错如下:
:java.lang.IllegalStateException: Either grant() or deny() has been already called.
则说明在onPermissionRequest中使用了类继承方法导致的,注销掉 super.onPermissionRequest(request) 即可,如下:
// super.onPermissionRequest(request) //调用父类(超类)中同名方法的一个实例 | 不使用这个,因为这里是继承onPermissionRequest,会导致无法再次调用grant进行授权的问题发生
参考:Android : WebView中的摄像头错误(相机允许不工作)
的相关解决思路。