安卓开发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/

相关推荐
阿巴斯甜18 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker18 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952719 小时前
Andorid Google 登录接入文档
android
黄林晴21 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android