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

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

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

使用方式:

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  
}

相关文章:

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

关于华为应用市场上架过程中出现的【您的应用在运行时&#xff0c;未同步告知权限申请的使用目的&#xff0c;向用户索取&#xff08;存储、拍照&#xff09;等权限&#xff0c;不符合华为应用市场审核标准。】 使用方式&#xff1a; 1、引入 import permision from "/m…...

【ElasticSearch】概述

文章目录 ElasticSearch1.基本介绍2.设计理念3.基本架构与核心概念学习参考资料&#xff1a; ElasticSearch 简单整理ES基本概念&#xff0c;设计理念&#xff0c;构建与使用&#xff0c;供回顾。 1.基本介绍 Elasticsearch 是一个基于 Apache Lucene 的开源的分布式搜索引擎…...

十进制转十六进制 C/C++蓝桥杯基础试题BASIC-10

问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号&#xff0c;分别表示十进制数的0至15。十六进制的计数方法是满16进1&#xff0c;所以十进制数16在十六进制中是10&#xff0c;而十进制的17在十六进制中是…...

【LVGL环境搭建】

LVGL环境搭建 win模拟器环境搭建一.二.三.四.五. Ubuntu模拟器环境搭建一. 前置准备二. 下载LVGL Source code&#xff1a;三. 安装sdl2&#xff1a;四. 开启VScode执行五. 安装扩展套件六. 按F5执行七. 执行结果 win模拟器环境搭建 一. 二. 三. 四. 五. Ubuntu模拟器环境…...

【c语言】简单贪吃蛇的实现

目录 一、游戏说明 ​编辑 二、地图坐标​ ​编辑 三、头文件 四、蛇身和食物​ 五、数据结构设计​ 蛇节点结构如下&#xff1a; 封装一个Snake的结构来维护整条贪吃蛇&#xff1a;​ 蛇的方向&#xff0c;可以一一列举&#xff0c;使用枚举&#xff1a; 游戏状态&a…...

2023年09月CCF-GESP编程能力等级认证Python编程六级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 近年来,线上授课变得普遍,很多有助于改善教学效果的设备也逐渐流行,其中包括比较常用的手写板,那么它属于哪类设备?( ) A:输入 B:输出 C:控制 D:记录 答案:A 第2题 以下关于…...

Flink中StateBackend(工作状态)与Checkpoint(状态快照)的关系

State Backends 由 Flink 管理的 keyed state 是一种分片的键/值存储&#xff0c;每个 keyed state 的工作副本都保存在负责该键的 taskmanager 本地中。另外&#xff0c;Operator state 也保存在机器节点本地。Flink 定期获取所有状态的快照&#xff0c;并将这些快照复制到持…...

【C语言刷题系列】喝汽水问题

文章目录 一、文章简介 1.先买再换 1.1 代码逻辑&#xff1a; 1.2 完整代码 1.3 运行结果 1.4 根据方法一总结优化 2.边买边换 2.1 代码逻辑&#xff1a; 2.2 完整代码 2.3 运行结果 一、文章简介 本文所述专栏——C语言经典编程问题 C语言刷题_倔强的石头106的博客…...

[C++] C++ 11的functional模块介绍和使用案例

functional模块介绍 functional模块是C 11提供了一组函数对象和算法&#xff0c;用于增强C的函数式编程能力。该模块中的函数对象和算法可以大大简化代码&#xff0c;并提供了一些有用的工具&#xff0c;例如函数适配器和函数对象的组合。 functional模块中的函数对象包括&am…...

kubernetes基本概念和操作

基本概念和操作 1.Namespace1.1概述1.2应用示例 2.Pod2.1概述2.2语法及应用示例 3.Label3.1概述3.2语法及应用示例 4.Deployment4.1概述4.2语法及应用示例 5.Service5.1概述5.2语法及应用示例5.2.1创建集群内部可访问的Service5.2.2创建集群外部可访问的Service5.2.3删除服务5.…...

20240128周报-网络太杂,Tomcat太难

今天来做个小总结吧&#xff0c;之前说想用几个月的时间将Java生态给整理一遍&#xff0c;该工作已经进入第三周了。先和各位老老板汇报一下上一周的工作&#xff0c;然后说一下本周的计划和后面的计划。 1.上周工作 上周的计划是将网络和Tomcat的内容梳理一番&#xff0c;但…...

DES加密原理

DES加密算法综合运用了置换、代替、代数等多种密码技术&#xff0c;具有设计精 巧、实现容易、使用方便等特点。DES加密算法的明文、密文和密钥的分组长度 都是64位&#xff0c;详细的DES加密算法结构如图6-10所示。 图6-10 DES加密算法结构图 DES加密过程如下所示&#xff…...

react 之 useCallback

简单讲述下useCallback的使用方法&#xff0c;useCallback也是用来缓存的&#xff0c;只不过是用于做函数缓存 // useCallbackimport { memo, useCallback, useState } from "react"const Input memo(function Input ({ onChange }) {console.log(子组件重新渲染了…...

OfficeWeb365 Readfile 任意文件读取漏洞复现

0x01 产品简介 OfficeWeb365 是专注于 Office 文档在线预览及PDF文档在线预览云服务,包括 Microsoft Word 文档在线预览、Excel 表格在线预览、Powerpoint 演示文档在线预览,WPS 文字处理、WPS 表格、WPS 演示及 Adobe PDF 文档在线预览。 0x02 漏洞概述 OfficeWeb365 Rea…...

UnityShader(十三)Unity内置的函数

在计算光照模型时我们需要得到许多数据&#xff0c;比如光源方向、视角方向这种基本信息。 在之前的例子中都是自行在代码里计算的&#xff0c;比如&#xff1a; normalize(_WorldSpaceLight0Pos.xyz) 得到光源方向&#xff08;这种方法实际只适用平行光&#xff09; normaliz…...

【开源】基于Qt5的ROS1/ROS2人机交互软件(支持地图编辑/多点导航)

本项目基于Qt5开发&#xff0c;基于CMake进行构建&#xff0c;可以实现一套代码同时在ROS1/ROS2系统中使用(本项目已接入CI,保证多ROS版本/系统版本可用性) 项目地址&#xff1a; https://github.com/chengyangkj/Ros_Qt5_Gui_App 软件在编译时会自动识别环境变量中的ROS1/ROS…...

Spring和SpringBoot的区别是什么

Spring 和 Spring Boot 是 Java 开发领域内两个极其重要且紧密相关的框架&#xff0c;它们各自在企业级应用开发中扮演着不同的角色&#xff0c;并带来了一系列革新性的变化。以下是关于两者之间主要区别的详细分析&#xff1a; 一、设计理念与定位 Spring Framework Spring 是…...

布局技巧及CSS初始化

一&#xff0c;margin负值巧妙应用 二&#xff0c;文字围绕浮动元素 三&#xff0c;行内块 四&#xff0c;CSS三角强化 五&#xff0c;CSS初始化 一&#xff0c;margin负值巧妙应用 制作盒子的细线边框&#xff1a; 鼠标经过li后变色&#xff1a; 二&#xff0c;文字围绕…...

excel怎么设置密码?轻松保护您的工作表

在数字化时代&#xff0c;数据的安全性显得尤为重要。excel作为我们日常工作中广泛使用的办公软件&#xff0c;其中可能包含了大量的敏感数据。为了确保这些数据不被未授权的人访问&#xff0c;本文将为您详细介绍excel怎么设置密码&#xff0c;从而有效地保护您的数据安全。 方…...

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TimePicker组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之TimePicker组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、TimePicker组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...