HarmonyOS Stage模型 权限申请

配置声明权限

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

TypeScript 复制代码
{
  "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接口对当前调用者进行权限校验。

    TypeScript 复制代码
    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'三个权限 已授权前两个调用结果如下

    TypeScript 复制代码
     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: 537654415
     I 0FEFE/JsApp: RequestPermission checkAccessToken success, data->-1
     I 0FEFE/JsApp: RequestPermission checkAccessToken success, data->-1
     I 0FEFE/JsApp: RequestPermission checked successfully: false

向用户申请权限

TypeScript 复制代码
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) {
          // 如果有任何一个权限没有被授权,立即返回 false
          return false;
        }
      }
      // 所有权限都被授权,返回 true
      return true;
    } catch (err) {
      console.error(`RequestPermission requestPermissionsFromUser failed, code is ${err.code}, message is ${err.message}`);
      // 如果发生异常,也返回 false
      return false;
    }
  }
}

回调版

TypeScript 复制代码
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()
相关推荐
猫林老师10 分钟前
HarmonyOS分布式数据库深度应用
harmonyos
我是华为OD~HR~栗栗呀33 分钟前
华为OD-Java面经-21届考研
java·c++·后端·python·华为od·华为·面试
LucianaiB2 小时前
【成长纪实】从“Hello World”到分布式实战的进阶之路
harmonyos·鸿蒙·成长纪实
万添裁3 小时前
基于ArkAnalyzer的HarmonyOS通用API多端安全性分析工具
harmonyos·ark
无风听海3 小时前
HarmonyOS之启动应用内的UIAbility组件
前端·华为·harmonyos
Bert丶seven4 小时前
鸿蒙Harmony实战开发教学(No.8)-Hyperlink超链接组件基础到进阶篇
华为·harmonyos·arkts·arkui·1024程序员节·开发教程
JohnnyDeng945 小时前
ArkTs-Android 与 ArkTS (HarmonyOS) 存储目录全面对比
android·harmonyos·arkts·1024程序员节
王嘉俊9255 小时前
HarmonyOS 超级终端与服务卡片开发:打造无缝多设备交互体验
华为·架构·harmonyos·arkts·1024程序员节
俩毛豆6 小时前
【图片】【编缉】图片增加水印(通过组件的Overlay方法增加水印)
前端·harmonyos
逻极9 小时前
HarmonyOS 5 鸿蒙多设备适配与分布式开发指南
分布式·华为·harmonyos·鸿蒙