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()
相关推荐
Andy醒1 小时前
HarmonyOS . 沉浸状态栏使用
harmonyos·鸿蒙
yuwinter1 小时前
鸿蒙HarmonyOS学习笔记(2)
笔记·学习·harmonyos
ZZZCY20032 小时前
华为ENSP--IP编址及静态路由配置
网络·华为
jikuaidi6yuan3 小时前
鸿蒙系统(HarmonyOS)分布式任务调度
分布式·华为·harmonyos
智慧化智能化数字化方案9 小时前
华为IPD流程管理体系L1至L5最佳实践-解读
大数据·华为
ZZZCY200310 小时前
华为VER系统及CLI命令熟悉
华为
SameX11 小时前
HarmonyOS Next 安全生态构建与展望
前端·harmonyos
SameX11 小时前
HarmonyOS Next 打造智能家居安全系统实战
harmonyos
syj_11113 小时前
初识ArkUI
ui·arkts·arkui
Random_index18 小时前
#Uniapp篇:支持纯血鸿蒙&发布&适配&UIUI
uni-app·harmonyos