PermissionUtils.ets 3.3 KB
import { abilityAccessCtrl, bundleManager, common, Permissions, Want } from '@kit.AbilityKit'
import { BusinessError } from '@kit.BasicServicesKit'
import { AppUtils } from './AppUtils'
import { Logger } from './Logger'

/**
 * 权限工具类
 * */
export class PermissionUtils {
  //相机权限
  static CAMERA: Permissions = 'ohos.permission.CAMERA'
  //文件权限
  static READ_MEDIA: Permissions = 'ohos.permission.READ_MEDIA'
  static WRITE_MEDIA: Permissions = 'ohos.permission.WRITE_MEDIA'
  private static tokenId: number = 0

  /**检查权限是否授权*/
  static async checkPermissions(permission: Permissions): Promise<boolean> {
    let hasPermissions = false;
    let grantStatus: abilityAccessCtrl.GrantStatus = await PermissionUtils.checkAccessToken(permission);

    if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
      // 已经授权,可以继续访问目标操作
      hasPermissions = true;
    } else {
      hasPermissions = false;
      // 申请日历权限
    }
    return hasPermissions;
  }

  /**动态申请权限*/
  static reqPermissionsFromUser(permissions: Array<Permissions>, component: Object): Promise<boolean> {

    return new Promise((resolve, fail) => {
      let context = getContext(component) as common.UIAbilityContext;
      let atManager = abilityAccessCtrl.createAtManager();
      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) {
            // 用户授权,可以继续访问目标操作
            resolve(true);
          } else {
            resolve(false)
          }
        }
      }).catch((err: Error) => {
        fail(err)
      })
    });
  }

  /**跳转设置页面*/
  static openPermissionsInSystemSettings(context: Object): void {
    let uiContext = getContext(context) as common.UIAbilityContext;
    let wantInfo: Want = {
      bundleName: 'com.huawei.hmos.settings',
      abilityName: 'com.huawei.hmos.settings.MainAbility',
      uri: 'application_info_entry',
      parameters: {
        pushParams: AppUtils.getPackageName(uiContext) // 打开指定应用的设置页面
      }
    }
    uiContext.startAbility(wantInfo)
  }

  private static async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;

    // 获取应用程序的accessTokenID
    if (PermissionUtils.tokenId == 0) {
      try {
        let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
        let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
        PermissionUtils.tokenId = appInfo.accessTokenId;
      } catch (error) {
        const err: BusinessError = error as BusinessError;
      }
    }
    // 校验应用是否被授予权限
    try {
      grantStatus = await atManager.checkAccessToken(PermissionUtils.tokenId, permission);
    } catch (error) {
      const err: BusinessError = error as BusinessError;
    }

    return grantStatus;
  }

}