前言:

首先我们要知道,如果小程序首次发起授权被拒绝之后,再次点击同一个按钮执行的wx.authorize(...)不会再弹出授权窗口。所以我们需要到引导用户到设置页面进行手动授权。
引导用户到设置页面授权的方式有两种:
第一种:使用小程序api :wx.openSetting(...)打开设置页面
第二种:使用button按钮,并写上如下代码,点击此按钮打开设置页面

<button bindopensetting="onOpenSetting" open-type="openSetting" > 保存图片到手机
</button>

业务思路:

1、保存图片到相册的api:wx.saveImageToPhotosAlbum()需要用户授权scope.writePhotosAlbum,所以我们一开始就要先判断用户是否已经授予这个权限了。wx.getSetting(...)来获取用户授予了哪些权限,再进行判断。
2、如果用户没有授予这个权限
情况一:首次打开小程序,那么就调用
wx.authorize({scope: 'scope.writePhotosAlbum'})
来发起授权弹窗请求;
情况二:首次已经发起授权弹框了,但是用户拒绝授权了。我们就需要引导用户到设置页面进行手动授权。
3、用户已经授权了之后就可以使用wx.downloadFile(...)获取临时本地保存路径,然后调用wx.saveImageToPhotosAlbum(...)保存图片到临时路径相册中了。

详细代码:

1、saveImg.wxml

<view class="box"><image class="img" src="{{photoUrl}}" bindtap='onPreviewImage'></image><view class="btn"><button wx:if="{{!isAuthSavePhoto}}" bindtap="onSaveToPhone"  class="btn button-hover" >保存图片到手机</button><button wx:else bind:tap="showModal"  class="btn button-hover" >            保存图片到手机</button><!-- 我们不使用点击按钮即打开设置页面的方式,而是使用上面那种先显示提示框让用户点确定按钮后再打开设置页面 --><!-- <button wx:else bind:opensetting="onOpenSetting" open-type="openSetting"  class="btn button-hover" >  保存二维码到手机</button> --></view>
</view>

2、saveImg.wxss

page {background: #fff;text-align: center;
}.box {padding: 30rpx 80rpx;
}.img {width: 430rpx;height: 430rpx;margin: 20rpx 0;
}
button {width: 100%;background: #ffffff;border: none;border-radius: 0rpx;padding: 0;margin: 0;
}.btn {background: green;color: #ffffff;border-radius: 0;
}

3、saveImg.js

