#鸿蒙应用开发中-如何申请user_grant权限

307 阅读3分钟

1.配置声明权限

在 module.json5 中添加权限说明

01添加网络权限.jpg

2.添加reason权限使用理由

a. 当申请的权限为 user_grant 权限时必填,并且需要进行多语种适配。 b. 参考句式:用于某事,如:(麦克风)用于录制加密视频和音频。

02添加reason.jpg

3.判断是否有权限

Button('检测权限')
  .onClick(() => {
    /*
     * 判断是否有权限
     * */
    //bundleInfo应用程序包的信息
    const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    //tokenID应用的唯一标识
    const tokenID = bundleInfo.appInfo.accessTokenId
​
    //程序控制访问程序
    const atManager = abilityAccessCtrl.createAtManager()
    //检测应用是否获得权限
    const authResults = atManager.checkAccessTokenSync(tokenID, 'ohos.permission.READ_CALENDAR')
    AlertDialog.show({ message: JSON.stringify(authResults, null, 2) })
    // router.pushUrl({ url: '/' })
  })

4.动态申请权限

Button('动态申请权限')
  .onClick(async () => {
    /*
     * 动态申请权限
     * */
    //1.程序访问控制管理
    const atManager = abilityAccessCtrl.createAtManager()
    //2.动态的申请权限,并返回授权结果,读写共用一个弹窗(属于同一个权限组才可以共用一个弹窗)
    const result = await atManager.requestPermissionsFromUser(getContext(), ['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'])
    AlertDialog.show({ message: JSON.stringify(result, null, 2) })
  })

5.处理授权结果

Button('处理授权结果')
  .onClick(() => {
    /*
 * 处理授权结果
 * */
    //如果不指定类型只能使用一些通用的类型
    // 1.获取上下文
    const context = getContext() as common.UIAbilityContext
    // 2.获取包信息
    const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    // 3.快速打开指定的权限设置页
    context.startAbility({
      bundleName: 'com.huawei.hmos.settings',
      abilityName: 'com.huawei.hmos.settings.MainAbility',
      uri: 'application_info_entry',
      parameters: {
        // 按照包名打开对应思的权限设置页
        pushParams: bundleInfo.name
      }
    })
  })

6.申请user_grant权限的封装类

import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';
​
/*如何申请权限*/
class PermissionManager {
  /*检查是否授权*/
  checkPermissions(permissions: Permissions[]) {
    //1.获取bundleInfo应用程序包的信息
    const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    //2.获取tokenID应用的唯一标识
    const tokenID = bundleInfo.appInfo.accessTokenId
​
    //3.获取程序控制访问程序
    const atManager = abilityAccessCtrl.createAtManager()
    //4.检测应用是否获得权限(核心API)
    const grantStates = permissions.map(item => {
      return atManager.checkAccessTokenSync(tokenID, item)
    })
    //5.返回权限状态,检测里面是不是都满足权限,有一个不满足就为false
    return grantStates.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  }
​
  /*动态申请授权(首次弹窗申请)*/
  async requestPermissions(permissions: Permissions[]) {
    //1.程序访问控制管理
    const atManager = abilityAccessCtrl.createAtManager()
    //2.动态的申请权限,并返回授权结果,读写共用一个弹窗(属于同一个权限组才可以共用一个弹窗)
    const result = await atManager.requestPermissionsFromUser(getContext(), permissions)
    //3.检查权限的结果,每一项都通过就返回true
    const isAuth = result.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    // 返回 Promise 授权结果
    /*
     * Promise.resolve(true)  成功 程序继续执行
     * Promise.reject(false)  失败 后续代码不再执行
     * */
    return isAuth ? Promise.resolve(true) : Promise.reject(false)
  }
​
  /*处理授权结果,打开设置页*/
  openPermissionSettingPage() {
    //如果不指定类型只能使用一些通用的类型
    // 1.获取上下文
    const context = getContext() as common.UIAbilityContext
    // 2.获取包信息,动态获取AppScope/app.json5的包信息
    const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    // 3.快速打开指定的权限设置页
    context.startAbility({
      bundleName: 'com.huawei.hmos.settings',
      abilityName: 'com.huawei.hmos.settings.MainAbility',
      uri: 'application_info_entry',
      parameters: {
        // 按照包名打开对应思的权限设置页
        pushParams: bundleInfo.name
      }
    })
  }
}
​
export const permissionManager = new PermissionManager()
​
/*
 * checkPermissions的使用示例
 * */
/*
Button('检测权限-封装')
  .onClick(() => {
    const res = permissionManager.checkPermissions(['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'])
    AlertDialog.show({ message: JSON.stringify(res, null, 2) })
  })*//*requestPermissions的使用示例*/
/*
  Button('动态申请权限-封装')
          .onClick(async () => {
            //如果用户拒绝后后续操作将会发生改变或不执行
            try {
              const res = await permissionManager.requestPermissions(['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'])
              AlertDialog.show({ message: JSON.stringify(res, null, 2) })
            } catch (err) {
              promptAction.showToast({ message: JSON.stringify(err) })
            }
          })
 *//*openPermissionSettingPage的使用示例*/
/*
Button('处理授权结果-封装')
  .onClick(() => {
    permissionManager.openPermissionSettingPage()
  })
  示例2
Button('动态申请权限-封装')
          .onClick(async () => {
            //如果用户拒绝后后续操作将会发生改变或不执行
            try {
              const res = await permissionManager.requestPermissions(['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'])
              AlertDialog.show({ message: '已成功开启日历权限' })
            } catch (err) {
              promptAction.showDialog({
                alignment: DialogAlignment.Center,
                message: '调用日历功能需要开启日历权限,请在设置中开启权限',
                buttons: [
                  {
                    text: '取消',
                    color: '#ff9d9d92'
                  }, {
                  text: '去设置',
                  color: '#ff131312'
                }
                ]
              })
                .then(res => {
                  if (res.index === 1) {
                    permissionManager.openPermissionSettingPage()
                  }
                })
            }
          })
  * */