HarmonyOS鸿蒙Next应用如何实现引导用户跳转当前APP设置详情页开启权限?

HarmonyOS鸿蒙Next应用如何实现引导用户跳转当前APP设置详情页开启权限? 众所周知在鸿蒙应用中,向用户申请权限时,会弹出系统请求授权的弹框。当用户拒绝了你申请的权限,弹框会直接关闭。当下次触发同样的权限申请,会直接返回失败,不会再唤起系统的权限申请弹框

在这种场景下,我们需要引导用户去系统设置中,开启咱们的APP详情页,手动去开启权限。

很多应用会直接提示文本,让用户自己系统设置中找。这样的体验非常不友好,因为用户是很懒的,我们要减少用户的操作步骤

鸿蒙应用如何实现引导用户跳转当前APP设置详情页开启权限?

cke_320.png


更多关于HarmonyOS鸿蒙Next应用如何实现引导用户跳转当前APP设置详情页开启权限?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

一、结论

在以上的场景中,我们需要提示文本的基础上,添加自动跳转到设置应用的按钮,让用户快捷跳转到系统设置中,对应的APP详情页面。

如下图所示:

cke_447.png

只需要在系统申请权限失败后,通过startAbility跳转到系统设置,通过配置参数为详情页和传递当前咱们应用的包名,就可以跳转到系统设置的APP详情页面。

当然现在鸿蒙系统也提供第二种方式,参见链接:鸿蒙应用如何处理拒绝权限二次申请授权?请提供源码和步骤讲解-华为开发者问答 | 华为开发者联盟鸿蒙应用如何处理拒绝权限二次申请授权鸿蒙应用如何处理拒绝权限二次申请授权

二、代码实现和详细解释

跳转到系统应用

private toSysSettingPage(){
  globalThis.sysContext.startAbility({
    bundleName: 'com.huawei.hmos.settings', //系统设置应用的包名
    abilityName: 'com.huawei.hmos.settings.MainAbility',
    uri: 'application_info_entry', // APP详情页
    parameters: {
      pushParams: globalThis.sysContext.abilityInfo.bundleName // 当前应用包名
    }
  });
}

权限申请示例:

async aboutToAppear() {
  let isHave: boolean = await PermissionsUtil.requestPermission();
  if(isHave){
    // 用户允许权限后 doing
  }else{
    this.toSysSettingPage();
  }
}

单一权限申请工具类:

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

/**
 * 权限工具
 */
export class PermissionsUtil{

  static async reqPermissionsFromUser(): Promise<number[]> {
    let context = getContext() as common.UIAbilityContext;
    let atManager = abilityAccessCtrl.createAtManager();
    let grantStatus = await atManager.requestPermissionsFromUser(context, ['ohos.permission.ACCESS_BLUETOOTH']);
    return grantStatus.authResults;
  }

  /**
   * 申请权限
   * @returns
   */
  static async requestPermission() {
    let grantStatus = await PermissionsUtil.reqPermissionsFromUser()
    for (let i = 0; i < grantStatus.length; i++) {
      if (grantStatus[i] === 0) {
        // 用户授权,可以继续访问目标操作
        return true;
      }
    }
    return false;
  }
}

更多关于HarmonyOS鸿蒙Next应用如何实现引导用户跳转当前APP设置详情页开启权限?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next应用中,可通过abilityAccessCtrl模块的requestPermissionsFromUser方法请求权限。若用户拒绝,可使用startAbility调用ohos.settings.systemSettingsAbility,通过want参数指定action"action.settings.app.info"并设置parameters: {"appName": "应用名称", "bundleName": "包名"},引导用户跳转至当前应用的设置详情页手动开启权限。

在HarmonyOS Next中,可以通过abilityAccessCtrl模块的openApplicationSettings接口,直接引导用户跳转到当前应用的设置详情页,以便手动开启权限。这是一种标准的、体验友好的做法。

核心步骤如下:

  1. 判断权限状态:在尝试申请权限前或申请被拒绝后,使用abilityAccessCtrl.atManager.verifyAccessToken()检查目标权限的当前状态。如果状态是abilityAccessCtrl.GrantStatus.PERMISSION_DENIED,并且是首次拒绝后的状态(系统不会再弹出授权框),则触发引导流程。

  2. 创建并展示引导弹窗:向用户展示一个友好的提示弹窗,说明需要某个权限(如相机、位置等)才能使用特定功能,并提供“去设置”和“取消”两个操作按钮。

  3. 调用跳转接口:当用户点击“去设置”按钮时,调用abilityAccessCtrl.atManager.openApplicationSettings()方法。该方法会直接打开系统设置中当前应用的权限管理详情页面,用户可在此页面手动开启或关闭权限。

关键代码示例

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';
import promptAction from '@ohos.promptAction';

// 假设需要申请相机权限
const PERMISSION_CAMERA = 'ohos.permission.CAMERA';

async function checkAndRequestPermission(context: common.Context) {
  let atManager = abilityAccessCtrl.createAtManager();
  
  // 1. 检查权限状态
  let grantStatus = atManager.verifyAccessTokenSync(globalThis.abilityContext.applicationInfo.accessTokenId, PERMISSION_CAMERA);
  
  if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
    // 2. 权限被拒绝,展示引导弹窗
    promptAction.showDialog({
      title: '需要相机权限',
      message: '该功能需要使用相机,请到应用设置中开启权限。',
      buttons: [
        { text: '取消', color: '#666666' },
        { text: '去设置', color: '#007DFF' }
      ]
    }).then((result) => {
      if (result.index === 1) { // 用户点击了“去设置”
        // 3. 跳转到当前应用设置页
        atManager.openApplicationSettings();
      }
    }).catch((err) => {
      console.error(`showDialog error: ${JSON.stringify(err)}`);
    });
    return;
  }
  
  // 如果未授权,且非永久拒绝状态,可在此调用requestPermissionsFromUser申请权限
  // ...
}

// 在Ability或UI页面中调用
// checkAndRequestPermission(getContext(this));

注意事项

  • openApplicationSettings()方法无需参数,默认操作当前应用。
  • 跳转到系统设置页面属于异步操作,调用后控制权会交给系统。
  • 用户从设置页返回应用后,通常需要重新检查权限状态并更新UI。
  • 对于PERMISSION_USER_GRANTED类型的权限(如相机、麦克风、位置等),此流程是标准做法。对于PERMISSION_SYSTEM_GRANTED类型的权限,通常无法由用户在设置页手动开启。

此方案将用户操作路径从“理解提示->退出应用->找到系统设置->找到应用管理->找到对应应用->进入权限设置”简化为“点击弹窗按钮->直接进入权限设置页”,极大提升了体验。

回到顶部