微信小程序录音

时间:2021-06-02 16:44:11

wx.getUserInfo(object)

在微信小程序的官方文档中有提出,此接口有调整,使用该接口将不再出现授权弹窗,请使用<button open-type=”getUserInfo”></button>引导用户主动进行授权,我把授权放在了用户第一次操作的按钮上。

在用户第一次登陆的时候,渲染授权按钮。当storage中已经存有openid的时候,渲染录音按钮

<!-- 用户授权按钮 -->
<button class='mike' wx:if="{{userInfo}}" hover-class='curStyle' open-type='getUserInfo' bindgetuserinfo='login'></button>
<!-- 录音按钮 -->
<button class='mike' wx:if="{{record}}" hover-class='curStyle' bindtouchstart='startHandel' bindtouchend='endHandle'></button> 

交互逻辑:当用户按下按钮时,显示loading提示框(开始录音),松开时,隐藏loading并开始正在努力搜索的提示框,上传录制的音频成功,跳转到搜索结果页。

绑定的事件:bindtouchstart(手指触摸动作开始)和bindtouchend(手指触摸动作结束)。当组件触发事件时,会收到一个事件对象,其中有timeStamp,事件生成时的事件戳。两个事件分别记录开始录音时间startTime和结束录音时间endTime,因为用户不知道长按录音还是仅点击开始录音,当用户短按的时候即endTime - startTime<350时,提示说话时间太短,来引导长按才是开始录音

录音管理器getRecorderManager

用到getRecorderManager的start开始录音方法和stop停止录音方法,比较坑的是用到start方法时,第一次录音的用户会自动弹出要使用你的录音功能,是否允许?这样会影响到识别松开按钮这个动作,所以我用一个recordStatus录音授权的状态来控制。

recordStatus为false时,只向用户发起录音的请求,而不做其他的操作

recordStatus为true时,按下按钮开始录音,松开按钮正在努力搜索......

//按下按钮
    startHandel: function (e) {
            var that = this;
            var startTime = e.timeStamp;
            var recordStatus = that.data.recordStatus;
            if (!recordStatus){
              wx.getSetting({
                success(res) {
                  if (!res.authSetting['scope.record']) {
                    wx.authorize({
                      scope: 'scope.record',
                      success() {
                        recordStatus=true;
                        that.setData({
                          recordStatus: recordStatus
                        })
                      }
                    })
                  }
                }
              })
            }else{
              //记录开始录音时间
              that.setData({
                startTime: startTime
              })
              wx.showLoading({
                title: '开始录音',
                mask: true
              })
              recorderManager.onStart(() => {
                console.log('recorder start')
              })
              const options = {
                duration: 10000,
                sampleRate: 44100,
                numberOfChannels: 1,
                encodeBitRate: 96000,
                format: 'mp3',
                frameSize: 50
              }
              recorderManager.start(options);
            }
     
    },
    //松开按钮
    endHandle: function (e) {
              var that = this;
              var recordStatus = that.data.recordStatus;
              console.log(recordStatus);
              if (recordStatus){
                var endTime = e.timeStamp;
                var speakTime = endTime-that.data.startTime;
                //如果录音时间太短,提示
                if (speakTime < 350 ){
                  wx.showToast({
                    title: '说话时间太短',
                    icon: 'none',
                  })
                  recorderManager.stop();
                }else{ 
                          wx.hideLoading();
                          wx.showToast({
                              title: '正在努力搜索',
                              icon: 'loading',
                              duration: 6000,
                              mask: true
                          })
                          recorderManager.onStop((res) => {
                              const { tempFilePath } = res;
                                  //上传录制的音频
                                  wx.uploadFile({                                                                   url:'https://cookbook.cityshop.com.cn/index.php?r=product/tune',
                                      filePath: tempFilePath,
                                      name: 'viceo',
                                      success: function (res) {
                                          wx.hideToast();
                                          //如果为空
                                          if (res.statusCode!=500){
                                            that.wxSearchAddHisKey(res.data);
                                          }
                                          if (speakTime >= 350){
                                            wx.navigateTo({
                                              url: '../result/result?searchValue=' + res.data
                                            })
                                          }
                                      }
                              })
                          })
                          //触发录音停止
                          recorderManager.stop();
                }
              }
    },