此文章内容兼容API12,使用harmony next应用开发

权限说明

1,权限类型

  • 数据
    (1)个人数据:照片、通讯录、日历、位置等
    (2)设备数据:设备标识、相机、麦克风
  • 功能
    (1)设备功能:访问摄像头、麦克风、打电话、联网
    (2)应用功能:弹出悬浮窗、创建快捷方式

2,权限分类

  • 系统授权 system_grant
    (1)配置文件中声明后,系统在安装时自动授予权限
  • 用户授权 user_grant
    (1)不仅需要配置文件声明,还需要动态申请权限,确认用户授权才能进行下一步操作

2,权限申请
(1)所有权限必须声明在配置文件
(2)敏感权限必须动态申请,必须填写权限使用理由字段。 敏感权限:地理位置、相机、麦克风、日历、健身运动、身体传感器、音乐、文件、图片视频等
(3)权限组,会将多个权限组合在一起。见 应用权限组列表

3,可申请单次授权,“仅本次允许/允许本次使用”
仅支持下列权限:

  • 剪切板:[“ohos.permission.READ_PASTEBOARD”]
  • 模糊位置:[“ohos.permission.APPROXIMATELY_LOCATION”]
  • 位置:[“ohos.permission.LOCATION”]
  • 后台位置:[“ohos.permission.LOCATION_IN_BACKGROUND”]

代码样例

1,配置文件声明

{
  "module": {
   ...
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "always"
        }
      }]
  ...
  }
}

2,检查是否已授权
使用前必须检查是否已有该权限;

public static checkAccessToken(permission: Permissions): abilityAccessCtrl.GrantStatus {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
    // 获取应用程序的accessTokenID
    let tokenId: number = 0;
    try {
      let bundleInfo: bundleManager.BundleInfo =
        bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
      tokenId = appInfo.accessTokenId;
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      console.error(`Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
    }
    // 校验应用是否被授予权限
    try {
      grantStatus = atManager.checkAccessTokenSync(tokenId, permission);
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`);
    }
    return grantStatus;
  }
-------------------------
const permissions: Array<Permissions> = ['ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION'];
async function checkPermissions(): Promise<void> {
  let grantStatus: abilityAccessCtrl.GrantStatus = await checkPermissionGrant(permissions[0]);
  if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
    // 已经授权,可以继续访问目标操作
  } else {
    // 申请位置权限
  }
}

3,动态申请授权
此方法必须依附 UIAbility 或 UIExtensionAbility 类型引用

public static reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext,
    reject: () => void, success: () => void) {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
    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) {
        } else {
          // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
          reject()
          return;
        }
      }
      success()
      // 授权成功
    }).catch((err: BusinessError) => {
      console.error(`zhf  Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
    })
  }
----------------------------------------
PermissionUtil.reqPermissionsFromUser(permissions,getContext(this) as common.UIAbilityContext, 
() => {
    //用户拒绝某些权限
    deny()
    this.showSecondPermissionDialog(permissions)
},
 () => {
    //都已授权
    grant();
})

4,处理授权结果
结束后必须确认用户已授权才能进行下一步;若用户拒绝授权后,将无法再次拉起弹出,可以引导跳转设置页面手动授权
5,跳转设置页面,申请授权

 public static goSystemPermissionSetting(permissions: Array<Permissions>,context: common.UIAbilityContext){
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    atManager.requestPermissionOnSetting(context, permissions)
  }

权限API

1,配置文件中,requestPermissions 属性

属性名 含义 数据类型 是否必填 赋值解释
name 权限名称 string 必须是系统定义的权限名称 应用权限列表
reason 申请权限的原因 string user_grant权限时必填;system_grant 选填 使用string类资源引用。格式为$string: ***。
usedScene 权限使用的场景,{ abilities ,when } 对象 必填

abilities :使用权限的UIAbility或者ExtensionAbility组件的名称,可选
when:调用时机。可选,但只能填入 [ inuse(使用时)、always(始终),不能为空。 ]

其他

1,子模块中申请的权限,无需再主项目重复添加
2,用户拒绝后将无法再次拉起弹出,可以引导跳转设置页面手动受于权限

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