需求:钉钉小程序需要支持语音录入并且录入之后需要播放,本文档不是完整代码,是关键的代码(需要后端配合存储录入后的信息,在需要播放时再响应,全栈就自己干)
实现思路:
1:当按钮按下时,通过钉钉api:dd.getRecorderManager().onstart()开始录入语音
2:当手指松开时,通过钉钉api:dd.getRecorderManager().onstop()停止录入,获取到录音的数据tempFilePath和duration,地址和录音时长,这时如果要在详情页播放的话,就需要把数据传给自己的后端保存起来(本项目是在整个页面输入完成点击保存后才传给后端保存起来的)
3:当点击播放时,通过钉钉api:dd.getBackgroundAudioManager().play()进行播放,播放之前需要设置 src title,设置title是为了兼容安卓端的某些bug,可以设置为空字符串
效果图
页面保存方法,参数是和后端定义的接口
遮罩层的axml
js代码
// 按下
handlerTouchStart() {
console.log('按下=========')
this.setData({
countTime: 0
})
if (!this.data.canIUseRm) {
dd.alert({ content: '请升级钉钉版本至4.5.18以支持录音功能' }) // 端上不支持
return
}
this.setData({
isClickYuyin: true
})
// 计时开始
let count = 0
this.timer = setInterval(() => {
count += 1
this.setData({
countTime: count
})
}, 1000)
let rm = dd.getRecorderManager()
rm.onstart = (res) => {
console.log('录音开始了')
}
rm.onerror = (err) => {
console.log('录音开始报错了:', err)
}
rm.start({
duration: 180
})
},
// 松开手
handlerTouchEnd() {
if (!this.data.canIUseRm) {
dd.alert({ content: '请升级钉钉版本至4.5.18以支持录音功能' }) // 端上不支持
return
}
this.setData({
showYuyin: false, // 关闭遮罩层
isClickYuyin: false,
})
console.log('松开=========')
clearInterval(this.timer)
let rm = dd.getRecorderManager()
rm.onstop = (res) => {
if (dd.getSystemInfoSync().platform.toLowerCase() === 'ios') {
console.log('ios端=============================')
this.setData({
mediaId: res.tempFilePath,
duration: Number(res.duration).toFixed(1)
})
} else {
console.log('安卓端=============================')
this.setData({
mediaId: res.tempFilePath,
duration: (Number(res.duration) / 1000).toFixed(1)
})
}
}
rm.onerror = (err) => {
console.log('录音结束报错了:', err)
}
rm.stop()
},
// 播放语音
playAudio() {
if (!this.data.canIUseRm) {
dd.alert({ content: '请升级钉钉版本至4.5.18以支持录音功能' }) // 端上不支持
return
}
this.setData({
isPlay: true
})
let bam = dd.getBackgroundAudioManager()
bam.src = this.data.mediaId
setTimeout(() => {
this.setData({
isPlay: false
})
}, Number(`${this.data.duration}`) * 1000 || 0)
},
// 关闭遮罩层
closeMask() {
this.setData({
showYuyin: false
})
},