HarmonyOS鸿蒙Next中动态权限申请

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

HarmonyOS鸿蒙Next中动态权限申请 动态申请ACCESS_DISTRIBUTED_NETWORK_STATE权限时,用户拒绝后无法再次触发弹窗,如何处理?

4 回复

权限弹框目前规格是始终允许或者拒绝,也就是弹一次窗口。如果后续用户禁止后,需要弹出框引导用户去设置权限界面开启相应权限。详细可以参考向用户申请授权开发步骤中的第四步:处理授权结果中引导用户到系统设置中打开相应的权限或者弹出二次授权弹窗。

二次向用户申请授权-申请应用权限-应用权限管控-程序访问控制-安全-系统 - 华为HarmonyOS开发者

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


系统不鼓励频繁弹窗打扰用户,如果调用requestPermissionsFromUser()接口被用户拒绝授权,将无法再次拉起弹窗,此时可使用requestPermissionOnSetting()二次拉起权限弹窗,或者引导用户跳转到系统设置的权限页进行手动开启权限,具体操作如下:

申请相关权限前应使用checkAccessToken()检查是否有该权限,若无权限则进行如下操作。

使用requestPermissionsFromUser()接口请求相应的权限时,系统会拉起权限弹窗。示例代码如下:

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);
  }
});

用户已经拒绝过该权限则不会再次弹起,需要引导用户开启权限有以下两种方案。

方案一
调用requestPermissionsFromUser()二次拉起权限设置弹窗,示例代码如下:

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

let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let context: Context = getContext(this) as common.UIAbilityContext;
atManager.requestPermissionOnSetting(context, ['ohos.permission.CAMERA']).then((data: Array<abilityAccessCtrl.GrantStatus>) => {
  console.info('data:' + JSON.stringify(data));
}).catch((err: BusinessError) => {
  console.error('data:' + JSON.stringify(err));
});

注:不鼓励频繁调用requestPermissionOnSetting()进行权限请求。

方案二
可以引导用户点击跳转到对应应用的权限页面,让用户手动授权,示例代码如下:

import { common } from '@kit.AbilityKit';

@Entry
@ComponentV2
struct SelectCollection {
  build() {
    Column() {
      Button('跳转到对应应用的通知权限页').onClick(() => {
        let context = getContext(this) as common.UIAbilityContext;
        context.startAbility({
          bundleName: 'com.huawei.hmos.settings',
          abilityName: 'com.huawei.hmos.settings.MainAbility',
          uri: 'systemui_notification_settings', //uri为空的时候,拉起设置主页面
          parameters: {
            pushParams: {
              bundleName: 'com.example.multishopping'//传要跳转的对应应用的包名
            }
          }
        });
      })
    }
    .width('100%')
    .height('100%')
  }
}

当用户触发需要使用权限的场景时,首先使用checkAccessToken()判断当前是否已经授权,如果已经授权,则可以直接访问目标操作,否则需要向用户申请授权。调用requestPermissionsFromUser()方法可以向用户申请授权。若之前已经拒绝过该权限,可使用requestPermissionOnSetting()二次拉起权限弹窗,或者引导用户跳转到系统设置的权限页进行手动开启权限

在HarmonyOS鸿蒙Next中,动态权限申请是通过@ohos.abilityAccessCtrl模块实现的。开发者需要在应用的config.json文件中声明所需的权限,并在运行时通过requestPermissionsFromUser方法向用户请求权限。权限请求的结果通过回调函数返回,开发者可以根据用户的选择进行相应的处理。动态权限申请的核心代码示例如下:

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

let atManager = abilityAccessCtrl.createAtManager();

// 定义需要申请的权限列表
let permissions: Array<string> = ['ohos.permission.CAMERA', 'ohos.permission.MICROPHONE'];

// 请求权限
atManager.requestPermissionsFromUser(this.context, permissions, (err, data) => {
    if (err) {
        console.error(`Request permissions failed, code is ${err.code}, message is ${err.message}`);
    } else {
        console.info('Request permissions success:', JSON.stringify(data));
    }
});

config.json中声明权限的示例如下:

{
    "module": {
        "requestPermissions": [
            {
                "name": "ohos.permission.CAMERA",
                "reason": "需要摄像头权限以进行拍照"
            },
            {
                "name": "ohos.permission.MICROPHONE",
                "reason": "需要麦克风权限以进行录音"
            }
        ]
    }
}

通过这种方式,开发者可以在应用运行时动态申请所需的权限,并根据用户的选择进行后续操作。

在HarmonyOS(鸿蒙)Next中,动态权限申请是通过requestPermissionsFromUser方法实现的。开发者需要在config.json中声明所需权限,然后在代码中调用requestPermissionsFromUser方法,传入权限数组和回调函数。用户授权后,回调函数会返回授权结果。建议在应用启动或相关功能触发时申请权限,确保功能正常使用。

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