import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit'

class PermissionPlugin {
  // 检查单个权限
  checkAccessToken(permission: Permissions) {
    try {
      const atManager = abilityAccessCtrl.createAtManager();
      const bundleInfo =
        bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
      const accessTokenId = bundleInfo.appInfo.accessTokenId
      const grantStatus = atManager.checkAccessTokenSync(accessTokenId, permission);
      return grantStatus;
    } catch (e) {
      return abilityAccessCtrl.GrantStatus.PERMISSION_DENIED
    }
  }

  // 检查多个权限
  async checkPermissions(permissions: Permissions[]) {
    for (let permission of permissions) {
      const grantStatus = this.checkAccessToken(permission)
      if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
        return false
      }
    }
    return true
  }

  // 首次向用户申请授权
  async requestPermissions(permissions: Permissions[]) {
    const atManager = abilityAccessCtrl.createAtManager();
    const res = await atManager.requestPermissionsFromUser(getContext(), permissions) // 首次
    const isAuth = res.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    return isAuth ? Promise.resolve() : Promise.reject()
  }

  // 二次向用户申请授权
  async requestPermissionOnSetting(permissions: Permissions[]) {
    const atManager = abilityAccessCtrl.createAtManager();
    const grantStatus = await atManager.requestPermissionOnSetting(getContext(), permissions) // 二次
    const isAuth = grantStatus.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    return isAuth ? Promise.resolve() : Promise.reject()
  }
}

// 暴露实例对象
export const permissionPlugin = new PermissionPlugin()

上面是封装的鉴权工具类.可以直接使用.

鸿蒙中的权限如果是user_grant类型的,不仅需要在配置文件里面申请,还需要向用户申请,比如使用麦克风进行录音的时候.

导入鉴权工具类暴露出来的permissionPlugin实例,调用requestPermissions向用户申请权限,如果授权,则返回成功结果,否则返回失败结果.

一般这个时候进行二次申请,所以在catch里调用requestPermissionOnSetting方法进行二次授权.

如果还是拒绝,则弹框提示手动开启麦克风权限或者其他权限

  aboutToAppear(): void {
  async checkPermission() {
    try {
      const res = await permissionPlugin.requestPermissions(['ohos.permission.MICROPHONE'])
    } catch (e) {
      try {
       await permissionPlugin.requestPermissionOnSetting(['ohos.permission.MICROPHONE'])
      } catch (e) {
        promptAction.showToast({
          message: '如果想要体验语音搜索功能,要允许哦~ღ( ´・ᴗ・` )比心'
        })
      }
    }
  }
Logo

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

更多推荐