安卓开发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 samplesicon-default.png?t=N7T8https://webrtc.github.io/samples/src/content/getusermedia/gum/ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

@Injectable()

当你在 Nest.js 中使用 Injectable() 装饰器标记一个类时,它告诉 Nest.js 这个类是一个可以被注入到其他地方使用的服务。这意味着你可以在你的应用中的不同地方重复使用这个服务,而不必每次都手动创建它的实例。 比如说,假设你有一个服务叫…

【信息系统项目管理师知识点速记】范围管理:定义范围

定义范围是制定项目和产品详细描述的过程。其主要作用是描述产品、服务或成果的边界和验收标准。本过程需要在整个项目期间多次反复开展。 9.5.1 输入 项目章程 包含对项目的高层级描述、产品特征和审批要求。项目管理计划 范围管理计划:记录了如何定义、确认和控制项目范围的…

第八节 LLaVA模型CLI推理构建custom推理代码Demo

文章目录 前言一、parser 参数设定1、lora权重推理2、非lora权重推理3、量化权重推理4、实验总结 二、初始化模型三、模型推理四、完整代码Demo 前言 我在第七节介绍了cli.py推理源码解读,而我也因项目需要构建了推理demo,我们是用来自动生成标签和推理…

Rust Vec<T> 集合使用教程

Rust Vec 集合使用教程 文章目录 Rust Vec<T> 集合使用教程1. 创建和初始化 Vec<T>代码示例运行结果 2. 访问和修改 Vec<T> 中的元素代码示例运行结果 3. 添加和删除 Vec<T> 中的元素代码示例运行结果 4. 遍历 Vec<T>代码示例运行结果 5. 使用 V…

web服务的部署及高级优化

搭建web服务器 1.1、配置主机IP以及软件仓库搭建 [rootserver129 ~]# vmset.sh 100 //主机IP配置为172.25.254.100 1.2、查看搭建web服务器所需的软件包 [rootserver100 ~]# dnf search nginx 名称 精准匹配&#xff1a;nginx nginx.x86_64 : A high performance web serve…

头歌实践教学平台:CG7-v2.0-实体消隐

第1关&#xff1a;立方体消隐 一. 任务描述 1. 本关任务 (1) 理解深度缓冲器算法(Z-Buffer)算法; (2) 将triangle函数和main函数中的空白部分补充完整。 2. 输入 (1) 代码将自动输入一个边长为1的obj正方体模型&#xff0c;具体模型如下图&#xff1a; (2) 代码会自动对将…

Kafka Exactly Once 语义实现原理:幂等性与事务消息

01 前言 在现代分布式系统中&#xff0c;确保数据处理的准确性和一致性是至关重要的。Apache Kafka&#xff0c;作为一个广泛使用的流处理平台&#xff0c;提供了强大的消息队列和流处理功能。随着业务需求的增长&#xff0c;Kafka 的事务消息功能应运而生&#xff0c;它允许应…

力扣279完全平方数

力扣279完全平方数 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;…

【OceanBase诊断调优】—— OceanBase 数据库日志解读

适用版本&#xff1a;V2.1.x、V2.2.x、V3.1.x、V3.2.x observer.log 日志 OBServer 启动日志 搜索关键字&#xff1a; [NOTICE] 日志说明&#xff1a; OBServer 启动过程中比较关键的日志信息。 [2023-05-11 14:19:09.703272] INFO [SERVER] ob_server.cpp:533 [95303][0]…

单链表的经典oj题(1)

前言 这次博客将要以图解的形式&#xff0c;把单链表的经典题目&#xff0c;讲解&#xff0c;绝对是干货&#xff0c;来吧兄弟萌 第一题 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 …

USB HID报告描述符学习

