ArkTs 申请权限最佳实践

116 阅读1分钟

权限


1、检查是否授权

export async function checkPermission(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus>{


  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager()

  let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED


  try{

    let bundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    let appInfo = bundleInfo.appInfo
    let tokenId: number = appInfo.accessTokenId

    grantStatus = await atManager.checkAccessToken(tokenId, permission)

    return grantStatus
    
  } catch (e) {

    return grantStatus
  }

}

2、申请权限

export async function requestPermission(context: Context, permissionList: Array<Permissions>){

  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager()

  atManager.requestPermissionsFromUser(context, permissionList)
    .then((data) => {

      let grantStatus: Array<number> = data.authResults

      showLog('授权结果--'+ toJsonStr(grantStatus))

    }).catch((err: ErrorCode) => {

    showLog('授权失败--'+ toJsonStr(err))

  })
}

3、多个权限检查是否授权并申请授权

export function xPermission(context: Context, permissionList: Array<Permissions>): Promise<Array<Permissions>>{

  return new Promise<Array<Permissions>>((resolve, reject) => {

    //保存未授权的权限列表
    let denieds: Array<Permissions> = []
    //保存已经授权的权限列表
    let granteds: Array<Permissions> = []

    try{

      permissionList.forEach((item: Permissions) => {

        checkPermission(item).then((data: abilityAccessCtrl.GrantStatus) => {


          if(data != abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED){

            //未授权添加到队列
            denieds.push(item)

          } else {
            granteds.push(item)

          }

          if((denieds.length + granteds.length) == permissionList.length) resolve(denieds)

        }).catch((err: ErrorCode) => {

          showLog('xPermissions -- 异常='+JSON.stringify(err))
        })

      })

    } catch (e) {
      showLog('授权失败--'+JSON.stringify(e))

      reject(e)
    }

  })
}

4、调用

let context = getContext(this) as common.UIAbilityContext

    xPermission(context, ['ohos.permission.WRITE_MEDIA',
      'ohos.permission.CAMERA',
      'ohos.permission.ACCESS_BLUETOOTH',
      'ohos.permission.LOCATION_IN_BACKGROUND',
      'ohos.permission.LOCATION'])
      .then(async (data: Array<Permissions>) => {

        if(null!=data && data.length > 0){

          showLog('xPermission -- =开始授权')

          requestPermission(context, data)

        }else {

          showLog('xPermission -- 全部授权')
        }
      })
      .catch((err: ErrorCode) => {


        showLog('xPermission -- 授权失败')

      })