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()
相关推荐
熊猫钓鱼>_>17 小时前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
KevinChaos18 小时前
阳台小花园开发手记 05|HarmonyOS 7.0 互动卡片:动效进出衔接
华为·harmonyos
WHMONY19 小时前
大一独立开发鸿蒙原生 AI Agent:聊聊我为什么死磕端侧模型与“技术平权”
harmonyos
todoitbo20 小时前
把 K-Lite「什么都能播」搬上鸿蒙 PC:影匣播放器的 FFmpeg + libass 原生移植实录
华为·ffmpeg·harmonyos·鸿蒙
威哥爱编程1 天前
模拟面试智能体开发实战 05:给面试官接上题库和检索,题目结构化、大纲可溯源,AI 不再凭印象出题
python·agent·harmonyos
威哥爱编程1 天前
模拟面试智能体开发实战 06:答得好怎么追问、答得错怎么点破,追问引擎让面试官会深挖会纠错
python·agent·harmonyos
c2892480843s1 天前
【鸿蒙心迹】深色模式适配实战:资源限定词、动态取色与一张图两个主题
移动开发·harmonyos·鸿蒙·arkui·深色模式
贾伟康1 天前
HarmonyOS API 26 Navigation 连续栈操作:中间过程合并、最终状态与强制新实例
harmonyos·arkts·navigation·navpathstack·路由治理
贾伟康2 天前
HarmonyOS API 26 Navigation 跨包路由:router_map、HSP 按需加载与失败回落
harmonyos·arkts·模块化·navigation·hsp
KevinChaos2 天前
阳台小花园开发手记 04|HarmonyOS 7.0 互动卡片:倾斜手机时的卡片效果
华为·harmonyos