获取位置信息的一般指导和常见问题解决方案
====================

#### 问题现象

获取设备位置信息，主要有如下几类问题。

1.  获取当前位置信息，如定位等场景。
2.  持续获取位置信息，如导航等场景，包括后台和前台两种情况。

#### 背景知识

获取位置信息需要得到相关权限，可以先学习[应用权限管控概述](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-permission-mgmt-overview)。具体实现主要使用Location Kit提供的能力，请阅读[Location Kit简介](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/location-kit-intro)。

#### 解决方案

1.  打开设备定位开关。需要用户手动打开位置开关，开发者可以通过[isLocationEnabled](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-geolocationmanager#geolocationmanagerislocationenabled)接口判断位置服务是否开启，然后引导用户手动开启。
2.  [声明并获取相关位置权限](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/location-permission-guidelines)。主要涉及三种权限：
    
    *   ohos.permission.LOCATION用于获取精准位置。
    *   ohos.permission.APPROXIMATELY\_LOCATION用于获取模糊位置。
    *   ohos.permission.LOCATION\_IN\_BACKGROUND用于后台定位的场景。
    
    开发者根据需要在module.json5文件中配置进行声明，并获取用户明确授权方可使用，获取授权有两种方式：（1）通过[requestPermissionsFromUser接口](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-abilityaccessctrl#requestpermissionsfromuser9)向用户弹窗以获得授权。（2）跳转到应用权限设置页面，打开开关进行授权，参考如下示例代码。
    
    import { common } from '@kit.AbilityKit';
    
    @Entry
    @Component
    struct Index{
      uiContext = this.getUIContext();
      build() {
        Column(){
          Button('跳转应用权限设置页面1')
            .onClick(() =>{
              let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;
              if(context){
                context.startAbility({
                  bundleName: 'com.huawei.hmos.settings',
                  abilityName: 'com.huawei.hmos.settings.MainAbility',
                  uri:'application\_info\_entry',
                  parameters: {
                    pushParams: 'zouzou.Location\_Kit.location\_demo'  _//当前包名设置为这个包名_
                  }
                });
              }
            })
        }
        .width('100%')
        .alignItems(HorizontalAlign.Center)
      }
    }
    

3.  获取当前位置有如下两种方式，参考[获取设备的位置信息开发指导](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/location-guidelines)：
    *   [getLastLocation](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-geolocationmanager#geolocationmanagergetlastlocation)获取系统缓存的最新位置，可减少系统功耗，推荐使用。
    *   [getCurrentLocation](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-geolocationmanager#geolocationmanagergetcurrentlocation)获取当前位置。
4.  持续获取最新的位置，前台和后台需要做不同的调整。
    *   前台持续获取位置信息。直接调用[geoLocationManager.on('locationChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-geolocationmanager#geolocationmanageronlocationchange)周期性持续监听最新的位置。参考[获取设备的位置信息开发指导](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/location-guidelines)。
    *   后台持续获取位置信息。需搭配长时任务使用，选择申请长时任务类型为LOCATION。参考[长时任务开发指南](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/continuous-task)。

#### 常见FAQ

Q：定位失败，报错3301200。

A：若有报错码3301200请参考官方文档[3301200报错码](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/errorcode-geolocationmanager#section3301200-定位失败未获取到定位结果)。

Q：定位失败，报错3301100。

A：若有报错码3301100打开设备的位置服务开关即可。参考官方文档[3301100报错码](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/errorcode-geolocationmanager#section3301100-位置功能的开关未开启导致功能失败)。

Q：内网环境定位失败。

A：内网环境中因为有防火墙等网络管控存在，可能会把位置请求拦截。内网环境建议开发者：

*   改用公网发起请求。
*   确保内网环境中以下域名及端口可正常访问。

_// 位置服务涉及的域名及端口_
https://geo-drcn.platform.dbankcloud.cn
https://logservice1.hicloud.com
https://openlocation-drcn.platform.dbankcloud.com
https://map-drcn.platform.dbankcloud.com
https://metrics1-drcn.dt.dbankcloud.cn
https://h5hosting.dbankcdn.com/cch5/
https://tsms-drcn.security.dbankcloud.cn
https://idmapping-drcn.security.dbankcloud.cn
https://grs.dbankcloud.com
https://grs.dbankcloud.cn
https://dnkeeper.platform.dbankcloud.cn

端口号都是默认的 443。

Q：无网环境能定位吗？

A：可以。[位置请求参数](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-geolocationmanager#currentlocationrequest)中的priority文档中有详细的介绍，定位不仅仅只有网络定位技术，还有GNSS等定位技术，开发者根据需要进行配置。

Q：位置信息中海拔高度不准确？

A：调整LocationRequestPriority优先级。调整为ACCURACY，任何时候都能获取海拔高度；调整为FIRST\_FIX，在室外环境能够获取海拔信息；LOW\_POWER无法获取海拔信息，参考[位置请求中位置信息优先级类型](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-geolocationmanager#locationrequestpriority)。

Q：web页面如何获取位置信息？

A：通过web组件设置onGeolocationShow事件，参考demo[通知用户收到地理位置信息获取请求](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-basic-components-web-events#ongeolocationshow)。

Q：如何判断当前设备是否已授权定位服务？

A：通过checkAccessToken接口，参考[校验应用是否授予权限](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-abilityaccessctrl#checkaccesstoken9)。

Q：确认应用已授权，使用checkAccessToken接口返回结果也是已授权，但实际使用时仍然获取位置失败，可能的原因是什么？

A：检查设备位置服务是否开启。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/6d/v3/_MBw4HSjTw2C2lG4M1WRrw/zh-cn_image_0000002658913757.png?HW-CC-KV=V1&HW-CC-Date=20260709T134321Z&HW-CC-Expire=86400&HW-CC-Sign=E9AB9BD61213BC06CA229BF5F7F262ADD6FB817DB8F950718DA3625AC1153437 "点击放大") ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/50/v3/3CbV3MmrRHuFaVm0xtH7tw/zh-cn_image_0000002658793811.png?HW-CC-KV=V1&HW-CC-Date=20260709T134321Z&HW-CC-Expire=86400&HW-CC-Sign=84DE0B9B372FC36872439113D78F2F762239DE5FF82BB7D372562B1224973FB6 "点击放大")

Q：如何判断位置服务是否处于关闭状态？

A：通过调用位置服务相关API的返回码确认关闭状态，调用[获取当前位置信息](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-geolocationmanager#geolocationmanagergetcurrentlocation)API，如果返回码等于3301100，表示位置服务开关处于关闭状态。

Q：geoLocationManager.getCurrentLocation获取当前定位地址加载过于慢。

A：获取定位的时长通常受到多种因素的影响，包括设备的硬件能力、软件配置、网络状态等。存在以下几种原因及解决方案：

*   设备和系统版本：目前使用的设备版本是较早版本，建议升级到最新版本的IDE、SDK和手机ROM。
*   网络和GNSS信号：如果设备处于信号弱的环境，一定程度上会导致定位时间增加。尝试移动到开阔地带或检查网络连接（如有必要，开启WiFi或确保SIM卡已正确插入）。
*   定位请求参数：检查设置的maxAccuracy字段，确保其符合实际需求。较高的精度要求虽然可以提高定位的准确性，但同时也会增加定位所需的时间。
*   系统时间设置：请确保设备的系统时间设置正确，系统时间设置错误，会导致获取位置失败，建议在手机设置的“日期和时间”页面勾选自动设置，确保时间正确。

Q：为什么getCurrentLocation获取当前位置耗时时间长？

A：如果[CurrentLocationRequest](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-geolocationmanager#currentlocationrequest)或[SingleLocationRequest](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-geolocationmanager#singlelocationrequest12)中的位置信息优先级策略为精度优先，并且配置超时时间比较长，会优先使用GNSS定位，在没有GPS信号时，可能会等待设置的超时时间后，才返回网络定位信息。需要根据业务需要，合理设置位置信息优先级策略和超时时间。