DEV Community

Freerain
Freerain

Posted on

鸿蒙 Next 下的定位开发

在鸿蒙 Next 系统中,开发获取设备位置信息的功能对于许多应用来说至关重要。以下将详细介绍在鸿蒙 Next 下进行定位开发的相关内容。

一、场景概述

开发者可利用 HarmonyOS 位置相关接口实现多种功能。对于位置敏感业务,如导航应用,获取实时位置能为用户提供准确的路线指引;而在某些场景下,若无需实时位置且想节省电量,获取最近历史位置则是不错的选择,例如一些基于位置的信息推送服务,只需大概了解用户常活动区域即可。
二、接口说明

开启与关闭位置变化订阅

on(type: 'locationChange', request: LocationRequest | ContinuousLocationRequest, callback: Callback<Location>): void开启位置变化订阅并发起定位请求
off(type: 'locationChange', callback?: Callback<Location>): void关闭位置变化订阅及删除对应定位请求
Enter fullscreen mode Exit fullscreen mode

获取当前位置

getCurrentLocation(request: CurrentLocationRequest | SingleLocationRequest, callback: AsyncCallback<Location>): void通过 callback 回调异步返回结果获取当前位置
getCurrentLocation(request?: CurrentLocationRequest | SingleLocationRequest): Promise<Location>使用 Promise 方式异步获取当前位置
Enter fullscreen mode Exit fullscreen mode

获取最近一次定位结果

getLastLocation(): Location:可直接获取最近一次定位结果,若系统无缓存位置则返回错误码,此接口能减少系统功耗,对于位置新鲜度要求不高的场景可优先使用,必要时可结合时间戳判断是否需重新获取实时位置。

三、开发步骤

权限申请

获取设备位置信息需申请位置权限,具体申请方法和步骤参考申请位置权限开发指导。

模块导入

导入geoLocationManager模块,如import { geoLocationManager } from '@kit.LocationKit';,该模块提供所有基础定位相关功能 API。

单次获取当前设备位置

  • 方式一:获取系统缓存最新位置 优先尝试此方式获取位置,如let location = geoLocationManager.getLastLocation();,若系统无缓存位置会返回错误码。
  • 方式二:获取当前位置 实例化SingleLocationRequest对象,设置LocatingPriority和locatingTimeoutMs参数。 LocatingPriority:高精度需求选PRIORITY_ACCURACY,高定位速度需求选PRIORITY_LOCATING_SPEED,两种策略均使用 GNSS 和网络定位技术,消耗较大。 locatingTimeoutMs:建议设置为 10 秒,如
let request: geoLocationManager.SingleLocationRequest = {'locatingPriority': geoLocationManager.LocatingPriority.PRIORITY_LOCATING_SPEED, 'locatingTimeoutMs': 10000}
Enter fullscreen mode Exit fullscreen mode

调用getCurrentLocation获取位置,如

geoLocationManager.getCurrentLocation(request).then((result) => { console.log('current location: ' + JSON.stringify(result)); }).catch((error:BusinessError) => { console.error('promise, getCurrentLocation: error=' + JSON.stringify(error)); });。
Enter fullscreen mode Exit fullscreen mode

持续定位

实例化ContinuousLocationRequest对象,设置locationScenario和interval参数。
locationScenario:根据应用场景设置,如地图导航用NAVIGATION参数。
interval:位置结果上报时间间隔,单位秒,默认 1 秒。
定义回调函数接收位置信息,如

let locationCallback = (location:geoLocationManager.Location):void => { console.log('locationCallback: data: ' + JSON.stringify(location)); };然后开启定位geoLocationManager.on('locationChange', request, locationCallback);
Enter fullscreen mode Exit fullscreen mode

注意及时结束定位以避免高功耗,使用geoLocationManager.off('locationChange', locationCallback);。
通过以上步骤,开发者能够在鸿蒙 Next 系统中有效地实现定位功能开发,为应用提供精准的位置服务,同时兼顾性能和功耗优化。

Top comments (0)