HarmonyOS鸿蒙NEXT中动态授权失败后如何引导用户跳转权限设置页

HarmonyOS鸿蒙NEXT中动态授权失败后如何引导用户跳转权限设置页 HarmonyOS NEXT中动态授权失败后如何引导用户跳转权限设置页并拉取跳转到系统设置页

4 回复

这是我以前上课讲的代码,你参考下:

Button('获取经纬度')
  .onClick(async () => {
    try {
      // 获取当前位置(需用户授权后才能被调用)
      const res = await geoLocationManager.getCurrentLocation()
    } catch (err) {
      // 捕获错误:
      //  {"code": 201 }      用户未授权或拒绝授权
      //  {"code": "3301100" }  位置功能的开关未开启,模拟器下拉控制中心,打开定位开关
      //  {"code": 3301200 }  定位失败,未获取到定位结果
      console.log('itheima666', JSON.stringify(err))
      // switch 处理错误情况,code 数据类型有坑
      switch (Number((err as BusinessError).code)) {
        case 201: {
          // promptAction.showToast({ message: '用户未授权或拒绝授权' })
          // 打开授权设置(二次申请授权)
          //   request      申请
          //   Permissions  权限
          //   On           打开
          //   Setting      设置
          const manager = abilityAccessCtrl.createAtManager()
          // 首次授权(首次申请会有弹窗并返回授权结果,二次申请无弹窗只返回授权结果)
          const res = await manager.requestPermissionsFromUser(getContext(), [
            'ohos.permission.APPROXIMATELY_LOCATION',
            'ohos.permission.LOCATION'
          ])
          console.log('itheima666', JSON.stringify(res, null, 2))
          // promptAction.showToast({ message: JSON.stringify(res, null, 2) })
          // dialogShownResults true 首次弹窗,false 非首次弹窗,非首次弹窗需打开设置页
          if (res.dialogShownResults?.includes(false) && res.authResults.includes(-1)) {
            // 二次授权
            manager.requestPermissionOnSetting(getContext(), [
              'ohos.permission.APPROXIMATELY_LOCATION',
              'ohos.permission.LOCATION'
            ])
          }
          break
        }
        case 3301100: {
          promptAction.showToast({ message: '请在下拉控制中心,开启位置开关' })
          break
        }
        default: {
          promptAction.showToast({ message: '定位失败,已上报错误编码到服务端' })
          break
        }
      }
    }
  })

更多关于HarmonyOS鸿蒙NEXT中动态授权失败后如何引导用户跳转权限设置页的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


二次向用户申请授权即可:

调用这个 requestPermissionOnSetting() 就可以。

跟首次授权用法差不多:

requestPermissionsFromUser()

在HarmonyOS NEXT中,如果动态授权失败,可以通过以下步骤引导用户跳转到权限设置页面:

  1. 检查权限状态:首先使用abilityAccessCtrl模块中的requestPermissionsFromUser方法请求权限。如果权限请求被拒绝,可以检测到权限状态为PERMISSION_DENIED

  2. 提示用户:通过promptAction模块的showToast方法,向用户显示提示信息,告知用户需要开启相应权限。

  3. 跳转权限设置页面:使用appManager模块中的openAppSetting方法,直接跳转到应用的权限设置页面。该方法会打开系统设置中的应用权限管理界面,用户可以在该界面中手动开启所需权限。

示例代码如下:

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
import promptAction from '@ohos.promptAction';
import appManager from '@ohos.appManager';

// 请求权限
let permissions: Array<string> = ['ohos.permission.CAMERA'];
abilityAccessCtrl.requestPermissionsFromUser(permissions).then((data) => {
  if (data.authResults[0] === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
    // 提示用户
    promptAction.showToast({
      message: '需要开启相机权限',
      duration: 2000
    });

    // 跳转权限设置页面
    appManager.openAppSetting({
      bundleName: 'com.example.myapp'
    });
  }
});

通过以上步骤,可以在动态授权失败后引导用户跳转到权限设置页面,手动开启所需权限。

在HarmonyOS鸿蒙NEXT中,若动态授权失败,可通过ohos.abilityAccessCtrl模块的requestPermissionsFromUser方法请求权限。若用户拒绝授权,可使用ohos.app.ContextstartAbility方法,通过隐式意图跳转到系统设置页面。示例如下:

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
import featureAbility from '@ohos.ability.featureAbility';

async function requestPermission() {
  const permissions = ['ohos.permission.CAMERA'];
  const atManager = abilityAccessCtrl.createAtManager();
  try {
    await atManager.requestPermissionsFromUser(globalThis.abilityContext, permissions);
  } catch (err) {
    const want = {
      action: 'action.settings.app.info',
      parameters: { packageName: globalThis.abilityContext.abilityInfo.bundleName }
    };
    featureAbility.startAbility({ want });
  }
}

此代码首先请求权限,若失败则跳转到应用的权限设置页面。

回到顶部