原因分析

场景:在线上版小程序调用wx.saveImageToPhotosAlbum(Object object)无法获取权限用户保存相册权限;而在体验版和开发版能成功获取。

原因:提交审核时未勾选"采集用户隐私"

  • 小程序开发版/体验版放宽了很多权限,而线上版对权限校验非常严格

需要勾选"采集用户隐私"(默认无勾选)
在这里插入图片描述
如果是首次采集用户隐私,需要设置隐私条款
在这里插入图片描述

官方文档

官方文档:wx.saveImageToPhotosAlbum(Object object)

参考代码

参考代码:本人使用了 uni-app 框架的 API,但大体是与微信官方一致的

      <button class="save-btn" @click="handleSaveImage">
        <text class="iconfont icon-save"></text>
        保存图片
      </button>
// 保存分享图片
const handleSaveImage = async () => {
  try {
    // 第一步:立即获取相册权限
    const authRes = await new Promise((resolve) => {
      uni.getSetting({
        success: (res) => {
          if (!res.authSetting['scope.writePhotosAlbum']) {
            uni.authorize({
              scope: 'scope.writePhotosAlbum',
              success: () => resolve(true),
              fail: () => {
                uni.showModal({
                  title: '提示',
                  content: '需要您授权保存图片到相册',
                  success: (modalRes) => {
                    if (modalRes.confirm) {
                      uni.openSetting()
                    }
                  },
                })
                resolve(false)
              },
            })
          } else {
            resolve(true)
          }
        },
        fail: () => resolve(false),
      })
    })

    if (!authRes) return

    // 第二步:业务代码(略)

    uni.showLoading({ title: '正在保存...' })

    // 第三步:获取图片URL
    const posterRes = await getPostURLAPI({ questionId, userStore })
    if (!posterRes?.data?.data) {
      throw new Error('获取海报URL失败')
    }

    const imageUrl = posterRes.data.data

    // 第四步:下载并保存图片
    const downloadRes = await new Promise((resolve, reject) => {
      uni.downloadFile({
        url: imageUrl,
        success: (res) => {
          if (res.statusCode === 200) {
            uni.saveImageToPhotosAlbum({
              filePath: res.tempFilePath,
              success: () => resolve(true),
              fail: (err) => {
                console.error('保存到相册失败:', err)
                reject(new Error('保存到相册失败'))
              },
            })
          } else {
            reject(new Error('图片下载失败'))
          }
        },
        fail: () => reject(new Error('图片下载失败')),
      })
    })

    if (downloadRes) {
      uni.showToast({
        title: '保存成功',
        icon: 'success',
      })
    }
  } catch (error: any) {
    console.error('保存图片失败:', error)
    uni.showToast({
      title: error?.message || '保存失败',
      icon: 'error',
    })
  } finally {
    uni.hideLoading()
  }
}

代码可能有点冗余(屎山),只需要看关键的uni.saveImageToPhotosAlbum(Object object)即可

更多推荐