1. 定义一个名为Permission的类。

class Permission {
  
}

export const permission = new Permission()

2.类中定义一个requestPermission方法用于请求用户授权。

  • 首先要拿到权限管理对象。
  • 在调用它身上的requestPermissionsFromUser方法向用户申请权限。
  • 权限列表要从外边传过来。
  • 最后要把授权结果返回出去。
  • 注意:requestPermissionsFromUser 如果用户拒绝授权,将无法再次拉起弹框,只会返回授权结果,可以发起二次授权requestPermissionOnSetting
class Permission {
  // 首次申请权限
  async requestPermission(permissions: Permissions[]) {
    // 1. 创建权限管理对象
    const atManager = abilityAccessCtrl.createAtManager()
    const ctx = AppStorage.get<Context>('context')
    if (ctx) {
      // 2. 发起授权请求
      const res =  await atManager.requestPermissionsFromUser(ctx, permissions)
      // 3. 判断用户是否授权
      const flag = res.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED )
      return flag
    } else {
      return false
    }
  }
}

export const permission = new Permission()

 3. 类中定义一个permissionSetting方法用于二次向用户申请授权。

  •  与上同理
  • requestPermissionOnSetting每次都会拉起设置弹窗
import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit'

class Permission {
  // 申请权限
  async requestPermission(permissions: Permissions[]) {
    // 1. 创建权限管理对象
    const atManager = abilityAccessCtrl.createAtManager()
    const ctx = AppStorage.get<Context>('context')
    if (ctx) {
      // 2. 申请授权
      const res =  await atManager.requestPermissionsFromUser(ctx, permissions)
      // 3. 判断用户是否授权
      const flag = res.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED )
      return flag
    } else {
      return false
    }
  }

  // 二次申请
  async permissionSetting(permissions: Permissions[]) {
    const atManager = abilityAccessCtrl.createAtManager()
    const ctx = AppStorage.get<Context>('context')
    if (ctx) {
      const res = await atManager.requestPermissionOnSetting(ctx, permissions)
      const flag = res.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
      return flag
    }
    return false
  }
}

export const permission = new Permission()

 

 可以很灵活的去使用

permissions: Permissions[] = ['ohos.permission.MICROPHONE']

async getPermissions() {
    try {
      // 申请权限
      const isOK1 = await permission.requestPermission(this.permissions)
      if (isOK1) return

      // 弹窗
      const res = await promptAction.showDialog(this.confirmConfig)

      if (res.index === 0) return router.back()

      // 二次申请
      const isOK2 = await permission.permissionSetting(this.permissions)
      if (isOK2) return
      router.back()
    } catch (e) {
      router.back()
    }
}
Logo

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

更多推荐