Page({data:{photoUrl: "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1003256280,1176261798&fm=26&gp=0.jpg",//(用来控制显示哪个按钮) false表示还没首次进行弹框授权,或者已经授权了;true表示在首次授权弹框时拒绝授权,或者在设置页面还是拒绝了授权isAuthSavePhoto: false, },// 保存图片到手机onSaveToPhone() {this.getSetting().then((res) => {// 判断用户是否授权了保存到本地的权限if (!res.authSetting['scope.writePhotosAlbum']) {this.authorize().then(() => {this.savedownloadFile(this.data.photoUrl)this.setData({isAuthSavePhoto: false})}).catch(() => {wx.showToast({title: '您拒绝了授权',icon: 'none',duration: 1500})this.setData({isAuthSavePhoto: true})})} else {this.savedownloadFile(this.data.photoUrl)}})},//打开设置,引导用户授权onOpenSetting() {wx.openSetting({success:(res) => {console.log(res.authSetting)if (!res.authSetting['scope.writePhotosAlbum']) {wx.showToast({title: '您未授权',icon: 'none',duration: 1500})this.setData({// 拒绝授权isAuthSavePhoto: true})} else {// 接受授权this.setData({isAuthSavePhoto: false})this.onSaveToPhone() // 接受授权后保存图片}}})},// 获取用户已经授予了哪些权限getSetting() {return new Promise((resolve, reject) => {wx.getSetting({success: res => {resolve(res)}})})},// 发起首次授权请求authorize() {return new Promise((resolve, reject) => {wx.authorize({scope: 'scope.writePhotosAlbum',success: () => {resolve()},fail: res => { //这里是用户拒绝授权后的回调console.log('拒绝授权')reject()}})})},savedownloadFile(img) {this.downLoadFile(img).then((res) => {return this.saveImageToPhotosAlbum(res.tempFilePath)}).then(() => {      })},//单文件下载(下载文件资源到本地),客户端直接发起一个 HTTPS GET 请求,返回文件的本地临时路径。downLoadFile(img) {return new Promise((resolve, reject) => {wx.downloadFile({url: img,success: (res) => {console.log('downloadfile', res)resolve(res)}})})},// 保存图片到系统相册saveImageToPhotosAlbum(saveUrl) {return new Promise((resolve, reject) => {wx.saveImageToPhotosAlbum({filePath: saveUrl,success: (res) => {wx.showToast({title: '保存成功',duration: 1000,})resolve()}})})},// 弹出模态框提示用户是否要去设置页授权showModal(){wx.showModal({title: '检测到您没有打开保存到相册的权限,是否前往设置打开?',success: (res) => {if (res.confirm) {console.log('用户点击确定')this.onOpenSetting() // 打开设置页面          } else if (res.cancel) {console.log('用户点击取消')}}})}
})

ps:注意练习的时候要在开发者工具中勾上“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书” 这个选项,不然会报域名类的错误。

微信小程序——保存图片到手机相册(代码详解)相关推荐

  1. 微信小程序和百度的语音识别接口详解

    介绍 因为项目需要,使用到了微信小程序和百度的语音接口 现在将项目中的一个小模块拿出来单独分享. 技术关键字 微微信小程序 百度语音接口 nodejs,express fluent-ffmegp 环境 ...

  2. 微信小程序php后台支付,微信小程序 支付功能实现PHP实例详解

    微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee' ...

  3. 微信小程序开发登录界面mysql_微信小程序 欢迎界面开发的实例详解

    微信小程序 欢迎界面 市面上大多数的app都会有一个欢迎界面,下面将演示如何通过微信小程序实现一个欢迎界面. 下面将会按照以下的顺序介绍: 布局的实现 逻辑的实现 样式的实现 1.布局的实现 整个布局 ...

  4. 《微信小程序:开发入门及案例详解》—— 3.4 小结

    本节书摘来自华章出版社<微信小程序:开发入门及案例详解>一 书中的第3章,第3.4节,作者李骏 边思,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 3.4 小 ...

  5. 微信小程序阻止冒泡点击_微信小程序bindtap事件与冒泡阻止详解

    bindtap就是点击事件 在.wxml文件绑定: cilck here 在一个组件的属性上添加bindtap并赋予一个值(一个函数名) 当点击该组件时, 会触发相应的函数执行 在后台.js文件中定义 ...

  6. 腾讯小程序 java编写_微信小程序 使用腾讯地图SDK详解及实现步骤

    微信小程序 使用腾讯地图SDK详解及实现步骤 近期在做一款彩票服务类项目中用到了腾讯地图提供的小程序解决方案,拿来给大家分享一下! 使用起来非常简单,就是一些功能还有待完善. 官方文档:http:// ...

  7. 微信小程序自定义组件子传父详解(多图)

    微信小程序自定义组件子传父详解 前言: 刚开始为了测试父传子,所以把页面的数组放在了父组件中 1. 然而子组件中绑定的自定义点击事件依然放在子组件的js文件中 2. 所以就会出现我们点击页面的文字能改 ...

  8. 微信小程序开发【六】-- wxss详解

    系列文章目录 微信小程序开发[一]-- 初识小程序 传送门 微信小程序开发[二]-- 小程序入门 传送门 微信小程序开发[三]-- 项目结构概述 传送门 微信小程序开发[四]-- 配置详解 传送门 微 ...

  9. 微信小程序 使用腾讯地图SDK详解及实现步骤

    信小程序 使用腾讯地图SDK详解及实现步骤 微信小程序JavaScript SDK: 官方文档:http://lbs.qq.com/qqmap_wx_jssdk/index.html 步骤: 1.申请 ...

最新文章

  1. 139邮箱发送邮件时候,zmail.server(from_mail,pwd) 该pwd可以不用是授权码,是密码就可以
  2. TCHAR char wchar_t PTSTR PCSTR printf() wprintf()——_tprintf()解析
  3. asp.net TemplateField模板中的Bind方法和Eval方法
  4. 雷讯和pix_青海叶陇沟金矿地质地球化学特征及找矿方向
  5. 分界符 EOF 不使用反斜杠转义的技巧
  6. ThinkPHP笔记——配置分组产生无法加载Index错误解决办法
  7. firebird 3.0 开发者指南_11月19日召开 2020 vivo开发者大会报名正式开启
  8. matlabapp窗口图像_matlab – 如何自定义App Designer图形的背景?
  9. 201521123057 《Java程序设计》第12周学习总结
  10. 指尖初体验之主屏幕操作
  11. 前端居中模板(常用HTML模板)
  12. 读取文件时,程序经历了什么?
  13. Python基础-迭代器生成器装饰器
  14. 计算机二级试题17,《计算机二级考试试题及答案17》.doc
  15. 领健医美管理软件、美如云医美、宏脉有什么差异性
  16. java中执行ddl语句,DDL(数据定义语言)
  17. Python初学者应该选择哪个版本
  18. 做好PMC管理三大工作,轻松搞定生产计划与物料控制
  19. Fiddler抓包6-打断点(bpu)
  20. 小米路由器提示网络连接问题

热门文章

  1. 神同步的智能运维体系和世界杯442阵型
  2. ThinkPhp学习笔记——创建数据数据库中的表单
  3. 笔记-动物病理(炎症)
  4. FPGA学习方向规划
  5. apriltag linux 编译,无法为python包“apriltag”、“apriltags”和“aruco”构建轮子
  6. 手把手教您搭建AR应用开发环境
  7. ppt如何导出成高清图片
  8. SSL/TLS工作原理
  9. 特征多项式、代数重数与几何重数
  10. Abnova丨Abnova Magnetic Beads磁珠标记方案