HarmonyOS Stage模型 权限申请

配置声明权限

在module.json5配置文件中声明权限。不论是system_grant还是user_grant类型都需要声明权限,否则应用将无法获得授权。

{"module" : {// ..."requestPermissions":[{"name": "ohos.permission.DISCOVER_BLUETOOTH",//权限名称。"reason":"$string:need_ble",//描述申请权限的原因。 当申请的权限为user_grant权限时,此字段必填。"usedScene": { //描述权限使用的场景和时机。当申请的权限为user_grant权限时,此字段必填。"abilities": [ //标识需要使用到该权限的Ability,标签为数组形式"EntryAbility"],"when": "always"//标识权限使用的时机 - inuse:表示为仅允许前台使用。- always:表示前后台都可使用。}},{"name": "ohos.permission.LOCATION","reason":"$string:need_ble","usedScene": {"abilities": ["EntryAbility"],"when": "always"}},{"name": "ohos.permission.APPROXIMATELY_LOCATION","reason":"$string:need_ble","usedScene": {"abilities": ["EntryAbility"],"when": "always"}}]}
}

权限校验(可略)

  1. 获取调用者的身份标识:tokenId。
  2. 待校验的权限名:ohos.permission.xxx。
  3. 使用checkAccessToken接口对当前调用者进行权限校验。
    class RequestPermission {async checkAccessToken(permissions: Array<Permissions>/*权限名*/): Promise<boolean> {//获取调用者的身份标识let callerTokenId = rpc.IPCSkeleton.getCallingTokenId();console.log("RequestPermission RpcServer: getCallingTokenId result: " + callerTokenId);var atManager = abilityAccessCtrl.createAtManager();try {const promises = permissions.map( (permission, index) => {//进行权限校验return atManager.checkAccessToken(callerTokenId, permission).then((data) => {console.log(`RequestPermission checkAccessToken success, data->${JSON.stringify(data)}`);if( index >= permissions.length - 1 ) {return true;}}).catch((err) => {console.log(`RequestPermission checkAccessToken fail, err->${JSON.stringify(err)}`);return false;});});const results = await Promise.all(promises);// 检查所有 Promise 的结果return results.every(result => result);} catch(err) {console.log(`RequestPermission catch err->${JSON.stringify(err)}`);return false;}}
    }export default new RequestPermission()

    例:有 'ohos.permission.APPROXIMATELY_LOCATION',  'ohos.permission.LOCATION', 'ohos.permission.CAMERA'三个权限 已授权前两个调用结果如下

     RequestPermission.checkAccessToken(permissions).then(results => {console.log('RequestPermission checked successfully:', results);}).catch(error => {console.error('RequestPermission check failed:', error);});打印如下I 0FEFE/JsApp: RequestPermission RpcServer: getCallingTokenId result: 537654415I 0FEFE/JsApp: RequestPermission checkAccessToken success, data->-1I 0FEFE/JsApp: RequestPermission checkAccessToken success, data->-1I 0FEFE/JsApp: RequestPermission checked successfully: false

向用户申请权限

class RequestPermission {async reqPermissionsFromUser(permissions: Array<Permissions>): Promise<boolean> {let context = getContext(this) as common.UIAbilityContext;let atManager = abilityAccessCtrl.createAtManager();try {const data = await atManager.requestPermissionsFromUser(context, permissions);let grantStatus: Array<number> = data.authResults;let length: number = grantStatus.length;for (let i = 0; i < length; i++) {if (grantStatus[i] !== 0) {// 如果有任何一个权限没有被授权,立即返回 falsereturn false;}}// 所有权限都被授权,返回 truereturn true;} catch (err) {console.error(`RequestPermission requestPermissionsFromUser failed, code is ${err.code}, message is ${err.message}`);// 如果发生异常,也返回 falsereturn false;}}
}

回调版


import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';
import rpc from '@ohos.rpc';class RequestPermission {/**** @param permissions 需要请求的权限数组* @param callback 权限结果 true/false*/reqPermissionsFromUser(permissions: Array<Permissions>, callback:(result:boolean)=>void) {let context = getContext(this) as common.UIAbilityContext;let atManager = abilityAccessCtrl.createAtManager();try {atManager.requestPermissionsFromUser(context, permissions).then((data)=>{let grantStatus: Array<number> = data.authResults;let length: number = grantStatus.length;for (let i = 0; i < length; i++) {if (grantStatus[i] !== 0) {callback(false);}}callback(true);})} catch (err) {console.error(`requestPermissionsFromUser failed, code is ${err.code}, message is ${err.message}`);callback(false);}}/**** @param permissions 需要检查的权限数组* @param callback*/checkAccessToken(permissions: Array<Permissions>, callback:(result:boolean)=>void) {let callerTokenId = rpc.IPCSkeleton.getCallingTokenId();var atManager = abilityAccessCtrl.createAtManager();try {permissions.map((permission, index) => {return atManager.checkAccessToken(callerTokenId, permission).then((data) => {console.log(`checkAccessToken success, data->${JSON.stringify(data)}`);if( index >= permissions.length - 1 ) {callback(true);}}).catch(() => {callback(false);});});} catch(err) {console.log(`RequestPermission catch err->${JSON.stringify(err)}`);callback(false,);}}
}export default new RequestPermission()

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

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

相关文章

数据分析(二)自动生成分析报告

1. 报告生成思路概述 怎么快速一份简单的数据分析报告&#xff0c;注意这个报告的特点&#xff1a; --网页版&#xff0c;可以支持在线观看或者分享HTML文件 --标题&#xff0c;动图&#xff0c;原始数据应有尽有 --支持交互&#xff0c;比如plotly交互画面&#xff0c;数据…

索引聚簇因子clustering_factor太大导致不走索引

查询条件超过一个月就不走索引&#xff1a; 检查表的block数和数据行数&#xff1a; select blocks,num_rows from dba_tables where table_name‘MS_MZXX’;blocks:618687 num_rows:20335462 查看聚簇因子clustering_factor的数&#xff1a;select clustering_factor from d…

npm详解:掌握package.json配置

package.json 文件中的 scripts 配置允许你定义一系列脚本命令&#xff0c;这些命令可以通过 npm run <script-name> 来执行。下面是一些常见的 scripts 配置&#xff0c;以及它们的详解和举例。 常见的 scripts 配置 start 这是最常用的脚本&#xff0c;通常用于启动应…

力扣OJ题——随机链表的复制

题目&#xff1a; 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 要求&#xff1a;构造这个链表的 深拷贝 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中…

Vulhub 练习 DC-4靶机完整复现

1.工具 kali:攻击机 IP地址&#xff1a;192.168.200.4 DC-4&#xff1a;靶机 IP地址&#xff1a;暂时未知 2.注意 这里搭建环境两台机器应该选用同类的网络连接方式&#xff1a;这里两台的连接方式为模式 二、信息收集 1.主机发现 找寻同网段下存活的主机&#xff08;可…

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(二)

在我们开始探索人工智能的世界时&#xff0c;了解如何与之有效沉浸交流是至关重要的。想象一下&#xff0c;你手中有一把钥匙&#xff0c;可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词&#xff08;prompts&#xff09;。无论你是AI领域的新手&#…

不要抱怨,不如抱 Java 运算符吧 (1)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

Windows系统中定时执行python脚本

背景&#xff1a;本地Windows系统指定目录下会有文件的修改新增&#xff0c;这些变化的文件需要定时的被上传到git仓库中&#xff0c;这样不需要每次变更手动上传了。 首先编写一个检测文件夹下文件变化并且上传git仓库的python脚本(确保你已经在E:\edc_workspace\data_edc_et…

使用AOT-GAN-for-Inpainting训练自己的数据集

AOT-GAN-for-Inpainting是一个开源的图像修复项目,其对 Places2 数据集的效果表明,该模型在 FID 方面明显优于最先进的模型,相对改进了 1.8%。一项包括 365 多名受试者的用户研究进一步验证了 AOT-GAN 的优越性。其开源的模型在logo去除、面部修复和物体移除上取得良好效果。…

一键安装ROS适用于Ubuntu22/20/18

一键安装ROS适用于Ubuntu22/20/18 1、简介 ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;是一个用于机器人软件开发的框架。它提供了一套工具和库&#xff0c;用于机器人应用程序的开发、测试和部署。ROS是由美国斯坦福大学机器人实验室&…

笔试题详解(C语言进阶)

前言 欢迎阅读本篇文章&#xff01;本篇文章通过一个笔试题来加强我们对C语言的理解&#xff0c;希望对你有帮助。后续我会写一个栏目&#xff0c;集合我见到的C语言题目&#xff0c;进行分析讲解。 1、题目一 判断下面程序的输出结果&#xff1a;(下面说的地址4/8字节是因为对…

Docker部署Halo容器并结合内网穿透实现公网访问本地个人博客

文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 本文主要介绍如何在CentOS 7系统使…

JAVAEE初阶 网络编程(十一)

HTTP协议 一. GET和POST方法二. Post和Get的区别三. HTTP协议中的请求报头部分1. Host2.Content-Length3.Content-Type4.User-Agent5. Referer6.Cookie 一. GET和POST方法 Get方法应用场景有很多,比如下列这个例子. Post方法主要应用在上传和登录上. 一般来说,Get方法没有body,…

百度百科词条在网络推广中的六大作用

也许很多网友都发现了&#xff0c;在网上查资料&#xff0c;百科词条往往是优先展示的。一方面因为百科是搜索引擎自身的平台&#xff0c;另一方面就是因为百科信息权威&#xff0c;网友认可度高。所以企业开展网络营销&#xff0c;百科营销是一块重要阵地。 也有的企业认为百科…

Autosar-Mcal配置详解-GPT

3.3.1添加GPT模块 方法与添加Dio相似&#xff0c;可参加Dio模块添加方法。 3.3.2 创建、配置GPT通道 1)根据需求创建GPT通道&#xff08;即创建几个定时器&#xff09; 本例中创建了3个定时器通道&#xff1a;1ms&#xff0c;100us&#xff0c;OsTimer。 2)配置GPT通道 配置T…

Android全新UI框架之常用ComposeUI组件

在Compose中&#xff0c;每个组件都是一个带有Composable注解的函数&#xff0c;被称为Composable。Compose已经预置了很多基于MD设计规范的Composable组件。 在布局方面&#xff0c;Compose提供了Column、Row、Box三种布局组件(感觉跟flutter差不多)&#xff0c;类似于传统视图…

​LeetCode解法汇总106. 从中序与后序遍历序列构造二叉树

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给定两个…

如何使用ArcGIS Pro生成等高线

无论在制图还是规划中&#xff0c;经常会使用到等高线&#xff0c;大多数情况下&#xff0c;从网上获取的高程数据都是DEM文件&#xff0c;我们可以通过ArcGIS Pro来生成等高线&#xff0c;这里为大家介绍一下生成方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的…

PHP WebSocket:技术解析与实用指南

本文旨在帮助初学者掌握在PHP中使用WebSocket的关键概念和技术。我们将深入讨论从建立连接、绑定到监听等各方面的操作&#xff0c;并提供易于理解和实践的指导。 一、socket协议的简介 WebSocket是什么&#xff0c;有什么优点 WebSocket是一个持久化的协议&#xff0c;这是…

洛谷 【算法1-2】排序

【算法1-2】排序 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 鄙人不才&#xff0c;刷洛谷&#xff0c;迎蓝桥&#xff0c;【算法1-2】排序 已刷&#xff0c;现将 AC 代码献上&#xff0c;望有助于各位 P1271 选举学生会 【深基9.例1】选举学生会 - 洛谷 题目 解答…