收藏
回答

wx.getRecorderManager熄屏后报错再也无法继续录音

问题模块 框架类型 问题类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本
API和组件 小程序 Bug wx.getRecorderManager 客户端 Android 6.6.7 2.1.2


通过基础库1.6.0以后提供的wx.getRecordManager接口返回的recordManager对象进行录音。

当用户手机熄屏或者通过分享切到其他页面(非当前小程序)时,

1、如果我们在页面的onHide里调用了recordManager的pause或stop方法,微信会立即报错,operateRecorder:fail:access denied。后面只要不重启小程序,即使再次通过wx.getRecordManager获取recordManager对象调用其start方法,也会立即报错,无法录音。

2、如果在页面的onHide里不去调stop方法,不会报错,回来后继续录音。但是等到最后调用stop时,在onStop里返回的录音文件发现,第一次onHide后录的所有内容,都没有保存


我们现在真的有点纠结,是继续用微信新的wx.getRecordManager还是回去用来老的wx.startRecord与wx.stopRecord呢?

请尽快给个答复吧。


报错截图如下



最后一次编辑于  2018-07-06
回答关注问题邀请回答
收藏

2 个回答

  • 社区技术运营专员-娇华
    社区技术运营专员-娇华
    2018-07-06

    你好,请提供一下出现问题的机型和微信版本,以及能复现问题的简单代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)。

    2018-07-06
    赞同
    回复 2
    • Johnson Xu
      Johnson Xu
      2018-07-06

      机型方面,至少目前小米6是必现的,微信版本我的是6.6.7,上面已经写了。

      代码很简单:

      // 录音参数
      const RECORD_OPTIONS = {
        duration: 600000, // 最多10分钟
        sampleRate: 16000,
        numberOfChannels: 1,
        encodeBitRate: 32000,
        format: 'mp3',
      };
       
      onLoad: function(options) {
      const recorderManager = wx.getRecorderManager();
          recorderManager.onStart((res) => {
            console.debug('recorder start');
          });
          recorderManager.onPause((res) => {
            console.debug('recorder paused');
          });
          recorderManager.onStop((res) => {
            console.debug('recorder stop', this.customData.currentTimeValue, res.duration, res.fileSize);
            const {
              tempFilePath,
              fileSize,
              duration
            } = res;
            // 另外,这里的duration,如果在pause一段时间后再stop,则时长是错的,会把暂停的那段时间也加进去
          });
          recorderManager.onError((e) => {
            console.error('录音失败', e);
          });
          this.customData.recorder = recorderManager;
      }
      beginRecord: function() {
          if (!this.data.recording) {
            this.setData({
              recording: true,
              paused: false,
              currentTime: 0, // 重置开始时间
            });
       
            console.debug('开始录音');
            this.customData.recorder.start(RECORD_OPTIONS);
          }
        },
        onHide: function() {
          this.customData.recorder.pause();
        }

      另外,上面忘提了,onStop里传过来的duration,在暂停录音后一段时间调结束的话,会把暂停那段时间算上,但是音频文件解析后,其时长是不包括那段的。

      例如:录音1分钟,暂停30秒,调stop,onStop里的duration是1分30秒,但是实际音频文件只有1分钟。如果在暂停后,调resume继续录制,直接调stop结束,则时长是对的。

      2018-07-06
      回复
    • 社区技术运营专员-娇华
      社区技术运营专员-娇华
      2018-07-06回复Johnson Xu

      代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)是这样子的,按照文档指引创建吧

      2018-07-06
      回复
  • Johnson Xu
    Johnson Xu
    2018-07-06

    最新进展:

    在切后台时(包括分享、熄屏等),recordManager会回调onPause,故不在onHide中进行操作,直接根据回调切换界面状态。

    但是后台调用pause/stop后报错无法再次录音的问题,请微信的同学尽快给个答复吧。

    2018-07-06
    赞同
    回复 4
    • 舒紫鹏
      舒紫鹏
      2018-07-16

      同样的问题。。。只要失败了就跪了

      2018-07-16
      回复
    • Johnson Xu
      Johnson Xu
      2018-07-17回复舒紫鹏

      现在只能以不在后台调pause或stop的方式来规避了,其余情况下的报错,就没招了

      2018-07-17
      回复
    • 舒紫鹏
      舒紫鹏
      2018-07-17回复Johnson Xu

      我用了旧的start和stop,本来这也是用另一个api有bug,迫不得已用录音。。。结果还有问题,哎

      2018-07-17
      回复
    • 舒紫鹏
      舒紫鹏
      2018-07-17回复Johnson Xu

      大佬,联系方式有没,私聊下

      2018-07-17
      回复
登录 后发表内容