小程序開發-保存圖片到相冊 - 新聞資(zī)訊 - 雲南小程序開發|雲南軟件開發|雲南網站(zhàn)建設-西山區知普網絡科技工作室

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不管是網站(zhàn),軟件還是小程序,都要直接或間接能為您産生價值,我們在追求其視覺表現的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網站(zhàn)成為營銷工具,讓軟件能切實提升企業(yè)内部管理水平和(hé)效率。優秀的程序為後期升級提供便捷的支持!

小程序開發-保存圖片到相冊

發表時間:2021-1-6

發布人:葵宇科技

浏覽次數:40

在做小程序項目的時候,有需求要做一個(gè)開票功能,開票之後自然就需要查看發票,在讓後台做成圖片返回之後,我想了一下(xià),查看發票除了需要看發票圖片,提供預覽圖片可(kě)以放大縮小看外,最好應該還要有一個(gè)保存圖片的功能吧。

剛好微信小程序提供了預覽和(hé)保存相冊兩個(gè)API,就正好用上。因為預覽比較簡單,我就隻是把保存相冊的開發流程寫下(xià)來,供大家也供自己往後參考了,有什麼問(wèn)題大家可(kě)以直接指正。

步驟一:編寫HTML布局結構:

<button class="default-btn" hover-class="default-btn-active" bindtap="saveInvoice">保存</button>

布局裡一個(gè)按鈕,是調起保存相冊API的,也就保存功能的按鈕。

步驟二:編寫調用保存相冊API的邏輯代碼:

因為保存相冊API中(zhōng)的filePath參數是需要圖片文(wén)件路(lù)徑的,而我拿到的是圖片的base64數據,所以需要結合writeFile()的API先把圖片文(wén)件寫入設置的用戶路(lù)徑,再用路(lù)徑去調用保存相冊API來完成保存操作。

是不是大家覺得這樣寫完就完事啦?當初我也以為是這樣的,寫完之後我自測了一下(xià),一點按鈕就會彈出“允許保存相冊”的授權框,允許後圖片就保存下(xià)來啦,爽歪歪~~

但是,在我再次自測的時候,點了按鈕發現沒有任何反應,然後通(tōng)過fail的監聽失敗事件發現原來是因為我之前授權的時候選擇了拒絕,然後點保存按鈕,它就再也沒詢問(wèn)我授權而是直接獲取了之前拒絕的授權記錄跳到失敗去了。

好吧,掉進一個(gè)坑裡,隻能撸起袖子(zǐ)填了。既然拒絕授權被記錄了,那有沒有辦法在每次點保存的時候查一下(xià)授權,如(rú)果未允許的就主動(dòng)調起授權彈窗,這樣就能保證未授權的會再次彈出授權彈窗,已授權的就正常調用API。

方法一:

使用wx.getSetting獲取用戶當前的授權狀态,如(rú)果是未授權的,就使用 wx.authorize 向用戶發起授權請求,這樣是不是就能達到目的了。
很遺憾,經過實踐之後發現在拒絕授權後使用這個(gè)方法,依然是不可(kě)行的,沒有再重新調起授權彈窗了。(既然不成功,代碼就不展示了)

再次經過百度,發現可(kě)以通(tōng)過調用 wx.openSetting 打開設置界面,引導用戶開啟授權,這樣拒絕的授權就可(kě)以調整過來啦。

方法二:

先附上代碼:

<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>

/*下(xià)載發票圖片*/
  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('保存失敗');
      }
    });
  },
  /*保存發票圖片到用戶相冊,調用小程序API*/
  /*要考慮處理用戶拒絕授權之後如(rú)何重新調起授權請求的問(wèn)題*/
  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('保存失敗');
        }
      }
    });
  },

  /*用戶手動(dòng)重新授權*/
  handleSetting: function(e) {
    var self = this;
    if (!e.detail.authSetting['scope.writePhotosAlbum']) {
      wx.showModal({
        title: '提示',
        content: '若不打開授權,則無法将圖片保存在相冊中(zhōng)!',
        showCancel: false
      });
      self.setData({
        openSettingBtnHidden: true
      })
    } else {
      wx.showModal({
        title: '提示',
        content: '您已授權,趕緊将圖片保存在相冊中(zhōng)吧!',
        showCancel: false
      })
      self.setData({
        openSettingBtnHidden: true
      })
    }
  }

思路(lù):

  1. 首先成功的邏輯還是保留,也就是如(rú)果第一次授權用戶允許了,基本上邏輯還是一樣的;
  2. 在調用wx.saveImageToPhotosAlbum()API中(zhōng)fail監聽中(zhōng)添加判斷邏輯,如(rú)果是因拒絕授權而失敗的情況,就會提供重新授權的按鈕。按鈕使用open-type="openSetting"開放能力,點擊就能調起打開授權設置界面,用戶就可(kě)以修改授權。
    3.用戶手動(dòng)重新授權之後的處理邏輯,查詢用戶是否真的允許了某個(gè)授權,若是,則提示成功,讓用戶重新點擊保存即可(kě);若否,則提醒用戶因其未授權導緻無法使用保存功能。

作者:lincimy
來源:簡書

 

相關(guān)案例查看更多