uniApp下载图片到手机相册,适配Android、Ios、微信小步伐、H5 ...

打印 上一主题 下一主题

主题 1043|帖子 1043|积分 3129

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.根据不同设备展示不同的按钮

1.1 图片显示

  1.         <view class="image">
  2.                 <image :src="url" mode="widthFix"></image>
  3.         </view>
复制代码
1.2 微信小步伐显示的按钮

  1.         <!-- #ifdef MP-WEIXIN -->
  2.                         <view class="uni-flex align-items justify-align-center download backgroundColor" v-if="openSettingBtnHidden"
  3.                                 @click="saveEwm">下 载</view>
  4.                         <button class="uni-flex align-items justify-align-center download backgroundColor" v-else hover-class="none"
  5.                                 open-type="openSetting" @opensetting="handleSetting">下 载</button>
  6.         <!-- #endif -->
复制代码
1.3 h5显示的按钮

  1.         <!-- #ifdef H5 -->
  2.                         <view class="uni-flex align-items justify-align-center btn backgroundColor" @click="saveImgToLocal">下 载
  3.                         </view>
  4.         <!-- #endif -->
复制代码
1.4 app显示的按钮

  1.         <!-- #ifdef APP-PLUS -->
  2.        
  3.                         <!-- ios按钮 -->
  4.                         <button class=" uni-flex align-items justify-align-center  btn backgroundColor" v-if="isIos"
  5.                                 @click.stop="judgeIosPermission('photoLibrary')">下 载</button>
  6.                                
  7.                         <!-- Android按钮 -->
  8.                         <button class="uni-flex align-items justify-align-center btn backgroundColor" v-if="!isIos"
  9.                                 @click.stop="requestAndroidPermission('android.permission.WRITE_EXTERNAL_STORAGE')">
  10.                                 下 载
  11.                         </button>
  12.                        
  13.         <!-- #endif -->
复制代码
2. 引入需要用到的文件

  1. //获取手机相册的访问权限文件
  2. import permision from '@/common/permission.js'
  3. //封装的接口
  4. import Api from '@/api/apply.js'
复制代码
3. data中需要的数据

  1.         data() {
  2.                         return {
  3.                                 url: '',// 下载图片
  4.                                 openSettingBtnHidden: true, //是否授权
  5.                                 isIos:false,//判断app系统
  6.                         }
  7.                 },
复制代码
4. onload方法

  1.         // 判断是Android 还是 ios
  2.        
  3.                 // #ifdef APP-PLUS
  4.                 if (plus.os.name === 'Android') {
  5.                         this.isIos = false
  6.                 } else {
  7.                         this.isIos = true
  8.                 }
  9.                 // #endif
  10.         //获取接口返回的数据(图片)
  11.                 Api.getImage().then(res => {
  12.                         if (res.code == 200) {
  13.                                         this.url = res.data
  14.                                 }
  15.                 })
