鸿蒙-权限管理

117 阅读1分钟

权限申请

  • abilityAccessCtrl.createAtManager
    createAtManager(): AtManager
    访问控制管理:获取访问控制模块对象

  • requestPermissionsFromUser
    requestPermissionsFromUser(context: Context, permissionList: Array): Promise<PermissionRequestResult>

context 请求权限的UIAbility的Context。
permissionList 需要校验的权限名称,合法的权限名取值可在应用权限列表中查询。

用于UIAbility拉起弹框请求用户授权。如果用户拒绝授权,将无法再次拉起弹框,需要用户在系统应用“设置”的界面中,手动授予权限。

  • GrantStatus

表示授权状态的枚举

名称说明
PERMISSION_DENIED-1未授权
PERMISSION_GRANTED0已授权
async requestPermissions(permissions: Permissions[]) {
  const atManager = abilityAccessCtrl.createAtManager()
  const requestResult = await atManager.requestPermissionsFromUser(
    getContext(),
    permissions
  )
const isAuth = requestResult.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  return isAuth === true ? Promise.resolve(true) : Promise.reject(false)
}

打开应用授权页

当我们无法拉取权限授权时,打开系统应用设置页,进行手动开启

  • bundleManager.getBundleInfoForSelfSync
    getBundleInfoForSelfSync(bundleFlags: number): BundleInfo
    以同步方法根据给定的bundleFlags获取当前应用的BundleInfo。
openPermissionSettingsPage() {
  const context = getContext() as common.UIAbilityContext
  const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
  context.startAbility({
    bundleName: 'com.huawei.hmos.settings',  // 待启动Ability所在的应用Bundle名称
    abilityName: 'com.huawei.hmos.settings.MainAbility',  // 待启动Ability名称
    uri: 'application_info_entry',  // 打开 设置->应用和元服务
    parameters: {
      pushParams: bundleInfo.name  // 打开应用详情页
    }
  })
}

通知权限申请

  • notificationManager.requestEnableNotification

    requestEnableNotification(context: UIAbilityContext): Promise<void>

    应用请求通知使能模态弹窗

    通过try catch判断是否能够拉取通知授权弹窗,不能正常弹出去打开应用授权页 openPermissionSettingsPage()

检查是否授权

  • checkAccessTokenSync
    checkAccessTokenSync(tokenID: number, permissionName: Permissions): GrantStatus
    校验应用是否被授予权限
    • tokenID 要校验应用的身份标识
    • permissionName 需要校验的权限名称

通过map获取到权限列表的权限状态,通过判断every判断权限列表是否开启了权限

checkPermissions(permissions: Permissions[]) {
 const atManager = abilityAccessCtrl.createAtManager()
 const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
 const tokenID = bundleInfo.appInfo.accessTokenId
 const grantStatus = permissions.map(item => atManager.checkAccessTokenSync(tokenID, item))
 return grantStatus.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
}