小程序開發-保存圖片到(dào)相冊
發表時(shí)間:2021-1-6
發布人(rén):融晨科技
浏覽次數:50
在(zài)做小程序項目的(de)時(shí)候,有需求要(yào / yāo)做一個(gè)開票功能,開票之(zhī)後自然就(jiù)需要(yào / yāo)查看發票,在(zài)讓後台做成圖片返回之(zhī)後,我想了(le/liǎo)一下,查看發票除了(le/liǎo)需要(yào / yāo)看發票圖片,提供預覽圖片可以(yǐ)放大(dà)縮小看外,最好應該還要(yào / yāo)有一個(gè)保存圖片的(de)功能吧。
剛好微信小程序提供了(le/liǎo)預覽和(hé / huò)保存相冊兩個(gè)API,就(jiù)正好用上(shàng)。因爲(wéi / wèi)預覽比較簡單,我就(jiù)隻是(shì)把保存相冊的(de)開發流程寫下來(lái),供大(dà)家也(yě)供自己往後參考了(le/liǎo),有什麽問題大(dà)家可以(yǐ)直接指正。
步驟一:編寫HTML布局結構:
<button class="default-btn" hover-class="default-btn-active" bindtap="saveInvoice">保存</button>
布局裏一個(gè)按鈕,是(shì)調起保存相冊API的(de),也(yě)就(jiù)保存功能的(de)按鈕。
步驟二:編寫調用保存相冊API的(de)邏輯代碼:
因爲(wéi / wèi)保存相冊API中的(de)filePath
參數是(shì)需要(yào / yāo)圖片文件路徑的(de),而(ér)我拿到(dào)的(de)是(shì)圖片的(de)base64數據,所以(yǐ)需要(yào / yāo)結合writeFile()
的(de)API先把圖片文件寫入設置的(de)用戶路徑,再用路徑去調用保存相冊API來(lái)完成保存操作。
是(shì)不(bù)是(shì)大(dà)家覺得這(zhè)樣寫完就(jiù)完事啦?當初我也(yě)以(yǐ)爲(wéi / wèi)是(shì)這(zhè)樣的(de),寫完之(zhī)後我自測了(le/liǎo)一下,一點按鈕就(jiù)會彈出(chū)“允許保存相冊”的(de)授權框,允許後圖片就(jiù)保存下來(lái)啦,爽歪歪~~
但是(shì),在(zài)我再次自測的(de)時(shí)候,點了(le/liǎo)按鈕發現沒有任何反應,然後通過fail
的(de)監聽失敗事件發現原來(lái)是(shì)因爲(wéi / wèi)我之(zhī)前授權的(de)時(shí)候選擇了(le/liǎo)拒絕,然後點保存按鈕,它就(jiù)再也(yě)沒詢問我授權而(ér)是(shì)直接獲取了(le/liǎo)之(zhī)前拒絕的(de)授權記錄跳到(dào)失敗去了(le/liǎo)。
好吧,掉進一個(gè)坑裏,隻能撸起袖子(zǐ)填了(le/liǎo)。既然拒絕授權被記錄了(le/liǎo),那有沒有辦法在(zài)每次點保存的(de)時(shí)候查一下授權,如果未允許的(de)就(jiù)主動調起授權彈窗,這(zhè)樣就(jiù)能保證未授權的(de)會再次彈出(chū)授權彈窗,已授權的(de)就(jiù)正常調用API。
方法一:
使用wx.getSetting獲取用戶當前的(de)授權狀态,如果是(shì)未授權的(de),就(jiù)使用 wx.authorize 向用戶發起授權請求,這(zhè)樣是(shì)不(bù)是(shì)就(jiù)能達到(dào)目的(de)了(le/liǎo)。
很遺憾,經過實踐之(zhī)後發現在(zài)拒絕授權後使用這(zhè)個(gè)方法,依然是(shì)不(bù)可行的(de),沒有再重新調起授權彈窗了(le/liǎo)。(既然不(bù)成功,代碼就(jiù)不(bù)展示了(le/liǎo))
再次經過百度,發現可以(yǐ)通過調用 wx.openSetting 打開設置界面,引導用戶開啓授權,這(zhè)樣拒絕的(de)授權就(jiù)可以(yǐ)調整過來(lái)啦。
方法二:
先附上(shàng)代碼:
<button hidden='{{!openSettingBtnHidden}}' class="default-btn" hover-class="default-btn-active" bindtap="saveInvoice">保存</button>
<button hidden='{{openSettingBtnHidden}}' class="default-btn" hover-class="default-btn-active" open-type="openSetting" bindopensetting='handleSetting'>去授權</button>
/*下載發票圖片*/
saveInvoice: function () {
var self = this,
timestamp = new Date().getTime(),
file = wx.getFileSystemManager();
file.writeFile({
filePath: `${wx.env.USER_DATA_PATH}/invoice_${timestamp}.jpeg`,
data: self.data.invoiceImg,
encoding: 'base64',
success: res => {
self.saveToAlbum(timestamp);
},
fail: err => {
showMsg('保存失敗');
}
});
},
/*保存發票圖片到(dào)用戶相冊,調用小程序API*/
/*要(yào / yāo)考慮處理用戶拒絕授權之(zhī)後如何重新調起授權請求的(de)問題*/
saveToAlbum: function (timestamp) {
var self = this;
wx.saveImageToPhotosAlbum({
filePath: `${wx.env.USER_DATA_PATH}/invoice_${timestamp}.jpeg`,
success: res => {
showMsg('圖片已保存至相冊');
},
fail: err => {
console.log(err);
if (err.errMsg === 'saveImageToPhotosAlbum:fail auth deny' || err.errMsg === 'saveImageToPhotosAlbum:fail:auth denied') {
self.setData({
openSettingBtnHidden: false
});
showMsg('已拒絕授權,請點擊重新授權');
} else {
showMsg('保存失敗');
}
}
});
},
/*用戶手動重新授權*/
handleSetting: function(e) {
var self = this;
if (!e.detail.authSetting['scope.writePhotosAlbum']) {
wx.showModal({
title: '提示',
content: '若不(bù)打開授權,則無法将圖片保存在(zài)相冊中!',
showCancel: false
});
self.setData({
openSettingBtnHidden: true
})
} else {
wx.showModal({
title: '提示',
content: '您已授權,趕緊将圖片保存在(zài)相冊中吧!',
showCancel: false
})
self.setData({
openSettingBtnHidden: true
})
}
}
思路:
- 首先成功的(de)邏輯還是(shì)保留,也(yě)就(jiù)是(shì)如果第一次授權用戶允許了(le/liǎo),基本上(shàng)邏輯還是(shì)一樣的(de);
- 在(zài)調用
wx.saveImageToPhotosAlbum()
API中fail監聽中添加判斷邏輯,如果是(shì)因拒絕授權而(ér)失敗的(de)情況,就(jiù)會提供重新授權的(de)按鈕。按鈕使用open-type="openSetting"
開放能力,點擊就(jiù)能調起打開授權設置界面,用戶就(jiù)可以(yǐ)修改授權。
3.用戶手動重新授權之(zhī)後的(de)處理邏輯,查詢用戶是(shì)否真的(de)允許了(le/liǎo)某個(gè)授權,若是(shì),則提示成功,讓用戶重新點擊保存即可;若否,則提醒用戶因其未授權導緻無法使用保存功能。