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

#### 问题现象

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

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

#### 背景知识

获取位置信息需要得到相关权限，可以先学习应用权限管控概述。具体实现主要使用Location Kit提供的能力，请阅读Location Kit简介。

#### 解决方案

1.  打开设备定位开关。需要用户手动打开位置开关，开发者可以通过isLocationEnabled接口判断位置服务是否开启，然后引导用户手动开启。
2.  声明并获取相关位置权限。主要涉及三种权限：
    
    *   ohos.permission.LOCATION用于获取精准位置。
    *   ohos.permission.APPROXIMATELY\_LOCATION用于获取模糊位置。
    *   ohos.permission.LOCATION\_IN\_BACKGROUND用于后台定位的场景。
    
    开发者根据需要在module.json5文件中配置进行声明，并获取用户明确授权方可使用，获取授权有两种方式：（1）通过requestPermissionsFromUser接口向用户弹窗以获得授权。（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.  获取当前位置有如下两种方式，参考获取设备的位置信息开发指导：
    *   getLastLocation获取系统缓存的最新位置，可减少系统功耗，推荐使用。
    *   getCurrentLocation获取当前位置。
4.  持续获取最新的位置，前台和后台需要做不同的调整。
    *   前台持续获取位置信息。直接调用geoLocationManager.on('locationChange')周期性持续监听最新的位置。参考获取设备的位置信息开发指导。
    *   后台持续获取位置信息。需搭配长时任务使用，选择申请长时任务类型为LOCATION。参考长时任务开发指南。

#### 常见FAQ

Q：定位失败，报错3301200。

A：若有报错码3301200请参考官方文档3301200报错码。

Q：定位失败，报错3301100。

A：若有报错码3301100打开设备的位置服务开关即可。参考官方文档3301100报错码。

Q：内网环境定位失败。

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

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

```
// 位置服务涉及的域名及端口

端口号都是默认的 443。
```

Q：无网环境能定位吗？

A：可以。位置请求参数中的priority文档中有详细的介绍，定位不仅仅只有网络定位技术，还有GNSS等定位技术，开发者根据需要进行配置。

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

A：调整LocationRequestPriority优先级。调整为ACCURACY，任何时候都能获取海拔高度；调整为FIRST\_FIX，在室外环境能够获取海拔信息；LOW\_POWER无法获取海拔信息，参考位置请求中位置信息优先级类型。

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

A：通过web组件设置onGeolocationShow事件，参考demo通知用户收到地理位置信息获取请求。

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

A：通过checkAccessToken接口，参考校验应用是否授予权限。

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

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

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

A：通过调用位置服务相关API的返回码确认关闭状态，调用获取当前位置信息API，如果返回码等于3301100，表示位置服务开关处于关闭状态。

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

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

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

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

A：如果CurrentLocationRequest或SingleLocationRequest中的位置信息优先级策略为精度优先，并且配置超时时间比较长，会优先使用GNSS定位，在没有GPS信号时，可能会等待设置的超时时间后，才返回网络定位信息。需要根据业务需要，合理设置位置信息优先级策略和超时时间。