收藏
回答

RecorderManager的状态管理

问题模块 框架类型 问题类型 操作系统 操作系统版本 手机型号 微信版本
客户端 小程序 需求 iOS 12.1 iPhoneXsMax 7.0.3

这个简单的代码片段来实现长按录音。touchStart时调用recorderManager.start(),touchEnd时调用recorderManager.stop()。但是在真机上无法工作,目前看到的原因是如果我长按释放过快,会导致在onStart之前就触发stop,然后通过onError报错。这使得我们要实现长按录音非常困难,需要做到:

1. 自制一个recorderManager对微信的recorderManager进行包装,保存stop调用,根据callback规律猜测recorderManager内部状态,并在正确的状态时才能调用

2. 在start和onStart之间无法stop录音,导致我们在onStart里需要根据flag立刻调用stop()。但用户仍然可见录音界面(状态)闪烁。若连续快速点击,会出现状态累积,不断开始关闭,持续数秒用户难以操作。


期望:

stop()应当不论处于什么状态都能够stop,不应让用户保存recorderManager内部状态并实现基于recorderManager状态的逻辑。

或者,能否有其他建议来实现长按录音。


谢谢。


最后一次编辑于  03-18
回答关注问题邀请回答
收藏

2 个回答

  • 小程序技术专员-sanford
    小程序技术专员-sanford
    03-19

    这个问题不在于处于任何状态都能stop。而是点击太快,导致你先stop,然后在start,之后一直处于录音的状态。这个时序基础库是无法保证,需要开发自己维护。


    我们考虑下提供一个这样的自定义组件,帮你们封装好。

    03-19
    赞同
    回复 1
    • ccmouse
      ccmouse
      03-19

      非常感谢您的回复。您提到的时序问题是另一个问题。我们已经自行封装进行了解决。


      这里解决不了的的确是start之后不能太快stop的问题。如果在onStart之前就触发了stop,这个stop会失败,导致一直录音。您可以尝试迅速的点击但是只点击一下按钮,来重现这个错误。


      我们只能记录stop的意向,在onStart里才去调用stop。不过这样效果并不好,我们应该不会采用。请参考:

        this.recorderManager.onStart(() => {
          console.log('onStart');
          this.started = true;
          if (this.stopSignaled) {
            this.recorderManager.stop();
          }
        });
       
       
      touchEnd: function () {
        console.log('touchEnd');
        this.setData({ text: '开始录音' });
        if (this.started) {
          this.recorderManager.stop();
        } else {
          this.stopSignaled = true;
        }
      }


      03-19
      回复
  • 小程序技术专员-villainhr
    小程序技术专员-villainhr
    03-18

    好,这个问题,我跟进看一下哈。

    03-18
    赞同
    回复 1
    • 小程序技术专员-villainhr
      小程序技术专员-villainhr
      03-19

      这个已经给 相关负责人处理了

      03-19
      回复