移动端,录音之前判断是否已经获取录音权限
项目背景:项目是用 vue 写的,最终打包为 apk ,其中涉及到录音的功能,利用 h5+ 实现的。
(在vue中集成 html5 plus, 参考 https://www.cnblogs.com/luobiao/p/10552030.html)
需求:长按录音,录音之前判断是否已经获取录音权限,如果没有权限,则需要获取权限;如果有权限,则开始录音。
录音功能,使用了触摸事件,触摸开始,则录音开始,触摸结束,则录音结束。并且限制录音时长最长为一分钟
<div class="record" @touchstart="startRecord" @touchend="stopRecord"></div>
因为要使用录音,所以在 mounted 钩子函数中需要先获取设备的录音对象
使用 plus.audio.getRecorder() 可以获取设备的录音对象。
mounted () {let vm = thisthis.onPlusReady(() => {console.log('plus ready')// eslint-disable-next-linevm.recorderPlus = plus.audio.getRecorder()})},
录音时,首先要先判断是否已经获取录音的权限。 plus.navigator.checkPermission() 方法可以检查运行环境的权限。
plus.navigator.checkPermission(permission)
向系统检查当前程序的权限状态,不触发权限相对应的功能API的调用。
permission : 要检查的权限名称。
返回值:"authorized"表示程序已被用户授权使用此权限; "denied"表示程序已被用户拒绝使用此权限; "undetermined"表示程序未确定是否可使用此权限,此时调用对应的API时系统会弹出提示框让用户确认; "notdeny"表示程序未被用户拒绝使用此权限(与denied相反,可能是"authorized"或者"undetermined"); "unknown"表示程序未知此权限状态(系统存在权限管理但无法查询); "unsupported"表示程序不支持此权限。
startRecord () {if (this.recorderPlus === null) {this.$toast('Device not ready!')return}// 判断权限// eslint-disable-next-linelet permission = plus.navigator.checkPermission('RECORD')console.log(permission)switch (permission) {case 'authorized': // 允许this.record()breakcase 'denied': // 拒绝this.requestPermission()breakcase 'undetermined': // 询问this.requestPermission()breakcase 'unknown': // 未知this.record()breakdefault:this.$toast('设备不支持录音')break}},
获取权限时,安卓 和 ios 的处理方式不同。
对于安卓手机,plus.android 提供了获取权限的方法。
plus.android.requestPermissions(permissions, successCb, errorCb)
permissions: Array[String] 申请的权限列表(要申请的权限需在应用manifest.json的“模块权限配置”中勾选)
succesCb: 申请权限成功回调函数
返回申请权限的结果,可能被用户允许 回调函数的参数event包含以下属性:
- granted - Array[String]字符串数组,已获取权限列表;
- deniedPresent - Array[String]字符串数据,已拒绝(临时)的权限列表;
- deniedAlways - Array[String]字符串数据,永久拒绝的权限列表。
errorCb: 申请权限失败回调函数
// eslint-disable-next-lineplus.android.requestPermissions(['android.permission.RECORD_AUDIO'], function (e) {if (e.deniedAlways.length > 0) { // 权限被永久拒绝vm.$dialog.alert({message: '录音权限被永久拒绝,请到设置权限里找到应用手动开启权限,否则将不能使用此功能。'})}if (e.deniedPresent.length > 0) { // 权限被临时拒绝vm.$dialog.confirm({message: '拒绝开启录音权限,将不能使用此功能!确定拒绝开启吗?',confirmButtonText: '确定',cancelButtonText: '取消'}).then(() => {}).catch(() => {vm.requestPermission()})}if (e.granted.length > 0) { // 权限被允许}}, function (e) {vm.$dialog.alert({message: '请求录音权限失败,请到设置权限里找到应用手动开启权限,否则将不能使用此功能。'})})
但是对于 ios , 并没有直接的方法获取权限。最后采取的解决办法是,在没有录音权限的时候,先主动调用一次录音的api,此时 ios 回去请求一次录音的权限。如果没有选择不允许使用权限,则触发录音失败的回调函数。
vm.recorderPlus.record({}, function () {}, function (e) {if (e.code === 2) {vm.$dialog.alert({message: '录音权限未允许,请到设置手动开启权限,否则将不能使用此功能。'})}console.log(JSON.stringify(e))})vm.recorderPlus.stop()
因为两个平台需要区别对待,plus 提供了判断平台的方法,plus.os.name
获取录音权限的 requestPermission() 方法的完整代码为
requestPermission () {let vm = this// eslint-disable-next-linelet platform = plus.os.nameif (platform === 'Android') {// 动态申请权限// eslint-disable-next-lineplus.android.requestPermissions(['android.permission.RECORD_AUDIO'], function (e) {if (e.deniedAlways.length > 0) { // 权限被永久拒绝vm.$dialog.alert({message: '录音权限被永久拒绝,请到设置权限里找到应用手动开启权限,否则将不能使用此功能。'})}if (e.deniedPresent.length > 0) { // 权限被临时拒绝vm.$dialog.confirm({message: '拒绝开启录音权限,将不能使用此功能!确定拒绝开启吗?',confirmButtonText: '确定',cancelButtonText: '取消'}).then(() => {}).catch(() => {vm.requestPermission()})}if (e.granted.length > 0) { // 权限被允许}}, function (e) {vm.$dialog.alert({message: '请求录音权限失败,请到设置权限里找到应用手动开启权限,否则将不能使用此功能。'})})} else if (platform === 'iOS') {vm.recorderPlus.record({}, function () {}, function (e) {if (e.code === 2) {vm.$dialog.alert({message: '录音权限未允许,请到设置手动开启权限,否则将不能使用此功能。'})}console.log(JSON.stringify(e))})vm.recorderPlus.stop()} else {this.record()}},
录音 record()方法的完整代码
data () {return {recording: false, // 是否有录音在进行中timeLimit: 60, // 时间限制(s)remainTime: 60, // 剩余时间(s)timeOut: 10, // 剩余时间提示(s)}}, record () {let vm = thisif (vm.recording) {return false}vm.recording = trueif (vm.timer) {clearInterval(vm.timer)}vm.remainTime = vm.timeLimitlet duration = 0vm.timer = setInterval(function () {duration++vm.remainTime = vm.timeLimit - durationif (duration === vm.timeLimit) {vm.stopRecord()}}, 1000)let rates = vm.recorderPlus.supportedSampleratesvm.recorderPlus.record({filename: '_doc/audio/', format: 'wav', samplerate: rates[0]}, function (path) {console.log('录音文件的路径为:' + path)}, function (e) {let error = JSON.stringify(e)vm.$toast('Audio record failed: ' + error)if (vm.timer) {clearInterval(vm.timer)}if (vm.recording) {vm.recording = false}})},
结束录音的方法
stopRecord () {let vm = thisif (vm.timer) {clearInterval(vm.timer)}if (vm.recording) {vm.recording = falsevm.recorderPlus.stop()}},
写在最后:此解决方案,在开发时,我只用 iPhone X 和 OPPO R11 进行了测试,没有发现问题。公司资源有限,后来测试也没有测试到所有机型。现在 app 已经发布到应用市场,随着用户的增加,目前为止,还没有收到录音获取权限不起作用的反馈。如有问题,欢迎大家分享反馈。
移动端,录音之前判断是否已经获取录音权限相关推荐
- android 动态录音权限,Android如何判断手机是否有录音权限的工具类
作用 判断手机是否有录音权限的工具类,兼容6.0以上以及以下android系统 测试环境 这篇文章是评论中的网友提出质疑后,经过重写修改与重写测试后编写的,我的调试环境是小米note3,Android ...
- demo h5 touch 移动_H5案例分享:移动端touch事件判断滑屏手势的方向
移动端touch事件判断滑屏手势的方向 方法一 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY: 当触发touchmove事件时,在获取此时手指的横坐标 ...
- java yyyy-mm-ddthh:mm:ssz,获取录音文件下载地址接口
301 - - - 成功响应,请从Location头域中获取录音文件下载地址. 400 1023006 Authorization not contained in the HTTP header. ...
- android获取录音读写权限设置,Android编程检测手机录音权限是否打开的方法
本文实例讲述了Android编程检测手机录音权限是否打开的方法.分享给大家供大家参考,具体如下: 6.0之前的权限检测只是检测到是否在清单文件中注册 Boolean flag = (PackageMa ...
- Android检测是否有悬浮窗,Android 获取判断是否有悬浮窗权限的方法
现在很多应用都会用到悬浮窗,很多国产rom把悬浮窗权限加入控制了,你就需要判断是否有悬浮窗权限,然后做对应操作. Android 原生有自带权限管理的,只是被隐藏了.看android源码在androi ...
- android悬浮动态权限,Android 获取判断是否有悬浮窗权限的方法
现在很多应用都会用到悬浮窗,很多国产rom把悬浮窗权限加入控制了,你就需要判断是否有悬浮窗权限,然后做对应操作. Android 原生有自带权限管理的,只是被隐藏了.看android源码在androi ...
- android 读取音频音量,Android AudioRecord和MediaRecorder录音并实现了实时获取音量大小...
[实例简介] Android AudioRecord和MediaRecorder录音并实现了实时获取音量大小 看代码就知道了 [实例截图] [核心代码] MediaRecorer和AudioRecor ...
- go golang 判断base64数据 获取随机字符串 截取字符串
go golang 判断base64数据 获取随机字符串 截取字符串 先少写点,占个坑,以后接着加. 1,获取指定长度随机字符串 func RandomDigits(length int) strin ...
- 用js来判断用户端浏览器(判断QQ浏览器、谷歌浏览器)方法
用js来判断用户端浏览器(判断QQ浏览器.谷歌浏览器)方法 function getBrowserInfo(){ var ua = navigator.userAgent.toLocaleLowerC ...
最新文章
- 2022-2028年中国废旧塑料回收产业研究及前瞻分析报告
- 在两个静态HTML页面之间传递参数的一个方法
- TFS2010迁移后Web工作项访问提示:error HRESULT E_FAIL has been returned from a call to a COM component....
- 刚毕业的他仅用1年就拿下了年薪30W的阿里数据分析岗
- linux重启后地址不是之前设置的静态地址的解决方案
- 收银系统 mysql数据库_某大型超市收银系统数据库成功恢复
- wampserver集成环境和安装
- c语言extern_C语言中#if,#if defined ,#ifdef,extern的用法描述
- 该怎么输出log?!
- 亲测:解决“正在进行另一Java安装,您必须先完成该安装,然后才能运行此安装程序”的问题
- SolidWorks设计助手,可以标注和实体无关的工程图标注
- java中int型的取值范围_Java中int的取值范围
- ssh远程登录命令简单实例
- 使用屏幕录制专家--录制视频技巧
- 推荐书籍:软件定义网络 SDN与OpenFlow解析
- 如何快速获取淘宝商品的详细信息?看这里就够了
- 校园招聘可以报考哪些岗位?
- 那些年,在Fragment中犯的错
- Windows应用商店保留Windows 7特色
- 网站移动端APP渗透测试安全检测方案