一、场景
在混合开发方式中,项目前端使用了tracking.js 开发了一个人脸识别功能,但是在安卓端无法成功调用摄像头进行视频捕获,在浏览器中可以正常使用该功能。
二、问题分析
之前的音视频文件适配提供给前端的方式,都是通过input标签,而这次前端的使用方式很明显不是这种,查了一下tracking.js的实现原理,得到了getUserMedia这种方式,在html5中的使用,进而才了解到webRTC适配这个事情, 安卓默认没有授权。
参考文章:
webview权限适配和getUserMedia适配 | hss01248's blog
最终在代码中需要进行授权适配以及webview 设置修改处理:
WebSettings webSettings = mWebviewPage.getSettings();webSettings.setJavaScriptEnabled(true);webSettings.setMediaPlaybackRequiresUserGesture(false);webSettings.setAllowContentAccess(true);webSettings.setAllowFileAccess(true);webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE );
//WebRTC 适配//https://webrtc.github.io/samples/src/content/getusermedia/gum/@Overridepublic void onPermissionRequest(PermissionRequest request) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mWebRTCRequest = request; Log.d(TAG,"request getOrigin="+request.getOrigin()); String[] permissonRes = request.getResources(); //判断是否包含了视频 和 音频 两种,分别转化为对应的安卓权限 boolean videoRequire = false; boolean audioRequire = false; for(String permission : permissonRes){ Log.d(TAG,"request permission="+permission); if(permission.equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE)){ videoRequire = true; }else if (permission.equals(PermissionRequest.RESOURCE_AUDIO_CAPTURE)){ audioRequire = true; } } //包含了音频则一定会要求视频 if (audioRequire){ boolean audioGranted = HzNetUtil.selfPermissionGranted(mContext, Manifest.permission.RECORD_AUDIO); boolean cameraGranted = HzNetUtil.selfPermissionGranted(mContext, android.Manifest.permission.CAMERA); if (audioGranted && cameraGranted){ request.grant(request.getResources()); }else { ActivityCompat.requestPermissions(WebViewActivity.this, new String[]{android.Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO }, Constants.PERMISSION_REQUEST_FOR_WEBVIEW_RTC); } }else { //只要视频 boolean cameraGranted = HzNetUtil.selfPermissionGranted(mContext, android.Manifest.permission.CAMERA); if (cameraGranted){ request.grant(request.getResources()); }else { ActivityCompat.requestPermissions(WebViewActivity.this, new String[]{android.Manifest.permission.CAMERA }, Constants.PERMISSION_REQUEST_FOR_WEBVIEW_RTC); } } }else { AFLog.w(TAG,"安卓低版本,不支持WebRTC"); }}
如此这般适配之后,基本可以正常通过webview 唤起摄像头进行业务功能了。
测试地址:
getUserMediaWebRTC code sampleshttps://webrtc.github.io/samples/src/content/getusermedia/gum/