HarmonyOS鸿蒙Next中动态申请后台位置权限失败该如何处理

HarmonyOS鸿蒙Next中动态申请后台位置权限失败该如何处理

【问题现象】

按如下截图方式申请后台位置权限时,未弹出授权窗口,导致无法获取位置信息。

点击放大

【背景知识】

系统提供的定位权限有:

  • ohos.permission.LOCATION:用于获取精准位置,精准度在米级别。
  • ohos.permission.APPROXIMATELY_LOCATION:用于获取模糊位置,精确度为5公里。
  • ohos.permission.LOCATION_IN_BACKGROUND:用于后台获取位置,应用切换到后台仍然需要获取定位信息的场景。

由于安全隐私要求,应用不能通过弹窗的形式被授予后台位置权限,应用如果需要使用后台位置权限,需要引导用户到设置界面手动授予。

【解决方案】

(1)当APP运行在前台,且需要访问设备位置信息时,需要向用户获取位置授权。

代码示例如下:

const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
const permissions: Array<Permissions> = [
  'ohos.permission.LOCATION',
  'ohos.permission.APPROXIMATELY_LOCATION',
];

const atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
atManager.requestPermissionsFromUser(context, permissions).then((data) => {
  let grantStatus: Array<number> = data.authResults;
  let length: number = grantStatus.length;
  for (let i = 0; i < length; i++) {
    if (grantStatus[i] === 0) {
      // 用户授权,可以继续访问目标操作
    } else {
      // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
      return;
    }
  }
  // 授权成功
}).catch((err: BusinessError) => {
  console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
});

点击放大

(2)当用户点击弹窗授予前台位置权限后,如果APP运行到后台时也需要获取用户的位置信息,应用可以通过弹窗、提示窗等形式告知用户前往设置界面授予后台位置权限,在设置界面中将位置信息访问权限设置为始终允许,点击确认按钮,调用openPermissionsInSystemSettings()方法跳转到应用设置界面。

点击放大

点击放大

点击放大

代码示例如下:

dialogControllerConfirm: CustomDialogController = new CustomDialogController({
  builder: AlertDialog({
    primaryTitle: '温馨提示',
    content: '为了保证正常导航,需要将位置信息访问权限设置为【始终允许】',
    primaryButton: {
      value: '取消',
      action: () => {
          ...
      },
    },
    secondaryButton: {
      value: '确认',
      role: ButtonRole.ERROR,
      action: () => {
          openPermissionsInSystemSettings();
      }
    },
  }),
})

function openPermissionsInSystemSettings(context: common.UIAbilityContext): void {
  let wantInfo: Want = {
    bundleName: "com.huawei.hmos.settings",
    abilityName: "com.huawei.hmos.settings.MainAbility",
    uri: 'application_info_entry',
    parameters: {
      settingsParamBundleName: 'com.example.api11' // 打开指定应用的详情页面
    }
  }
  context.startAbility(wantInfo).then(() => {
    // ...
  }).catch((err: BusinessError) => {
    // ...
  })
}

注:在entry模块的module.json5,需要将后台位置权限配置进去,位置信息访问权限设置界面才会看到始终允许的选项。

点击放大

【总结】

申请后台位置权限,除了要配置ohos.permission.LOCATION_IN_BACKGROUND权限到entry模块的module.json5文件中,还需要引导用户去应用设置界面设置位置权限为始终允许才能生效。


更多关于HarmonyOS鸿蒙Next中动态申请后台位置权限失败该如何处理的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中动态申请后台位置权限失败该如何处理的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,动态申请后台位置权限失败时

首先确保在config.json文件中正确配置了ohos.permission.LOCATION_IN_BACKGROUND权限。然后,在代码中使用requestPermissionsFromUser方法请求权限,并检查返回的授权结果。如果授权失败,可以通过canRequestPermission方法判断是否可以向用户再次请求权限。若系统限制再次请求,需引导用户手动在设置中开启权限。确保应用在前台时已获取ohos.permission.LOCATION权限,因为后台位置权限依赖于前台权限。

回到顶部