HarmonyOS 鸿蒙Next中手写一个权限申请工具

HarmonyOS 鸿蒙Next中手写一个权限申请工具 一、权限申请的步骤

当我们申请一个需要用户授权的权限时,需要做以下工作

  • 判断是否授权了权限
  • 申请权限
  • 对于拒绝授权的情况,需要二次弹出配置权限弹窗
  • 用户拒绝授权时,应用页面需要展示提示语

每次申请权限都要进行这么多步骤的操作过于繁琐,那么写一个工具类就有必要了。初步实现效果为调用申请权限的静态方法,回调授权成功或者失败,失败就展示提示语。

二、效果展示

如图为点击开启权限,首先拒绝授权,页面出现提示语;再次点击授权,出现设置权限弹窗,此时选择不允许,提示语依然存在;再点击按钮,此时选择允许,提示语消失,授权成功

三、关键代码逻辑

(1)检查权限授权与否

/**
 * 检查权限是否已授权
 * @param permission
 * @param onGrant
 */
static checkPermissionGrant(permission: Permissions, context: common.UIAbilityContext,
  onGrant: (granted: boolean) => void
): void {
  let hasPermission = false;
  let tokenId: number = 0;
  try {
    let bundleInfo: bundleManager.BundleInfo =
      bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
    let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
    tokenId = appInfo.accessTokenId;
  } catch (error) {
  }

  try {
    let atManager = abilityAccessCtrl.createAtManager();
    let granted = atManager.checkAccessTokenSync(tokenId, permission);
    hasPermission = granted === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED
  } catch (error) {
  }
  if (hasPermission) {
    //已获得权限,回调成功的方法
    onGrant(true)
  } else {
    //未获得权限,去申请权限
    PermissionUtil.requestPermissions(permission, context, (granted: boolean) => {
      onGrant(granted)
    });
  }
}

(2)根据authResults和dialogShownResults判断是否授权成功,是否需要弹出设置权限弹窗

static requestPermissions(permission: Permissions, context: common.UIAbilityContext,
  onGrant: (granted: boolean) => void): void {
  let atManager = abilityAccessCtrl.createAtManager();
  try {
    atManager.requestPermissionsFromUser(context, [permission]).then((data) => {
      if (data.authResults[0] === 0) {
        //用户已授权
        onGrant(true)
      } else if (data.authResults[0] === -1) {
        //用户未授权
        if (data.dialogShownResults && (data.dialogShownResults[0])) {
          // 表示有弹框表明已经向用户展示请求授权的弹窗但是用户拒绝了授权,此时需要在页面添加提示语
          onGrant(false)
        } else {
          //表示当前应用没有被授权且没有向用户展示请求授权的弹框,此时可以弹权限设置弹框
          PermissionUtil.openPermissionsSetting(permission, context, onGrant)
        }
      }
    }).catch((err: Error) => {
    });
  } catch (err) {
  }
}

(3)根据权限设置弹窗返回值判断是否授权成功

static openPermissionsSetting(permission: Permissions, context: common.UIAbilityContext,
  onGranted: (granted: boolean) => void): void {
  let atManager = abilityAccessCtrl.createAtManager();
  atManager.requestPermissionOnSetting(context, [permission])
    .then((data: Array<abilityAccessCtrl.GrantStatus>) => {
      if (data[0] === -1) {
        //用户再次拒绝了授权
        onGranted(false)
      } else if (data[0] === 0) {
        //用户同意授权
        onGranted(true)
      }
    })
    .catch((err: BusinessError) => {
    });
}
2 回复

在HarmonyOS鸿蒙Next中手写一个权限申请工具,可以通过鸿蒙提供的权限管理API实现。首先,需要在config.json中声明所需的权限,例如:

{
  "module": {
    "reqPermissions": [
      {
        "name": "ohos.permission.CAMERA"
      },
      {
        "name": "ohos.permission.READ_EXTERNAL_STORAGE"
      }
    ]
  }
}

接着,在代码中使用AbilityContextrequestPermissionsFromUser方法进行权限申请。以下是一个简单的示例:

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

let context = ...; // 获取AbilityContext
let permissionList = ['ohos.permission.CAMERA', 'ohos.permission.READ_EXTERNAL_STORAGE'];

context.requestPermissionsFromUser(permissionList, (err, data) => {
  if (err) {
    console.error('Failed to request permissions', err);
  } else {
    console.log('Permissions granted:', data);
  }
});

requestPermissionsFromUser方法会触发系统弹窗,用户可以选择允许或拒绝权限。回调函数中的data参数会返回用户的选择结果。如果用户拒绝权限,可以根据业务逻辑进行处理。

此外,可以使用abilityAccessCtrl模块的checkAccessToken方法在运行时检查权限状态:

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

let atManager = abilityAccessCtrl.createAtManager();
let tokenId = ...; // 获取应用的tokenId

let result = atManager.checkAccessToken(tokenId, 'ohos.permission.CAMERA');
if (result === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
  console.log('Camera permission granted');
} else {
  console.log('Camera permission denied');
}

通过以上步骤,可以实现一个基本的权限申请工具。

更多关于HarmonyOS 鸿蒙Next中手写一个权限申请工具的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,手写一个权限申请工具可以通过以下步骤实现:

  1. 创建权限申请类:

    • 新建一个Java类,如PermissionUtil,用于封装权限申请逻辑。
  2. 检查权限:

    • 使用context.verifySelfPermission(permission)方法检查当前是否拥有指定权限。
  3. 申请权限:

    • 如果未授权,调用context.requestPermissionsFromUser(permissions, requestCode)方法请求权限。
  4. 处理回调:

    • onRequestPermissionsResult中处理用户授权结果,根据授权状态执行相应操作。
  5. 工具类封装:

    • 将上述逻辑封装成静态方法,方便在应用中调用。

通过这种方式,可以便捷地在HarmonyOS应用中实现权限申请功能。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!