最近写个视频详情页,有下载视频的功能,百度一堆文档,但是千篇一律的都看不太明白,总归是太菜了,从头开始研究一番
第一步
需要查询用户的授权情况,获取用户设置 wx.getSetting()
返回值中只会出现小程序已经向用户请求过的权限。
授权总结了三种情况:
1.用户从来没有授权过,res.authSetting['scope.writePhotosAlbum
']===undefined
需要wx.authorize:提前向用户发起授权请求。调用后弹出弹框向用户询问授权,如果用户已经授权,就不会弹出弹框,直接success
wx.authorize({
scope:'scope.writePhotosAlbum',
success(){
//保存视频
},
fail(){
//提示:拒绝授权后不能保存视频到相册
}
})
2.用户授权过之后又关闭授权,!res.authSetting['scope.writePhotosAlbum
']
需要wx.openSetting
:调起客户端小程序设置界面,返回用户设置的操作结果。设置界面只会出现小程序向用户请求过的权限。
(openSetting在模拟器不起作用,需要真机调试)
wx.openSetting({
success(res){
//用户手动打开保存视频权限
if(res.authSetting['scope.writePhotosAlbum']){
//保存视频
return
}
wx.showToast({title:'未授权,无法保存到相册',icon:'none'})
},
fail(){
//提示授权失败
}
})
3.用户已经授权,可以直接保存
第二步
下载视频
1.要先下载到本地获取临时路径
let fileName = new Date().valueOf();
wx.downloadFile({
url: link,
filePath: wx.env.USER_DATA_PATH + '/' + fileName + '.mp4',
success(res){
//保存res.filePath
}
})
2.用临时路径保存到相册
wx.saveVideoToPhotosAlbum({
filePath,
success(){
//保存成功,删除临时文件
},
fail(){
//保存失败
}
})
3.成功后再删除临时文件
let fileMgr = wx.getFileSystemManager();
fileMgr.unlink({//删除临时文件
filePath: wx.env.USER_DATA_PATH + '/' + fileName + '.mp4',
})
完整代码
//保存视频
handleDownload(){
let fileName = new Date().valueOf();
wx.downloadFile({
url: link,
filePath: wx.env.USER_DATA_PATH + '/' + fileName + '.mp4',
success: res => {
let filePath = res.filePath;//下载到本地获取临时路径
wx.saveVideoToPhotosAlbum({//保存到相册
filePath,
success: file => {
wx.showToast({
title: '保存成功',
icon: 'success',
duration:3000
})
let fileMgr = wx.getFileSystemManager();
fileMgr.unlink({//删除临时文件
filePath: wx.env.USER_DATA_PATH + '/' + fileName + '.mp4',
})
},
fail: err => {
wx.showToast({
title: '保存失败',
icon: 'none'
});
},
complete() {
wx.hideLoading()
}
})
},
fail(e) {
wx.showToast({
title: '保存失败',
icon: 'none'
});
},
complete() {
wx.hideLoading();
}
})
}
//获取用户授权
getUserSetting(){
wx.showLoading({
title: '加载中...',
mask: true,
});
let that=this
wx.getSetting({
success(res){
if(res.authSetting['scope.writePhotosAlbum'] === undefined){
wx.authorize({
scope: 'scope.writePhotosAlbum',
success() {
console.log('打开了授权')
that.handleDownload()
},
fail(err) {
wx.showToast({
title: '授权失败',
icon: 'none'
});
}
})
}else if(!res.authSetting['scope.writePhotosAlbum']){
wx.openSetting({
success(res) {
console.log(res)
if (res.authSetting['scope.writePhotosAlbum']) {
console.log('授权了')
that.handleDownload()
} else {
wx.showToast({
title: '您没有授权,无法保存到相册',
icon: 'none'
})
}
},
fail(err) {
wx.showToast({
title: '授权失败',
icon: 'none'
});
},
})
}else{
that.handleDownload()
}
},
fail(){
wx.showToast({
title: '加载失败',
icon: 'none'
});
},
complete(){
wx.hideLoading()
}
})
}
tips
:最后遇到了个小问题,在保存时downloadFile fail了,输出error是downloadFile:fail:url not in domain list
模拟器和真机调试都没问题,体验版会报错
问题就是没有配置downloadFile合法域名
把校验关掉,模拟器就能提示错误了
然后在开发设置里面配置服务器域名的downloadFile合法域名,一定是downloadFile合法域名,配置在request里面是没有用的
还有一种情况,就是url是http开头,替换掉就好了
link = "http.....".replace("http:","https:")
wx.downloadFile({
url:link ,
success(){},
fail(){}
})