项目背景:项目是用 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 已经发布到应用市场,随着用户的增加,目前为止,还没有收到录音获取权限不起作用的反馈。如有问题,欢迎大家分享反馈。

移动端,录音之前判断是否已经获取录音权限相关推荐

  1. android 动态录音权限,Android如何判断手机是否有录音权限的工具类

    作用 判断手机是否有录音权限的工具类,兼容6.0以上以及以下android系统 测试环境 这篇文章是评论中的网友提出质疑后,经过重写修改与重写测试后编写的,我的调试环境是小米note3,Android ...

  2. demo h5 touch 移动_H5案例分享:移动端touch事件判断滑屏手势的方向

    移动端touch事件判断滑屏手势的方向 方法一 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY: 当触发touchmove事件时,在获取此时手指的横坐标 ...

  3. java yyyy-mm-ddthh:mm:ssz,获取录音文件下载地址接口

    301 - - - 成功响应,请从Location头域中获取录音文件下载地址. 400 1023006 Authorization not contained in the HTTP header. ...

  4. android获取录音读写权限设置,Android编程检测手机录音权限是否打开的方法

    本文实例讲述了Android编程检测手机录音权限是否打开的方法.分享给大家供大家参考,具体如下: 6.0之前的权限检测只是检测到是否在清单文件中注册 Boolean flag = (PackageMa ...

  5. Android检测是否有悬浮窗,Android 获取判断是否有悬浮窗权限的方法

    现在很多应用都会用到悬浮窗,很多国产rom把悬浮窗权限加入控制了,你就需要判断是否有悬浮窗权限,然后做对应操作. Android 原生有自带权限管理的,只是被隐藏了.看android源码在androi ...

  6. android悬浮动态权限,Android 获取判断是否有悬浮窗权限的方法

    现在很多应用都会用到悬浮窗,很多国产rom把悬浮窗权限加入控制了,你就需要判断是否有悬浮窗权限,然后做对应操作. Android 原生有自带权限管理的,只是被隐藏了.看android源码在androi ...

  7. android 读取音频音量,Android AudioRecord和MediaRecorder录音并实现了实时获取音量大小...

    [实例简介] Android AudioRecord和MediaRecorder录音并实现了实时获取音量大小 看代码就知道了 [实例截图] [核心代码] MediaRecorer和AudioRecor ...

  8. go golang 判断base64数据 获取随机字符串 截取字符串

    go golang 判断base64数据 获取随机字符串 截取字符串 先少写点,占个坑,以后接着加. 1,获取指定长度随机字符串 func RandomDigits(length int) strin ...

  9. 用js来判断用户端浏览器(判断QQ浏览器、谷歌浏览器)方法

    用js来判断用户端浏览器(判断QQ浏览器.谷歌浏览器)方法 function getBrowserInfo(){ var ua = navigator.userAgent.toLocaleLowerC ...

最新文章

  1. 2022-2028年中国废旧塑料回收产业研究及前瞻分析报告
  2. 在两个静态HTML页面之间传递参数的一个方法
  3. TFS2010迁移后Web工作项访问提示:error HRESULT E_FAIL has been returned from a call to a COM component....
  4. 刚毕业的他仅用1年就拿下了年薪30W的阿里数据分析岗
  5. linux重启后地址不是之前设置的静态地址的解决方案
  6. 收银系统 mysql数据库_某大型超市收银系统数据库成功恢复
  7. wampserver集成环境和安装
  8. c语言extern_C语言中#if,#if defined ,#ifdef,extern的用法描述
  9. 该怎么输出log?!
  10. 亲测:解决“正在进行另一Java安装,您必须先完成该安装,然后才能运行此安装程序”的问题
  11. SolidWorks设计助手,可以标注和实体无关的工程图标注
  12. java中int型的取值范围_Java中int的取值范围
  13. ssh远程登录命令简单实例
  14. 使用屏幕录制专家--录制视频技巧
  15. 推荐书籍:软件定义网络 SDN与OpenFlow解析
  16. 如何快速获取淘宝商品的详细信息?看这里就够了
  17. 校园招聘可以报考哪些岗位?
  18. 那些年,在Fragment中犯的错
  19. Windows应用商店保留Windows 7特色
  20. 网站移动端APP渗透测试安全检测方案

热门文章

  1. 锁存器怎么使用c语言编程,基础——(4)SR Latch(SR锁存器)
  2. python转json
  3. 【选股策略】换手率市值MACD量价(三天齐升)
  4. 信息可视化中的时间线设计,不懂的过来
  5. 手机为什么会起热发烫?产生原因和解决方法要知道,可不能无所谓
  6. CentOS下tar解压 gz解压 bz2等各种解压文件使用方法
  7. 瑶镶富资深用户给大家分享现在自媒体普遍的运营模式
  8. matlab 给空矩阵赋值,matlab中怎么给矩阵赋值?
  9. 删除连续相同字符python_Python 删除连续出现的指定字符的实例
  10. 马踏棋盘求----全部解