参考资料 HID 报告描述符 (qq.com)https://mp.weixin.qq.com/s?__bizMzU1ODI3MzQ1MA&mid2247485748&idx1&sn112bd8014eb96b03308b3b808549e8d4&chksmfc284ff1cb5fc6e770c2d2ece46c17bf2529901b45a357938978fa62163723556ad497b05c47&cur_album_id3340417…

力扣经典150题第四十七题:汇总区间

目录 题目描述和要求示例解释解题思路算法实现复杂度分析测试和验证总结和拓展参考资料 题目描述和要求 给定一个无重复元素的有序整数数组 nums&#xff0c;要求返回恰好覆盖数组中所有数字的最小有序区间范围列表。即&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖…

三、VLAN间路由(三层交换)

VLAN间路由可以通过二层交换机配合路由器来实现&#xff0c;也可以通过三层交换机来实现。 目录 1.单臂路由 2.通过三层交换机实现不同vlan的互访 1.单臂路由 注&#xff1a; 1.三层接口不能正确识别带vlan tag的数据帧 2.所有子接口与主接口共享MAC地址 命令 int g0/0/0.1…

Tom与Locust的渐入佳境

本书 第一章&#xff1a;Tom的Locust压力测试之旅 第二章&#xff1a;意外的挑战&#xff1a;系统性能问题的出现 第三章&#xff1a;高手相助&#xff1a;遇见性能测试专家 第四章&#xff1a;Locust初探&#xff1a;探寻压力测试工具 第五章&#xff1a;脚本编写&#xff1a…

Java Spring 中 Bean 的作用域(Scope)

在 Java Spring 框架中&#xff0c;Bean 的作用域&#xff08;Scope&#xff09;定义了 Bean 的生命周期以及其在 Spring 容器中的可见性。Spring 提供了几种不同的 Bean 作用域&#xff0c;以满足不同的应用需求。以下是 Spring 中主要的 Bean 作用域及其详细解释&#xff1a;…

试用了三个Ai音乐工具,我的偶像河图要完蛋了

试了三个生成音乐的ai工具&#xff0c;分别是爆火的suno,后期新秀udio&#xff0c;还有我们国内的天工。 先说感受&#xff0c;suno和天工我觉得稍微靠前&#xff0c;udio可能我的配置风格有问题&#xff0c;啪啪啪连选了好几个风格&#xff0c;生成的东西有点怪。 我随手写了…

语音识别的基本概念

语音识别的基本概念​​​​​​​ ​​​​​​​ 言语是一种复杂的现象。人们很少了解它是如何产生和感知的。天真的想法常常是语音是由单词构成的&#xff0c;而每个单词又由音素组成。不幸的是&#xff0c;现实却大不相同。语音是一个动态过程&#xff0c;没有明确区分的…

linux学习:线程安全(信号量+互斥锁读写锁+条件变量+可重入函数)

目录 信号量 有名信号量 步骤 api 创建、打开一个POSIX有名信号量 对 POSIX 有名信号量进行 P、V 操作 关闭、删除 POSIX 有名信号量 例子 无名信号量 步骤 api 初始化、销毁 POSIX 无名信号量 互斥锁读写锁 例子 两条线程 使用互斥锁来互斥地访问标准输出 在加锁…

算法人生(12):从“优先级队列算法”到“”六点优先工作法”

算法思想和生活中很多解决问题的思想有着异曲同工之妙&#xff0c;让我们来看下今天的“优先级队列算法”可以怎么应用到我们的生活中吧&#xff01; 优先级队列算法&#xff08;Priority Queue Algorithm&#xff09; 是一种特殊的数据结构&#xff0c;它在常规队列秉持着“先…

MySQL中START REPLICA 语句详解

在数据库管理和操作中&#xff0c;复制是保证数据可用性和分布式处理的关键技术之一。MySQL从8.0.22版本开始引入了START REPLICA语句&#xff0c;替代了原来的START SLAVE语句。本篇博文将详细介绍START REPLICA语句的用法和功能&#xff0c;帮助数据库管理员更有效地管理MySQ…