一:需要用到的API
1.uni.authorize(OBJECT) -- 提前向用户发起授权请求。
uni.authorize({scope: 'scope.userInfo',success() {console.log('授权成功');}
});
注:如果用户之前拒绝了授权,此接口会直接进入失败回调。一般需要搭配uni.getSetting
和uni.openSetting
使用。
2.uni.getSetting (Object object) --获取用户的当前设置消息
uni.getSetting({success(res) {if (res.authSetting['scope.userInfo']) {console.log('用户已授权');} else {console.log('用户未授权');}}
});
3.uni.openSetting(Object object) --用户手动进行授权设置
uni.openSetting();
4.uni.uploadFile(OBJECT) --将本地资源上传到开发者服务器
5. uni.saveImageToPhotosAlbum(OBJECT) --保存图片到系统相册
二:思路
1.过程
1.判断用户是否授权保存图片到系统相册
1:如果未授权(两种情况):调授权再保存图片
(1)用户第一次调用 (uni.authorize)
(2)用户之前拒绝授权 (uni.openSetting)
如果之前拒绝,过阵子想再次保存,需要判断是否第一次授权
(注意:前面已经提过了authorize只弹窗一次,如果之前拒绝过了,接口直接进入失败回调,所以需要判断是否首次)
2:如果已授权:直接保存图片
三:代码实现
1.先配置:manifest.json
"mp-weixin": {"permission": {"scope.writePhotosAlbum": {"desc": "你的图片将保存到手机相册"}},},
注: 微信小程序在2023年10月17日之后,使用API需要配置隐私协议
------获取具体信息请移步官方文档uni.chooseImage(OBJECT) | uni-app官网
2. 保存图片功能代码实现:(无判断授权情况)
downSaveImage(imgurl) {uni.showModal({title: '保存图片',content: '是否保存当前图片?',success: (res) => {if (res.confirm) {uni.downloadFile({url: imgurl,//图片地址success: (res) => {if (res.statusCode === 200) {// console.log(res.tempFilePath,'res.tempFilePathres.tempFilePath');uni.saveImageToPhotosAlbum({filePath: res.tempFilePath,success: function () {uni.showToast({title: '保存成功',duration: 2000,})},fail: function () {uni.showToast({title: '保存失败,请稍后重试',icon: 'none',})},})}},})} else if (res.cancel) {uni.showToast({title: "你取消了该操作",icon:'none',duration: 2000});}},})},
(2)用户授权情况部分代码
downSaveImage(imgurl) {uni.getSetting({success(res) {if (res.authSetting['scope.writePhotosAlbum']) {// 已授权,直接保存图片//这里写保存图片代码.......} else if (res.authSetting['scope.writePhotosAlbum'] === false) {// 用户已拒绝授权,提示用户授权uni.showModal({title: '提示',content: '您未授权保存图片到相册,是否前往设置页面进行授权?',success: function (res) {if (res.confirm) {uni.openSetting({success: function (res) {if (res.authSetting['scope.writePhotosAlbum']) {//这里写保存图片代码.......}},})} else if (res.cancel) {uni.showToast({title: '您取消了授权',icon: 'none',duration: 2000,})}},})} else {// 用户第一次调用,调用授权接口uni.authorize({scope: 'scope.writePhotosAlbum',success() {//这里写保存图片代码.......},fail() {uni.showToast({title: '授权失败,请稍后重试',icon: 'none',duration: 2000,})},})}},})},
(3)添加授权+保存图片功能的完整代码
downSaveImage(imgurl) {uni.getSetting({success(res) {if (res.authSetting['scope.writePhotosAlbum']) {// 已授权,直接保存图片uni.downloadFile({url: imgurl,success: (res) => {if (res.statusCode === 200) {uni.saveImageToPhotosAlbum({filePath: res.tempFilePath,success: function () {uni.showToast({title: '保存成功',duration: 2000,})},fail: function () {uni.showToast({title: '保存失败,请稍后重试',icon: 'none',})},})}},})} else if (res.authSetting['scope.writePhotosAlbum'] === false) {// 用户已拒绝授权,提示用户授权uni.showModal({title: '提示',content: '您未授权保存图片到相册,是否前往设置页面进行授权?',success: function (res) {if (res.confirm) {uni.openSetting({success: function (res) {if (res.authSetting['scope.writePhotosAlbum']) {uni.downloadFile({url: imgurl,success: (res) => {if (res.statusCode === 200) {uni.saveImageToPhotosAlbum({filePath: res.tempFilePath,success: function () {uni.showToast({title: '保存成功',duration: 2000,})},fail: function () {uni.showToast({title: '保存失败,请稍后重试',icon: 'none',})},})}},})}},})} else if (res.cancel) {uni.showToast({title: '您取消了授权',icon: 'none',duration: 2000,})}},})} else {// 用户第一次调用,调用授权接口uni.authorize({scope: 'scope.writePhotosAlbum',success() {uni.downloadFile({url: imgurl,success: (res) => {if (res.statusCode === 200) {uni.saveImageToPhotosAlbum({filePath: res.tempFilePath,success: function () {uni.showToast({title: '保存成功',duration: 2000,})},fail: function () {uni.showToast({title: '保存失败,请稍后重试',icon: 'none',})},})}},})},fail() {uni.showToast({title: '授权失败,请稍后重试',icon: 'none',duration: 2000,})},})}},})
}
四:项目中注意的问题:
1.微信小程序模拟器可以保存图片,但是手机真机调试不行。
原因:这可能是因为开发版的域名没有配置正确导致的。在开发版中,小程序的文件系统是虚拟的,而在正式版中,小程序的文件系统是真实存在的。因此,在开发版中,图片的路径可能会与正式版中不同
项目中如果图片地址是后台返回的临时地址,在微信小程序模拟器返回的地址开头是:
http://tmp/.......jpg
但是真机上调试返回图片地址开头是:
wxfile://tmp/......jpg
2.必须要先授权请求(authSetting)
如果直接(openSetting)让用户手动设置授权,打开的只是之前已经授权过的权限,看不到未请求的内容。
要用户先拒绝授权,再引导用户手动打开设置页面进行授权。这样用户在设置页面中就能看到所有的权限内容,包括未请求的权限,从而能够正确地进行授权操作。
ps:之前一直打开手动的,没有授权过,所以就没有想要的授权按钮,耗了好久还以为是什么大bug..........