因为重构代码,多花了一点时间,久等了。。

上一篇文章实现了音频文件缓存功能,做到了一次下载多次播放。但是还有一个问题:这个功能是作为app的一个功能而存在,如果想在其他场合使用就必须是代码层次的拷贝和粘贴。不好。

我们继续改进,将这部分功能做成一个通用,独立模块。

voiceplay.js

//voice player
function prepare(){
var that = this
var info_pair = wx.getStorageSync('url2FileMap') || [];
this.urlMap = new Map();
info_pair.forEach(function(pair){
that.urlMap.set(pair.url, pair.file);
});
}

function saveMap(){
var info_pair = []
this.urlMap.forEach(function(file, url, map){
info_pair.push({url:url, file:file})
});
wx.setStorageSync('url2FileMap', info_pair);
}

//播放铃声文件,优先使用缓存文件,根据需要下载。
//var url = that.getRingtoneUrl(index)
function play(url) {
const app = getApp()
var that = this
var savedFile = this.urlMap.get(url)
if (savedFile != undefined) {
//已经存在缓存文件,直接播放缓存文件
app.addLog('播放缓存铃声')
wx.playVoice({
filePath: savedFile,
fail: function () {
//播放缓存文件失败,清除缓存文件信息
that.urlMap.delete(url);
that.saveMap();
//下载并播放缓存文件
that.downloadAndPlay(url)
},
})
} else {
//没有缓存文件,下载并播放
app.addLog('that.downloadAndPlay')
that.downloadAndPlay(url)
}
}

//下载,保存,播放铃声文件。
function downloadAndPlay(url) {
const app = getApp()
var that = this
that.downloadFile({
url: url,
success: function (savedFilePath) {
app.addLog('saveFileSuccess')
//下载成功,播放文件
app.addLog('播放下载铃声')
wx.playVoice({
filePath: savedFilePath,
})
//更新缓存文件信息。
that.urlMap.set(url,savedFilePath);
that.saveMap();
}
})
}

//下载并保存文件
function downloadFile(parameter) {
const app = getApp()
var that = this
wx.downloadFile({
url: parameter.url,
success: function (res) {
//保存临时文件,以供将来使用
wx.saveFile({
tempFilePath: res.tempFilePath,
success: function (save_res) {
parameter.success(save_res.savedFilePath)
}
})
},
})
}

module.exports = {
prepare: prepare,
play: play,
downloadAndPlay:downloadAndPlay,
downloadFile:downloadFile,
saveMap:saveMap
}

用法


经过上述处理,我们就得到了一个通用的音频播放模块,可以在直接在其他小程序中使用。一共分三步,每步就一行。


导入模块


const voiceplayer = require('./utils/voiceplayer.js')


目录有可能需要根据目录结构修改。


初始化


voiceplayer.prepare()


调用prepare函数,取得已经保存的缓存文件信息。


播放音频

voiceplayer.play(media_file_url)


调用play函数,播放指定的音频文件。如果没有缓存文件则首先下载该文件播放并保存以供下次使用。音频文件需要另外准备。


代码下载链接


voiceplayer.js


​https://raw.githubusercontent.com/xueweiguo/alarmmap/master/utils/voiceplayer.js​


写在文章的最后


既然已经读到这里了,拜托大家再用一分钟时间,将文章转发到各位的朋友圈,微信群中。本公众号的成长需要您的支持!

以上就是今天的文章,欢迎点赞并推荐给您的朋友!

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】


EA&UML日拱一卒-微信小程序实战:位置闹铃 (12)-这还不算完_微