HarmonyOS 鸿蒙Next申请权限时,如何判断本次允许,使用时允许和拒绝。

HarmonyOS 鸿蒙Next申请权限时,如何判断本次允许,使用时允许和拒绝。 鸿蒙申请权限时,如何判断本次允许,使用时允许和拒绝。

文档中找不到相关描述。

3 回复

可在 requestPermissionsFromUser 的回调函数中 data.authResults 获取,代码参考如下:

import { abilityAccessCtrl, Context, PermissionRequestResult, common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = getContext(this) as common.UIAbilityContext;
atManager.requestPermissionsFromUser(context, ['ohos.permission.CAMERA'], (err: BusinessError, data: PermissionRequestResult) => {
  if (err) {
    console.error(`requestPermissionsFromUser fail, err->${JSON.stringify(err)}`);
  } else {
    console.info('data:' + JSON.stringify(data));
    console.info('data permissions:' + data.permissions);
    console.info('data authResults:' + data.authResults);
    console.info('data dialogShownResults:' + data.dialogShownResults);
  }
});

对应的权限授权结果可参考:PermissionRequestResult

其中 authResults 结果中,各项权限申请结果如下:

  • -1:未授权。①dialogShownResults 返回为 true,表示用户首次申请;②dialogShownResults 返回为 false,表示权限已设置,无需弹窗,需要用户在 “设置” 中修改。
  • 0:已授权。
  • 2:未授权,表示请求无效,可能原因有:
    • 未在设置文件中声明目标权限。
    • 权限名非法。
    • 部分权限存在特殊申请条件,在申请对应权限时未满足其指定的条件

更多关于HarmonyOS 鸿蒙Next申请权限时,如何判断本次允许,使用时允许和拒绝。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


每次进入页面调用requestPermissionFromUser,当用户选择本次允许后,重启应用再次进入页面,requestPermissionFromUser会直接返回-1,是不是应该再次弹窗提示授权才对?

在HarmonyOS(鸿蒙)系统中,申请权限时判断用户的响应(本次允许、使用时允许、拒绝)主要通过权限申请结果的回调来实现。具体步骤如下:

  1. 申请权限:使用requestPermissionsFromUser方法向用户申请所需权限。

  2. 处理回调:在申请权限后,系统会回调onRequestPermissionsResult方法,该方法包含三个参数:requestCode(请求码,用于区分不同的权限请求)、permissions(申请的权限列表)、grantResults(权限申请结果列表)。

  3. 判断结果:遍历grantResults列表,根据每个结果的值来判断用户的响应:

    • PackageManager.PERMISSION_GRANTED:表示用户授予了权限,对应“本次允许”或“使用时允许”。
    • PackageManager.PERMISSION_DENIED:表示用户拒绝了权限。为了区分是永久拒绝还是仅本次拒绝,可以进一步调用shouldShowRequestPermissionRationale方法。如果该方法返回true,表示用户之前拒绝了权限但可以选择解释后再次请求(通常视为“使用时允许”前的拒绝);如果返回false,则可能是用户选择了“不再提示”的永久拒绝。

示例代码片段(简化):

// 假设已省略请求权限的代码
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    for (int result : grantResults) {
        if (result == PackageManager.PERMISSION_GRANTED) {
            // 本次允许或使用时允许
        } else {
            // 拒绝
            if (shouldShowRequestPermissionRationale(permissions[0])) {
                // 用户之前拒绝了但可以选择解释后再次请求
            } else {
                // 用户可能选择了永久拒绝
            }
        }
    }
}

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部