uniapp 解决华为上架被拒问题,APP在申请敏感权限时,应同步说明权限申请的使用目的

1、store/modules/permission.js

// app权限申请处理
const state = {// 处理应用程序权限请求CAMERA: false,WRITE_EXTERNAL_STORAGE: false,ACCESS_FINE_LOCATION: false,CALL_PHONE: false,isIos: uni.getSystemInfoSync().platform == 'ios',mapping: {'CAMERA': {title: '摄像头权限说明',content: '摄像头权限将用于拍摄照片和视频。这样,您可以在应用程序中记录瞬间、分享内容或进行其他相关操作。',methods: 'SET_CAMERA'},'WRITE_EXTERNAL_STORAGE': {title: '存储空间/照片权限申请说明',content: '便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布商品/分享、下载、与客服沟通等场景中读取和写入相册和文件内容。',methods: 'SET_WRITE_EXTERNAL_STORAGE'},'ACCESS_FINE_LOCATION': {title: '地理位置权限申请说明',content: '****应用程序可以提供基于位置的服务、定位导航、附近搜索等功能。',methods: 'SET_ACCESS_FINE_LOCATION'},'CALL_PHONE': {title: '拨打/管理电话权限申请说明',content: '便于您使用该功能联系买家、骑手或者客服、业务经理与联系等场景下使用',methods: 'SET_CALL_PHONE'}}
}const mutations = {// 管理权限告知目的SET_CAMERA(state, val) {state.CAMERA = val},SET_WRITE_EXTERNAL_STORAGE(state, val) {state.WRITE_EXTERNAL_STORAGE = val},SET_CALL_PHONE(state, val) {state.CALL_PHONE = val},SET_ACCESS_FINE_LOCATION(state, val) {state.ACCESS_FINE_LOCATION = val}
}const actions = {// 权限获取async requestPermissions({ state, dispatch, commit }, permissionID) {try {if (!state[permissionID] && !state.isIos) {var viewObj = await dispatch('nativeObjView', permissionID)viewObj.show()}console.log('android.permission.' + permissionID, '当前手机权限')return new Promise(async (resolve, reject) => {// ios不需要这个if (state.isIos) {resolve(1)return}// Android权限查询function requestAndroidPermission(permissionID_) {return new Promise((resolve, reject) => {plus.android.requestPermissions([permissionID_], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装function(resultObj) {var result = 0for (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)},function(error) {console.log('申请权限错误:' + error.code + ' = ' + error.message)resolve({code: error.code,message: error.message})})})}const result = await requestAndroidPermission('android.permission.' + permissionID)if (result === 1) {// '已获得授权'commit(state.mapping[permissionID].methods, true)} else if (result === 0) {// '未获得授权'commit(state.mapping[permissionID].methods, false)} else {commit(state.mapping[permissionID].methods, true)uni.showModal({title: '提示',content: '操作权限已被拒绝,请手动前往设置',confirmText: '立即设置',success: (res) => {if (res.confirm) {dispatch('gotoAppPermissionSetting')}}})}if (viewObj) viewObj.close()resolve(result)})} catch (error) {console.log(error)reject(error)}},// 提示框nativeObjView({ state }, permissionID) {const systemInfo = uni.getSystemInfoSync()const statusBarHeight = systemInfo.statusBarHeightconst navigationBarHeight = systemInfo.platform === 'android' ? 48 : 44 // Set the navigation bar height based on the platformconst totalHeight = statusBarHeight + navigationBarHeightlet view = new plus.nativeObj.View('per-modal', {top: '0px',left: '0px',width: '100%',backgroundColor: 'rgba(0,0,0,0.5)'})view.drawRect({color: '#fff',radius: '5px'}, {top: totalHeight + 'px',left: '5%',width: '90%',height: '100px'})view.drawText(state.mapping[permissionID].title, {top: totalHeight + 5 + 'px',left: '8%',height: '30px'}, {align: 'left',color: '#000'}, {onClick: function(e) {console.log(e)}})view.drawText(state.mapping[permissionID].content, {top: totalHeight + 35 + 'px',height: '60px',left: '8%',width: '84%'}, {whiteSpace: 'normal',size: '14px',align: 'left',color: '#656563'})function show() {view = plus.nativeObj.View.getViewById('per-modal')view.show()view = null // 展示的时候也得清空,不然影响下次的关闭,不知道为啥}function close() {view = plus.nativeObj.View.getViewById('per-modal')view.close()view = null}return { show, close }},// 跳转到**应用**的权限页面gotoAppPermissionSetting({ state }) {if (state.isIos) {var UIApplication = plus.ios.import('UIApplication')var application2 = UIApplication.sharedApplication()var NSURL2 = plus.ios.import('NSURL')var setting2 = NSURL2.URLWithString('app-settings:')application2.openURL(setting2)plus.ios.deleteObject(setting2)plus.ios.deleteObject(NSURL2)plus.ios.deleteObject(application2)} else {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)}}
}const getters = {}export default {state,getters,mutations,actions
}

 2、store/index.js

