安卓开发Webview RTC 适配

一、场景

在混合开发方式中,项目前端使用了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/
@Override
public 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/

相关推荐
Cloud_Shy61843 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
AFinalStone1 小时前
Android12 U盘插拔链路源码全解析(五):Framework层(下) StorageManagerService
android·frameworks
林九生3 小时前
【实用技巧】MySQL 绿色版一键路径更新脚本详解 —— update_path.bat 深度解析
android·数据库·mysql
故渊at4 小时前
第十三板块:Android 综合架构与未来演进 | 第三十一篇:Android 架构演进与 Fuchsia OS 的挑战
android·架构·宏内核·微内核·fuchsia·ipc 性能博弈
aqi004 小时前
一文速览 HarmonyOS 6.1.1 推出的十个新特性
android·华为·harmonyos·鸿蒙·harmony
matrixmind14 小时前
aiomysql:异步场景下的 MySQL 驱动
android·数据库·mysql·其他
随遇丿而安4 小时前
第8周:弹窗 / 提示组件全功能与弹窗优化
android
zh_xuan4 小时前
诡异Bug:输入框删除字符,却越删越多
android·bug
nwsuaf_huasir5 小时前
matlab绘制尺寸和字体合适的图片插入到latex的方法
android·开发语言·matlab
future_li5 小时前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android