复制代码
5. methods需要用到的方法

  1.                         //ios端保存到相册
  2.                         judgeIosPermission(permisionID) {
  3.                                 let _this = this;
  4.                                 let result = permision.requestIOS(permisionID);
  5.                                 let strStatus = result ? '已' : '未';
  6.                                 if (strStatus == '已') {
  7.                                         if (!uni.getStorageSync('IosPHPhotoLibraryPermission')) {
  8.                                                 uni.showModal({
  9.                                                         content: permisionID + '权限' + strStatus + '获得授权',
  10.                                                         showCancel: false
  11.                                                 });
  12.                                                 uni.setStorageSync('IosPHPhotoLibraryPermission', true);
  13.                                         }
  14.                                         _this.saveImgToLocal(_this.url);
  15.                                 } else {
  16.                                         uni.showModal({
  17.                                                 content: permisionID + '权限' + strStatus + '获得授权',
  18.                                                 showCancel: false
  19.                                         });
  20.                                 }
  21.                         },
  22.                         //android端保存到相册
  23.                         async requestAndroidPermission(permisionID) {
  24.                                 let _this = this;
  25.                                 let result = await permision.requestAndroid(permisionID);
  26.                                 let strStatus;
  27.                                 if (result == 1) {
  28.                                         strStatus = '已获得授权';
  29.                                         if (!uni.getStorageSync('AndroidPHPhotoLibraryPermission')) {
  30.                                                 uni.showModal({
  31.                                                         content: permisionID + strStatus,
  32.                                                         showCancel: false
  33.                                                 });
  34.                                                 uni.setStorageSync('AndroidPHPhotoLibraryPermission', true);
  35.                                         }
  36.                                         _this.saveImgToLocal(_this.url);
  37.                                 } else if (result == 0) {
  38.                                         strStatus = '未获得授权';
  39.                                         uni.showModal({
  40.                                                 content: permisionID + strStatus,
  41.                                                 showCancel: false
  42.                                         });
  43.                                 } else {
  44.                                         strStatus = '被永久拒绝权限';
  45.                                         uni.showModal({
  46.                                                 content: permisionID + strStatus,
  47.                                                 showCancel: false
  48.                                         });
  49.                                 }
  50.                         },
  51.                         //微信小程序保存到相册
  52.                         handleSetting(e) {
  53.                                 if (!e.detail.authSetting['scope.writePhotosAlbum']) {
  54.                                         this.openSettingBtnHidden = false;
  55.                                 } else {
  56.                                         this.openSettingBtnHidden = true;
  57.                                 }
  58.                         },
  59.                         saveEwm(e) {
  60.                                 //获取相册授权
  61.                                 let _this = this;
  62.                                 uni.getSetting({
  63.                                         success(res) {
  64.                                                 if (!res.authSetting['scope.writePhotosAlbum']) {
  65.                                                         uni.authorize({
  66.                                                                 scope: 'scope.writePhotosAlbum',
  67.                                                                 success() {
  68.                                                                         _this.saveImgToLocal(_this.url);
  69.                                                                 },
  70.                                                                 fail() {
  71.                                                                         //这里是用户拒绝授权后的回调
  72.                                                                         _this.openSettingBtnHidden = false;
  73.                                                                 }
  74.                                                         });
  75.                                                 } else {
  76.                                                         //用户已经授权过了
  77.                                                         _this.saveImgToLocal(_this.url);
  78.                                                 }
  79.                                         }
  80.                                 });
  81.                         },
  82.                         saveImgToLocal(e, num) {
  83.                                 if (num == 1) {
  84.                                         uni.showModal({
  85.                                                 title: '提示',
  86.                                                 content: '确定保存到相册吗',
  87.                                                 success: res => {
  88.                                                         if (res.confirm) {
  89.                                                                 uni.downloadFile({
  90.                                                                         url: e.replace('http', 'https'), //图片地址
  91.                                                                         success: res => {
  92.                                                                                 if (res.statusCode === 200) {
  93.                                                                                         uni.saveImageToPhotosAlbum({
  94.                                                                                                 filePath: res.tempFilePath,
  95.                                                                                                 success: function() {
  96.                                                                                                         uni.showToast({
  97.                                                                                                                 title: '保存成功到相册',
  98.                                                                                                                 icon: 'none'
  99.                                                                                                         });
  100.                                                                                                 },
  101.                                                                                                 fail: function() {
  102.                                                                                                         uni.showToast({
  103.                                                                                                                 title: '保存失败',
  104.                                                                                                                 icon: 'none'
  105.                                                                                                         });
  106.                                                                                                 }
  107.                                                                                         });
  108.                                                                                 }
  109.                                                                         }
  110.                                                                 });
  111.                                                         } else if (res.cancel) {}
  112.                                                 }
  113.                                         });
  114.                                 } else {
  115.                                         uni.downloadFile({
  116.                                                 url: e.replace('http', 'https'), //图片地址
  117.                                                 success: res => {
  118.                                                         if (res.statusCode === 200) {
  119.                                                                 uni.saveImageToPhotosAlbum({
  120.                                                                         filePath: res.tempFilePath,
  121.                                                                         success: function() {
  122.                                                                                 uni.showToast({
  123.                                                                                         title: '保存成功到相册',
  124.                                                                                         icon: 'none'
  125.                                                                                 });
  126.                                                                         },
  127.                                                                         fail: function() {
  128.                                                                                 uni.showToast({
  129.                                                                                         title: '保存失败',
  130.                                                                                         icon: 'none'
  131.                                                                                 });
  132.                                                                         }
  133.                                                                 });
  134.                                                         }
  135.                                                 }
  136.                                         });
  137.                                 }
  138.                         },
  139.                         previewFile() {
  140.                                 // #ifdef  APP || MP
  141.                                 uni.downloadFile({
  142.                                         url: this.url , //后端返回的文件地址
  143.                                         success: function(res) {
  144.                                                 console.log(res, '下载成功')
  145.                                                 if (res.code === 200) {
  146.                                                         // 打开文件
  147.                                                         uni.saveFile({
  148.                                                                 tempFilePath: res.tempFilePath, //临时路径
  149.                                                                 success: function(res) {
  150.                                                                         uni.showToast({
  151.                                                                                 icon: 'none',
  152.                                                                                 mask: true,
  153.                                                                                 title: '文件已保存:' + res.savedFilePath, //保存路径
  154.                                                                                 duration: 3000,
  155.                                                                         });
  156.                                                                         setTimeout(() => {
  157.                                                                                 //打开文档查看
  158.                                                                                 uni.openDocument({
  159.                                                                                         filePath: res.savedFilePath,
  160.                                                                                         success: function(res) {
  161.                                                                                                 console.log('打开文档成功');
  162.                                                                                         }
  163.                                                                                 });
  164.                                                                         }, 3000)
  165.                                                                 }
  166.                                                         });
  167.                                                 } else {
  168.                                                         uni.showToast({
  169.                                                                 title: '打开文件失败请重试',
  170.                                                                 icon: 'none'
  171.                                                         })
  172.                                                 }
  173.                                                 uni.hideLoading()
  174.                                         },
  175.                                         fail: (err) => {
  176.                                                 uni.hideLoading()
  177.                                                 console.log(err, '下载失败')
  178.                                                 uni.showToast({
  179.                                                         title: '加载失败请重试',
  180.                                                         icon: "none"
  181.                                                 })
  182.                                         }
  183.                                 })
  184.                                 // #endif
  185.                         }
