关于华为应用市场上架,申请权限未告知目的被驳回问题的简单处理方式

关于华为应用市场上架过程中出现的【您的应用在运行时,未同步告知权限申请的使用目的,向用户索取(存储、拍照)等权限,不符合华为应用市场审核标准。】

使用方式:

1、引入

import permision from "@/mixin/permission.js"

2、判断

var result = await permision.premissionCheck("EXTERNAL_STORAGE")  
if(result == 1) {  // 此处处理各自业务 如:uni.chooseImage  
}

3、permission.js源码参考如下

var isIos  
// #ifdef APP-PLUS  
isIos = (plus.os.name == "iOS")  
// #endif  // 判断推送权限是否开启  
function judgeIosPermissionPush() {  var result = false;  var UIApplication = plus.ios.import("UIApplication");  var app = UIApplication.sharedApplication();  var enabledTypes = 0;  if (app.currentUserNotificationSettings) {  var settings = app.currentUserNotificationSettings();  enabledTypes = settings.plusGetAttribute("types");  console.log("enabledTypes1:" + enabledTypes);  if (enabledTypes == 0) {  console.log("推送权限没有开启");  } else {  result = true;  console.log("已经开启推送功能!")  }  plus.ios.deleteObject(settings);  } else {  enabledTypes = app.enabledRemoteNotificationTypes();  if (enabledTypes == 0) {  console.log("推送权限没有开启!");  } else {  result = true;  console.log("已经开启推送功能!")  }  console.log("enabledTypes2:" + enabledTypes);  }  plus.ios.deleteObject(app);  plus.ios.deleteObject(UIApplication);  return result;  
}  // 判断定位权限是否开启  
function judgeIosPermissionLocation() {  var result = false;  var cllocationManger = plus.ios.import("CLLocationManager");  var status = cllocationManger.authorizationStatus();  result = (status != 2)  console.log("定位权限开启:" + result);  // 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation  /* var enable = cllocationManger.locationServicesEnabled();  var status = cllocationManger.authorizationStatus();  console.log("enable:" + enable);  console.log("status:" + status);  if (enable && status != 2) {  result = true;  console.log("手机定位服务已开启且已授予定位权限");  } else {  console.log("手机系统的定位没有打开或未给予定位权限");  } */  plus.ios.deleteObject(cllocationManger);  return result;  
}  // 判断麦克风权限是否开启  
function judgeIosPermissionRecord() {  var result = false;  var avaudiosession = plus.ios.import("AVAudioSession");  var avaudio = avaudiosession.sharedInstance();  var permissionStatus = avaudio.recordPermission();  console.log("permissionStatus:" + permissionStatus);  if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {  console.log("麦克风权限没有开启");  } else {  result = true;  console.log("麦克风权限已经开启");  }  plus.ios.deleteObject(avaudiosession);  return result;  
}  // 判断相机权限是否开启  
function judgeIosPermissionCamera() {  var result = false;  var AVCaptureDevice = plus.ios.import("AVCaptureDevice");  var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');  console.log("authStatus:" + authStatus);  if (authStatus == 3) {  result = true;  console.log("相机权限已经开启");  } else {  console.log("相机权限没有开启");  }  plus.ios.deleteObject(AVCaptureDevice);  return result;  
}  // 判断相册权限是否开启  
function judgeIosPermissionPhotoLibrary() {  var result = false;  var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");  var authStatus = PHPhotoLibrary.authorizationStatus();  console.log("authStatus:" + authStatus);  if (authStatus == 3) {  result = true;  console.log("相册权限已经开启");  } else {  console.log("相册权限没有开启");  }  plus.ios.deleteObject(PHPhotoLibrary);  return result;  
}  // 判断通讯录权限是否开启  
function judgeIosPermissionContact() {  var result = false;  var CNContactStore = plus.ios.import("CNContactStore");  var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);  if (cnAuthStatus == 3) {  result = true;  console.log("通讯录权限已经开启");  } else {  console.log("通讯录权限没有开启");  }  plus.ios.deleteObject(CNContactStore);  return result;  
}  // 判断日历权限是否开启  
function judgeIosPermissionCalendar() {  var result = false;  var EKEventStore = plus.ios.import("EKEventStore");  var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);  if (ekAuthStatus == 3) {  result = true;  console.log("日历权限已经开启");  } else {  console.log("日历权限没有开启");  }  plus.ios.deleteObject(EKEventStore);  return result;  
}  // 判断备忘录权限是否开启  
function judgeIosPermissionMemo() {  var result = false;  var EKEventStore = plus.ios.import("EKEventStore");  var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);  if (ekAuthStatus == 3) {  result = true;  console.log("备忘录权限已经开启");  } else {  console.log("备忘录权限没有开启");  }  plus.ios.deleteObject(EKEventStore);  return result;  
}  // Android权限查询  
function requestAndroidPermission(permissionID) {  return new Promise((resolve, reject) => {  plus.android.requestPermissions(  permissionID.split(","),  // [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装  function(resultObj) {  var result = 0;  for (var i = 0; i < resultObj.granted.length; i++) {  var grantedPermission = resultObj.granted[i];  console.log('已获取的权限:' + grantedPermission);  result = 1  }  for (var i = 0; i < resultObj.deniedPresent.length; i++) {  var deniedPresentPermission = resultObj.deniedPresent[i];  console.log('拒绝本次申请的权限:' + deniedPresentPermission);  result = 0  }  for (var i = 0; i < resultObj.deniedAlways.length; i++) {  var deniedAlwaysPermission = resultObj.deniedAlways[i];  console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);  result = -1  }  resolve(result);  // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限  // if (result != 1) {  // gotoAppPermissionSetting()  // }  },  function(error) {  console.log('申请权限错误:' + error.code + " = " + error.message);  resolve({  code: error.code,  message: error.message  });  }  );  });  
}  // 使用一个方法,根据参数判断权限  
function judgeIosPermission(permissionID) {  if (permissionID == "location") {  return judgeIosPermissionLocation()  } else if (permissionID == "camera") {  return judgeIosPermissionCamera()  } else if (permissionID == "photoLibrary") {  return judgeIosPermissionPhotoLibrary()  } else if (permissionID == "record") {  return judgeIosPermissionRecord()  } else if (permissionID == "push") {  return judgeIosPermissionPush()  } else if (permissionID == "contact") {  return judgeIosPermissionContact()  } else if (permissionID == "calendar") {  return judgeIosPermissionCalendar()  } else if (permissionID == "memo") {  return judgeIosPermissionMemo()  }  return false;  
}  // 跳转到**应用**的权限页面  
function gotoAppPermissionSetting() {  if (isIos) {  var UIApplication = plus.ios.import("UIApplication");  var application2 = UIApplication.sharedApplication();  var NSURL2 = plus.ios.import("NSURL");  // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");       var setting2 = NSURL2.URLWithString("app-settings:");  application2.openURL(setting2);  plus.ios.deleteObject(setting2);  plus.ios.deleteObject(NSURL2);  plus.ios.deleteObject(application2);  } else {  // console.log(plus.device.vendor);  var Intent = plus.android.importClass("android.content.Intent");  var Settings = plus.android.importClass("android.provider.Settings");  var Uri = plus.android.importClass("android.net.Uri");  var mainActivity = plus.android.runtimeMainActivity();  var intent = new Intent();  intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);  intent.setData(uri);  mainActivity.startActivity(intent);  }  
}  // 检查系统的设备服务是否开启  
// var checkSystemEnableLocation = async function () {  
function checkSystemEnableLocation() {  if (isIos) {  var result = false;  var cllocationManger = plus.ios.import("CLLocationManager");  var result = cllocationManger.locationServicesEnabled();  console.log("系统定位开启:" + result);  plus.ios.deleteObject(cllocationManger);  return result;  } else {  var context = plus.android.importClass("android.content.Context");  var locationManager = plus.android.importClass("android.location.LocationManager");  var main = plus.android.runtimeMainActivity();  var mainSvr = main.getSystemService(context.LOCATION_SERVICE);  var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);  console.log("系统定位开启:" + result);  return result  }  
}  let permissionMap = {  "android": {  "CAMERA_EXTERNAL_STORAGE": {  "name": "android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE,android.permission.CAMERA",  "title": "相机/相册权限说明",  "content": "便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布产品/需求、下载、与客服沟通等场景中读取和写入相册和文件内容"  },  "CAMERA": {  "name": "android.permission.CAMERA",  "title": "相机权限说明",  "content": "便于您使用该功能上传图片,用于与客服沟通等场景中发送拍摄图片"  },  "EXTERNAL_STORAGE": {  "name": "android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE",  "title": "相册权限说明",  "content": "便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布产品/需求、下载、与客服沟通等场景中读取和写入相册和文件内容"  }  },  "ios": {}  
}  let view = null;  function showViewDesc(permission) {  let plat = isIos ? "ios" : "android";  view = new plus.nativeObj.View('per-modal', {  top: '0px',  left: '0px',  width: '100%',  backgroundColor: 'rgba(0,0,0,0.2)',  //opacity: '.9'     })  view.drawRect({  color: '#fff',  radius: '5px'  }, {  top: '30px',  left: '5%',  width: '90%',  height: "100px",  })  view.drawText(permissionMap[plat][permission]["title"], {  top: '40px',  left: "8%",  height: "30px"  }, {  align: "left",  color: "#000",  }, {  onClick: function(e) {  console.log(e);  }  })  view.drawText(permissionMap[plat][permission]["content"], {  top: '65px',  height: "60px",  left: "8%",  width: "84%"  }, {  whiteSpace: 'normal',  size: "14px",  align: "left",  color: "#656563"  })  view.show()  
}  function premissionCheck(permission) {  return new Promise(async (resolve, reject) => {  let plat = isIos ? "ios" : "android";  if (isIos) { // ios  // const camera = permission.judgeIosPermission("camera");//判断ios是否给予摄像头权限  // //ios相册没权限,系统会自动弹出授权框  // //let photoLibrary = permission.judgeIosPermission("photoLibrary");//判断ios是否给予相册权限  // if(camera){  //     resolve();  // }else{  //     reject('需要开启相机使用权限');  // }  resolve(1)  } else { // android  let permission_arr = permissionMap[plat][permission]["name"].split(",");  let flag = true;  for(let i = 0;i<permission_arr.length;i++) {  let status = plus.navigator.checkPermission(permission_arr[i]);  if(status == "undetermined") {  flag = false;  }  }  console.log("flag", flag)  if (flag == false) { // 未完全授权  showViewDesc(permission);  requestAndroidPermission(permissionMap[plat][permission]["name"]).then((res) => {  view.close();  if (res == -1) {  uni.showModal({  title: '提示',  content: '操作权限已被拒绝,请手动前往设置',  confirmText: "立即设置",  success: (res) => {  if (res.confirm) {  gotoAppPermissionSetting()  }  }  })  }  resolve(res)  })  } else {  resolve(1)  }  }  })  
}  module.exports = {  judgeIosPermission: judgeIosPermission,  requestAndroidPermission: requestAndroidPermission,  checkSystemEnableLocation: checkSystemEnableLocation,  gotoAppPermissionSetting: gotoAppPermissionSetting,  premissionCheck: premissionCheck  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/449539.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用MATLAB驱动USRP-N320实现OFDM自收自发

文章目录 前言一、收发代码二、截取一帧 OFDM三、执行主函数四、运行结果五、资源自取 前言 本文作为实验结果记录及测试&#xff0c;方便后面回顾所做的工作。本文基于一台电脑和一台 USRP 设备实现了 OFDM 自发和自收功能 一、收发代码 ofdm_tx_rx_test.m 核心代码&#x…

Linux 系统开始配置

文章目录 备份源为root 设置密码安装基本工具切换root 用户删除snap从 Ubuntu 移除 Snap 后使用 deb 文件安装软件商店和 Firefox在 Ubuntu 系统恢复到 Snap 软件包总结 删除 vim安装neovim在线安装neovim压缩安装neovim安装lazyvim安装剪切板 安装qt配置 Qt 环境不在sudoers文…

预处理详解(上)

⽬录&#xff1a; 1. 预定义符号 2. #define定义常量 3. #define定义宏 4. 带有副作⽤的宏参数 5. 宏替换的规则 6. 宏函数的对⽐ 7. #和## 8. 命名约定 9. #undef 10. 命令⾏定义 11. 条件编译 12. 头⽂件的包含 13. 其他预处理指令 正⽂开始 1. 预…

Facebook未来展望:社交媒体的下一个篇章

社交媒体一直是连接人与人之间的纽带&#xff0c;而Facebook则一直在推动这一领域的发展。随着科技不断演进和社会需求的不断变迁&#xff0c;Facebook正积极筹谋社交媒体的下一个篇章。本文将深入剖析Facebook的未来展望&#xff0c;探讨其在社交媒体领域所迎接的新时代。 1. …

2023年计算机视觉领域突破性研究有哪些?

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 ​回顾2023年&#xff0c;计算机视觉领域有哪些较为突出的研究成果&#xff1f;一起看看吧 SAM(Segment Anything Model) SAM 由 Meta AI 开发&#xff0c;是 CV 中分割任务的基础模型&#xff0c;彻…

Lambda表达式(匿名函数)

C11中引入了lambda表达式&#xff0c;定义匿名的内联函数。 我们可以直接原地定义函数而不用再跑到外面去定义函数跳来跳去。 同时在stl的排序上也有作用。 [capture] (parameters) mutable ->return-type {statement}下面逐一介绍各个参数的含义. [capture] : 捕获&#…

【Rust】——rust前言与安装rust

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

【gcc】webrtc发送侧计算 丢包率

大神的分析 : 提到: 每当收到cc-feedback或者收到RR-report的时候就能统计出丢包率,在cc-controller中就会调用SendSideBandwidthEstimation::UpdatePacketsLost()去更新丢包率,同时进行码率预估 G:\CDN\rtcCli\m98\src\modules\congestion_controller\goog_cc\send_side_b…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第6章 逻辑斯谛回归与最大熵模型(1)6.1 逻辑斯谛回归模型

文章目录 第6章 逻辑斯谛回归与最大熵模型6.1 逻辑斯谛回归模型6.1.1 逻辑斯谛分布6.1.2 二项逻辑斯谛回归模型6.1.3 模型参数估计6.1.4 多项逻辑斯谛回归 《统计学习方法&#xff1a;李航》笔记 从原理到实现&#xff08;基于python&#xff09;-- 第3章 k邻近邻法 《统计学习…

Vue2+ElementUI 弹窗全局拖拽 支持放大缩小

拖拽组件 dialogDrag.vue <template><div></div> </template> <script>export default {name: dialogDrag,data() {return {originalWidth: null,originalHeight: null}},created() {this.$nextTick(()>{this.dialogDrag()})},mounted() {}…

win wsl2 Ubuntu-22.04 设置时间为国内时间

使用 wsl2 安装 Ubuntu-22.04 后 时间不正确&#xff0c;主要有两个原因 时区设置不正确&#xff0c;国内为京八区。 时区正确后&#xff0c;没有同步时间。&#xff08;大部分人容易忽略这一点&#xff09; Linux 默认情况下使用 UTC 格式作为标准时间格式&#xff0c;如果在…

Go语言的100个错误使用场景(11-20)|项目组织和数据类型

前言 大家好&#xff0c;这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析100…