HarmonyOS鸿蒙Next中配置了定位权限但是没有生效,在本地测试可以定位但上线的版本不行

HarmonyOS鸿蒙Next中配置了定位权限但是没有生效,在本地测试可以定位但上线的版本不行

cke_929.png


更多关于HarmonyOS鸿蒙Next中配置了定位权限但是没有生效,在本地测试可以定位但上线的版本不行的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

楼主没有申请ohos.permission.LOCATION和ohos.permission.APPROXIMATELY_LOCATION权限,或者缺少了后台定位权限ohos.permission.LOCATION_IN_BACKGROUND,同时上线版本在运行时要动态请求权限

module.json5权限声明

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.LOCATION",
        "reason": "需要获取精确位置以提供服务"
      },
      {
        "name": "ohos.permission.APPROXIMATELY_LOCATION",
        "reason": "需要获取模糊位置以提供服务"
      },
      // 后台定位需添加
      {
        "name": "ohos.permission.LOCATION_IN_BACKGROUND",
        "reason": "后台持续获取位置"
      }
    ]
  }
}

动态权限申请

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

async function requestLocationPermissions() {
  const permissions: Permissions = [
    'ohos.permission.LOCATION', 
    'ohos.permission.APPROXIMATELY_LOCATION'
  ];
  
  const atManager = abilityAccessCtrl.createAtManager();
  const result = await atManager.requestPermissionsFromUser(
    getContext() as common.UIAbilityContext, 
    permissions
  );
  if (result.authResults.some(status => status !== 0)) {
    // 引导用户前往设置页开启权限
    promptAction.showToast({ message: '请前往设置开启定位权限' });
  }
}

更多关于HarmonyOS鸿蒙Next中配置了定位权限但是没有生效,在本地测试可以定位但上线的版本不行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


根据描述应用启动后未出现权限申请弹窗的提示,app未获得位置权限,可能是权限申请的代码逻辑存在问题。已发示例,可以参考。权限验证和申请可以放在EntryAbility.ets,在应用启动时申请权限

import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';

//应用启动时验证权限及首次申请权限
function requestPermission(context: common.UIAbilityContext,
  permissionResult: (allow: boolean) => void): void {
  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
  let permissions: Array<Permissions> = ['ohos.permission.APPROXIMATELY_LOCATION','ohos.permission.LOCATION'];
  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) {
        // 用户授权,可以继续访问目标操作
        permissionResult(true);
      } else {
        // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
        promptAction.showDialog({
          title: '温馨提示',
          message: '用户必须授权才能访问当前页面的功能',
          alignment: DialogAlignment.Center,
          buttons: [
            { text: '取消', color: '#666666' },
            { text: '确认', color: '#666666' }
          ]
        }).then((res) => {
          if (res.index === 1) {
            //点击确认调用二次申请方法
            requestNextPermission(context, () => {
            })
          }
        })
        permissionResult(false);
        return;
      }
    }
    // 授权成功
  }).catch((err: BusinessError) => {
    permissionResult(false);
    console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
  })
}

//二次申请权限
function requestNextPermission(context: common.UIAbilityContext,
  permissionResult: (allow: boolean) => void): void {
  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
  let permissions: Array<Permissions> = ['ohos.permission.APPROXIMATELY_LOCATION','ohos.permission.LOCATION'];
  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) {
        // 用户授权,可以继续访问目标操作
        AlertDialog.show({message:'您已授权'})
      } else {
        // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
        permissionResult(false);
        atManager.requestPermissionOnSetting(context, ['ohos.permission.APPROXIMATELY_LOCATION','ohos.permission.LOCATION'])
          .then((data: Array<abilityAccessCtrl.GrantStatus>) => {
            console.info('data:' + data.toString());
          })
          .catch((err: BusinessError) => {
            console.error('data:' + err.message);
          });
        return;
      }
    }
    // 授权成功
  }).catch((err: BusinessError) => {
    permissionResult(false);
    console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
  })
}


@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

aboutToAppear(): void {
  requestPermission(getContext(this) as common.UIAbilityContext, () => {
  });
}

  build() {
    Row() {
      Column() {
        Button('二次授权').onClick(() => {
          console.info('二次授权')
          requestNextPermission(getContext(this) as common.UIAbilityContext, () => {
          });
        })
      }
      .height('100%')
      .width('100%')
      .justifyContent(FlexAlign.Center)
    }
  }
}

感谢楼主的分享,内容很有价值!希望以后还能看到更多这样的好帖!

示例代码我跑了一下是可以正常授权的,问一下,你线上版本之前能正常定位不,是不是应用升级了定位权限失效的。

那个context应该已经改了,你看下官网,都是this.getUIContext().getHostContext() 的方式获取context。

这个里面有完整代码:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/request-user-authorization#

鸿蒙Next中定位权限未生效可能因应用未正确配置位置服务权限或未适配新权限模型。请检查应用是否在module.json5中声明ohos.permission.LOCATION权限,并确认权限级别(如whenInUse或always)。上线版本需确保已通过AGC正确配置权限,并检查设备定位服务是否开启。

定位权限在本地测试正常但上线版本失效,通常与签名配置或权限声明方式有关。请按以下步骤排查:

  1. 检查应用签名:确保上线版本与调试版本使用相同的签名证书,权限配置与签名绑定。
  2. 验证权限声明:在module.json5中确认已正确声明ohos.permission.LOCATION权限,并区分whenInUse(前台)或always(前后台)场景。
  3. 查看权限申请逻辑:上线版本可能因权限弹窗未触发或用户拒绝导致,需确保在定位前动态申请权限(使用abilityAccessCtrl相关API)。
  4. 检查云测环境:部分真机或云测环境可能限制定位模拟,需确认测试设备是否支持实际定位服务。
  5. 日志分析:通过DevEco Studio的日志工具查看上线版本的错误码,定位具体失败原因(如权限未授权或服务未响应)。

建议优先对比调试与上线版本的签名及权限配置差异。

回到顶部