当前位置: 首页 > news >正文

Uniapp/微信小程序授权设置并实现点击保存图片

一:需要用到的API

1.uni.authorize(OBJECT)     -- 提前向用户发起授权请求。

uni.authorize({scope: 'scope.userInfo',success() {console.log('授权成功');}
});

:如果用户之前拒绝了授权,此接口会直接进入失败回调。一般需要搭配uni.getSettinguni.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.downloadFile(OBJECT)  --下载文件资源到本地,客户端直接发起一个 HTTP GET 请求,返回文件的本地临时路径。

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

原因:临时地址是没用的,需要使用uni.uploadFile上传到服务器上转换永久地址

代码:

   uni.uploadFile({url: 'https://app.wugongyuan.cn/api/common/uploadFile', // 上传的服务器地址filePath: res, // 临时文件路径name: 'file', // 上传文件的字段名success: function (res) {this.upLoadImgUrl = JSON.parse(res.data).data.fileUrlconsole.log(this.upLoadImgUrl, 'upImgUrl---------------')// 为什么一直先走下面的// setTimeout(()=>{console.log(this.upLoadImgUrl, 'this.upLoadImgUrl')// that.downSaveImage(this.upLoadImgUrl)that.$tools.downSaveImage(this.upLoadImgUrl)// },5000)},fail: function (error) {console.log(error)// 处理上传失败的情况},})

以上会引起作用域this指向问题 ,可以参考另一篇文章函数内引入外部函数的调用顺序问题及解决方案-CSDN博客

2.必须要先授权请求(authSetting

如果直接(openSetting)让用户手动设置授权,打开的只是之前已经授权过的权限,看不到未请求的内容

要用户先拒绝授权再引导用户手动打开设置页面进行授权。这样用户在设置页面中就能看到所有的权限内容,包括未请求的权限,从而能够正确地进行授权操作。

ps:之前一直打开手动的,没有授权过,所以就没有想要的授权按钮,耗了好久还以为是什么大bug..........

相关文章:

  • 安路IP核应用举例(OSC、UART)
  • 互联网加竞赛 python+opencv+机器学习车牌识别
  • 四十二、Redis
  • 一些好用的VSCode扩展
  • C++:命名空间
  • input、el-input输入框输入规则
  • DevEco Studio 项目鸿蒙(HarmonyOS)资源引用(自定统和系统)
  • 【自定义Source、Sink】Flink自定义Source、Sink对ClickHouse进行读和批量写操作
  • 【模块化】 js 模块化(CommonJS, AMD, UMD, CMD, ES6)
  • linux系统命令
  • 基于OHTPPS实现网站HTTPS访问
  • 使用国内镜像源安装opencv
  • 计算机组成原理-选择语句和循环语句的汇编表示
  • 【数据结构】第二章——线性表(1)
  • linux(centos7)离线安装mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [译]Python中的类属性与实例属性的区别
  • echarts的各种常用效果展示
  • HomeBrew常规使用教程
  • Invalidate和postInvalidate的区别
  • JavaScript学习总结——原型
  • jquery ajax学习笔记
  • magento2项目上线注意事项
  • Vue.js 移动端适配之 vw 解决方案
  • vue.js框架原理浅析
  • win10下安装mysql5.7
  • 彻底搞懂浏览器Event-loop
  • 对JS继承的一点思考
  • 技术胖1-4季视频复习— (看视频笔记)
  • 力扣(LeetCode)357
  • 实现简单的正则表达式引擎
  • 手写双向链表LinkedList的几个常用功能
  • 项目管理碎碎念系列之一:干系人管理
  • 用jQuery怎么做到前后端分离
  • 在Mac OS X上安装 Ruby运行环境
  • 积累各种好的链接
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • !$boo在php中什么意思,php前戏
  • #、%和$符号在OGNL表达式中经常出现
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (算法二)滑动窗口
  • (一)kafka实战——kafka源码编译启动
  • (一)认识微服务
  • .NET NPOI导出Excel详解
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net6使用Sejil可视化日志
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题