import Vue from 'vue'
import Vuex from 'vuex'import permission from './modules/permission.js'const namespaced = trueVue.use(Vuex)const store = new Vuex.Store({modules: {permission: {namespaced,...permission}}
})export default store

3、使用

clickFun() {// #ifdef APP-PLUSconst result = await uni.$store.dispatch('permission/requestPermissions', 'WRITE_EXTERNAL_STORAGE')if (result !== 1) return// #endif// 权限拿到后,下面的逻辑根据你们的业务逻辑来写 ...uni.showToast({title:'权限获取成功'})
}

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

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

相关文章

Pytorch入门需要达到的效果

会搭建深度学习环境和依赖包安装 使用Anaconda创建环境、在pytorch官网安装pytorch、安装依赖包 会使用常见操作&#xff0c;例如matmul&#xff0c;sigmoid&#xff0c;softmax&#xff0c;relu&#xff0c;linear matmul操作见文章torch.matmul()的用法 sigmoid&#xff0…

Java多线程(02)

一、如何终止线程 终止线程就是要让 run 方法尽快执行结束 1. 手动创建标志位 可以通过在代码中手动创建标志位的方式&#xff0c;来作为 run 方法的执行结束条件&#xff1b; public static void main(String[] args) throws InterruptedException {boolean flag true;Thr…

Flutter 中的 CupertinoTabBar 小部件:全面指南

Flutter 中的 CupertinoTabBar 小部件&#xff1a;全面指南 在 Flutter 的 Cupertino 组件库中&#xff0c;CupertinoTabBar 是一个用于创建 iOS 风格底部导航栏的 widget。它为用户提供了一个直观的界面&#xff0c;可以快速在不同的标签页之间切换。本文将详细介绍 Cupertin…

MySQL分库分表:原理、实现与优化

推荐一个程序员的常用工具网站&#xff0c;嘎嘎好用&#xff1a;程序员常用工具 云服务器限时免费领&#xff1a;轻量服务器2核4G MySQL分库分表&#xff1a;原理、实现与优化 在现代互联网应用中&#xff0c;随着数据量的迅速增长和访问量的激增&#xff0c;单个数据库的性…

基于AT89C52单片机的智能窗帘系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/89276984?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤07 智能窗户控制系统学院&#xff08;部&#xff09;&#xff1a; 专 业&#xff1a; 班 级&…

双指针法和链表练习题(2024/5/28)

1面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xf…

系统管理、磁盘分区

系统管理 业务层面&#xff1a;为了满足一定的需求所做的特定操作。 硬盘是什么&#xff0c;硬盘的作用&#xff1a; **硬盘&#xff1a;**计算机的存储设备&#xff0c;机械硬盘是由一个或者多个磁性的盘组成&#xff0c;可以在盘片上进行数据的读写。 连接方式&#xff1a…

【Rust日报】Rust 中的形式验证

文章 - 未来的愿景&#xff1a;Rust 中的形式验证 这篇文章回顾了形式化验证的基本概念&#xff0c;作者展示了如何使用 Hoare triples 来描述和推理程序的正确性&#xff0c;以及如何使用分离逻辑来解决验证的复杂性。文章还解释了为什么 Rust 适用于形式化验证&#xff0c;以…

go ast语义分析实现指标计算器

什么是AST 首先我们要知道AST是什么&#xff08;Abstract Syntax Tree&#xff0c;AST&#xff09;&#xff0c;简称为语法树&#xff0c;是go语言源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构&#xff0c;树上的每个节点都表示源代码中的一种结构。 …