复制代码
6. 获取手机相册的访问权限文件

  1. /// null = 未请求,1 = 已允许,0 = 拒绝|受限, 2 = 系统未开启
  2. var isIOS
  3. function album() {
  4.     var result = 0;
  5.     var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
  6.     var authStatus = PHPhotoLibrary.authorizationStatus();
  7.     if (authStatus === 0) {
  8.         result = null;
  9.     } else if (authStatus == 3) {
  10.         result = 1;
  11.     } else {
  12.         result = 0;
  13.     }
  14.     plus.ios.deleteObject(PHPhotoLibrary);
  15.     return result;
  16. }
  17. function camera() {
  18.     var result = 0;
  19.     var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
  20.     var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
  21.     if (authStatus === 0) {
  22.         result = null;
  23.     } else if (authStatus == 3) {
  24.         result = 1;
  25.     } else {
  26.         result = 0;
  27.     }
  28.     plus.ios.deleteObject(AVCaptureDevice);
  29.     return result;
  30. }
  31. function location() {
  32.     var result = 0;
  33.     var cllocationManger = plus.ios.import("CLLocationManager");
  34.     var enable = cllocationManger.locationServicesEnabled();
  35.     var status = cllocationManger.authorizationStatus();
  36.     if (!enable) {
  37.         result = 2;
  38.     } else if (status === 0) {
  39.         result = null;
  40.     } else if (status === 3 || status === 4) {
  41.         result = 1;
  42.     } else {
  43.         result = 0;
  44.     }
  45.     plus.ios.deleteObject(cllocationManger);
  46.     return result;
  47. }
  48. function push() {
  49.     var result = 0;
  50.     var UIApplication = plus.ios.import("UIApplication");
  51.     var app = UIApplication.sharedApplication();
  52.     var enabledTypes = 0;
  53.     if (app.currentUserNotificationSettings) {
  54.         var settings = app.currentUserNotificationSettings();
  55.         enabledTypes = settings.plusGetAttribute("types");
  56.         if (enabledTypes == 0) {
  57.             result = 0;
  58.             console.log("推送权限没有开启");
  59.         } else {
  60.             result = 1;
  61.             console.log("已经开启推送功能!")
  62.         }
  63.         plus.ios.deleteObject(settings);
  64.     } else {
  65.         enabledTypes = app.enabledRemoteNotificationTypes();
  66.         if (enabledTypes == 0) {
  67.             result = 3;
  68.             console.log("推送权限没有开启!");
  69.         } else {
  70.             result = 4;
  71.             console.log("已经开启推送功能!")
  72.         }
  73.     }
  74.     plus.ios.deleteObject(app);
  75.     plus.ios.deleteObject(UIApplication);
  76.     return result;
  77. }
  78. function contact() {
  79.     var result = 0;
  80.     var CNContactStore = plus.ios.import("CNContactStore");
  81.     var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
  82.     if (cnAuthStatus === 0) {
  83.         result = null;
  84.     } else if (cnAuthStatus == 3) {
  85.         result = 1;
  86.     } else {
  87.         result = 0;
  88.     }
  89.     plus.ios.deleteObject(CNContactStore);
  90.     return result;
  91. }
  92. function record() {
  93.     var result = null;
  94.     var avaudiosession = plus.ios.import("AVAudioSession");
  95.     var avaudio = avaudiosession.sharedInstance();
  96.     var status = avaudio.recordPermission();
  97.     console.log("permissionStatus:" + status);
  98.     if (status === 1970168948) {
  99.         result = null;
  100.     } else if (status === 1735552628) {
  101.         result = 1;
  102.     } else {
  103.         result = 0;
  104.     }
  105.     plus.ios.deleteObject(avaudiosession);
  106.     return result;
  107. }
  108. function calendar() {
  109.     var result = null;
  110.     var EKEventStore = plus.ios.import("EKEventStore");
  111.     var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
  112.     if (ekAuthStatus == 3) {
  113.         result = 1;
  114.         console.log("日历权限已经开启");
  115.     } else {
  116.         console.log("日历权限没有开启");
  117.     }
  118.     plus.ios.deleteObject(EKEventStore);
  119.     return result;
  120. }
  121. function memo() {
  122.     var result = null;
  123.     var EKEventStore = plus.ios.import("EKEventStore");
  124.     var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
  125.     if (ekAuthStatus == 3) {
  126.         result = 1;
  127.         console.log("备忘录权限已经开启");
  128.     } else {
  129.         console.log("备忘录权限没有开启");
  130.     }
  131.     plus.ios.deleteObject(EKEventStore);
  132.     return result;
  133. }
  134. function requestIOS(permissionID) {
  135.     return new Promise((resolve, reject) => {
  136.         switch (permissionID) {
  137.             case "push":
  138.                 resolve(push());
  139.                 break;
  140.             case "location":
  141.                 resolve(location());
  142.                 break;
  143.             case "record":
  144.                 resolve(record());
  145.                 break;
  146.             case "camera":
  147.                 resolve(camera());
  148.                 break;
  149.             case "album":
  150.                 resolve(album());
  151.                 break;
  152.             case "contact":
  153.                 resolve(contact());
  154.                 break;
  155.             case "calendar":
  156.                 resolve(calendar());
  157.                 break;
  158.             case "memo":
  159.                 resolve(memo());
  160.                 break;
  161.             default:
  162.                 resolve(0);
  163.                 break;
  164.         }
  165.     });
  166. }
  167. function requestAndroid(permissionID) {
  168.     return new Promise((resolve, reject) => {
  169.         plus.android.requestPermissions(
  170.             [permissionID],
  171.             function(resultObj) {
  172.                 var result = 0;
  173.                 for (var i = 0; i < resultObj.granted.length; i++) {
  174.                     var grantedPermission = resultObj.granted[i];
  175.                     console.log('已获取的权限:' + grantedPermission);
  176.                     result = 1
  177.                 }
  178.                 for (var i = 0; i < resultObj.deniedPresent.length; i++) {
  179.                     var deniedPresentPermission = resultObj.deniedPresent[i];
  180.                     console.log('拒绝本次申请的权限:' + deniedPresentPermission);
  181.                     result = 0
  182.                 }
  183.                 for (var i = 0; i < resultObj.deniedAlways.length; i++) {
  184.                     var deniedAlwaysPermission = resultObj.deniedAlways[i];
  185.                     console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
  186.                     result = -1
  187.                 }
  188.                 resolve(result);
  189.             },
  190.             function(error) {
  191.                 console.log('result error: ' + error.message)
  192.                 resolve({
  193.                     code: error.code,
  194.                     message: error.message
  195.                 });
  196.             }
  197.         );
  198.     });
  199. }
  200. function gotoAppPermissionSetting() {
  201.     if (permission.isIOS) {
  202.         var UIApplication = plus.ios.import("UIApplication");
  203.         var application2 = UIApplication.sharedApplication();
  204.         var NSURL2 = plus.ios.import("NSURL");
  205.         var setting2 = NSURL2.URLWithString("app-settings:");
  206.         application2.openURL(setting2);
  207.         plus.ios.deleteObject(setting2);
  208.         plus.ios.deleteObject(NSURL2);
  209.         plus.ios.deleteObject(application2);
  210.     } else {
  211.         var Intent = plus.android.importClass("android.content.Intent");
  212.         var Settings = plus.android.importClass("android.provider.Settings");
  213.         var Uri = plus.android.importClass("android.net.Uri");
  214.         var mainActivity = plus.android.runtimeMainActivity();
  215.         var intent = new Intent();
  216.         intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  217.         var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
  218.         intent.setData(uri);
  219.         mainActivity.startActivity(intent);
  220.     }
  221. }
  222. const permission = {
  223.     get isIOS(){
  224.         return typeof isIOS === 'boolean' ? isIOS : (isIOS = uni.getSystemInfoSync().platform === 'ios')
  225.     },
  226.     requestIOS: requestIOS,
  227.     requestAndroid: requestAndroid,
  228.     gotoAppSetting: gotoAppPermissionSetting
  229. }
  230. module.exports = permission
复制代码
7. 注释:在利用微信小步伐的时候,下载需要将域名设置一下白名单,否则没效果哦~~~

最后就可以实现Android、Ios、微信小步伐、H5多端下载图片

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表