SCSS基本使用:解锁CSS预处理器的高效与优雅

SCSS基本使用&#xff1a;解锁CSS预处理器的高效与优雅 一、SCSS初探&#xff1a;从CSS到预处理的飞跃1.1 SCSS基础概念1.2 安装与使用安装Sass编译SCSS 二、SCSS核心特性与实践2.1 变量2.2 嵌套2.3 混合&#xff08;Mixins&#xff09;2.4 继承2.5 运算 三、实战技巧与最佳实践…

Python怎么得到 xxx/xxx/xxx/abc.bag中的abc.bag?

在Python中&#xff0c;从一个完整的文件路径中提取文件名&#xff08;如abc.bag&#xff09;&#xff0c;可以使用os.path模块中的basename函数。下面是一个例子&#xff1a; python import os # 假设这是你的完整文件路径 full_path "xxx/xxx/xxx/abc.bag" # 使…

我的心情JSP+Servlet+JDBC+MySQL

系统概述 本系统采用JSPServletJDBCMySQL技术进行开发&#xff0c;包括查看我的心情列表&#xff0c; 编辑我的心情信息、新增我的心情。使用方法 将项目从idea中导入&#xff0c;然后配置项目的结构&#xff0c;包括jdk,库&#xff0c;模块&#xff0c;项目&#xff0c;工件…

基于低代码的数智化融通研究

低代码平台简介 在信息化时代的浪潮中&#xff0c;软件应用开发扮演着至关重要的角色。然而&#xff0c;传统的软件开发方式往往需要开发人员具备深厚的编程基础和丰富的经验&#xff0c;这使得应用开发的门槛较高&#xff0c;开发周期较长&#xff0c;效率相对较低。为了解决这…

QT 自定义协议TCP传输文件

后面附带实例的下载地址 一、将文件看做是由:文件头+文件内容组成,其中文件头包含文件的一些信息:文件名称、文件大小等。 二、文件头单独发送,文件内容切块发送。 三、每次发送信息格式:发送内容大小、发送内容类型(文件头或是文件块内容)、文件块内容。 四、效果展…

基于springboot实现政府管理系统项目【项目源码+论文说明】

基于springboot实现政府管理系统演示 摘要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff…

饲料粉碎混合机组:打造精细化养殖

饲料粉碎混合机组是畜牧业和养殖业中不可或缺的设备。它集饲料粉碎和混合于一体&#xff0c;可以高效地处理各种饲料原料&#xff0c;提高饲料的均匀度和营养价值。 具体来说&#xff0c;饲料粉碎混合机组的主要功能包括将饲料原料进行粉碎&#xff0c;增加其表面积和调质粒度…

Steam游戏搬砖:靠谱吗,详细版说下搬砖中的核心内容!

可能大家也比较关注国外Steam游戏搬砖这个项目&#xff0c;最近单独找我了解的也比较多&#xff0c;其实也正常&#xff0c;因为现在市面上的项目很多都很鸡肋&#xff0c;而且很多都是一片红海&#xff0c;内卷太过严重&#xff0c;所以对于Steam的关注度也高很多&#xff0c;…

CTF-web-WP-攻防世界-1

1、view_source&#xff1a;打开开发者工具F12就能看到flag 2、robots (1)、使用目录扫描工具 工具&#xff1a;dirsearch命令&#xff1a;python dirsearch.py -u http://61.147.171.105:55644/ -e * (2)、看到下面有robots.txt文件&#xff0c;在URL后面输入&#xff0c…

docker部署vue router history HTML5 模式

构建容器 nginx 配置 default.conf server {listen 80;server_name localhost;#charset koi8-r;access_log /var/log/nginx/host.access.log main;error_log /var/log/nginx/error.log error;location / {root /usr/share/nginx/html;index index.html index.h…

INDICATOR 再c嵌入sql环境中的作用

在C语言嵌入SQL&#xff08;Embedded SQL&#xff09;的环境中&#xff0c;INDICATOR关键字用于处理数据库中的NULL值&#xff0c;以及管理与之相关联的宿主变量&#xff08;host variables&#xff09;。具体来说&#xff0c;它的作用主要体现在以下几个方面&#xff1a; NUL…