关于作者
白晓明
宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人
华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL
华为开发者学堂/51CTO学堂/CSDN学堂认证讲师
开放原子开源基金会2023开源贡献之星
OpenHarmony三方库贡献者
公众号:开源开发者新视界(openwatcher)
数字化飞速发展的今天,我们所拥有的智能设备中各种各样的应用程序,其中的位置服务功能正悄然改变着我们的生活方式。比如外卖订餐App可根据我们所在位置推荐周边商家和外卖小哥,短视频App可根据我们所在位置推荐周边用户发布的视频。再比如导航类App精准地确定我们的位置,并为我们规划出最佳的出现路线,无论是日常通勤还是陌生城市的探索,都能让我们轻松找到目的地,避免迷路的困扰。当然在紧急情况下,位置服务还可以为救援人员提供准确的位置信息,缩短救援时间。
HarmonyOS位置服务(Location Kit)使用以下多种定位技术提供服务,为用户提供准确地位置信息。
- 坐标:HarmonyOS以1984年世界大地坐标系统为参考,使用经度、纬度数据描述地球上的一个位置。
- GNSS定位:基于全球导航卫星系统,包括GPS、GLONASS、北斗、Galileo等,通过导航卫星、设备芯片提供的定位算法,来确定设备准确的位置。定位过程具体使用哪些定位系统,取决于用户设备的硬件能力。
- 基站定位:根据设备当前驻网基站和相邻基站的位置,估算设备当前位置。此定位方式的定位结果精度较低,并且需要设备可以访问蜂窝网络。
- WLAN/蓝牙定位:根据设备可搜索到的周围WLAN、蓝牙设备位置,估算设备当前位置。此定位方式的定位结果精度依赖于设备周围可见的固定WLAN、蓝牙设备的分布,密度较高时,精度也相较于基站定位方式更高,同时也需要设备可以访问网络。
HarmonyOS位置服务(Location Kit)除了提供基础的定位服务之外,还提供了地理围栏、地理编码、逆地理编码、国家码等功能和接口。
应用程序的位置服务,如同一把双刃剑,既为我们的生活带来了前所未有的便利和精彩,也需要我们在享受其好处的同时,注重个人隐私的保护。在 HarmonyOS 中,当应用程序处于业务场景且需要位置服务(Location Kit)时,系统进行了严格的约束与限制。这一举措旨在保护用户的隐私安全,确保位置信息不被滥用。使用设备位置能力时,需要用户进行确认并主动开启位置开关。若位置开关未开启,系统不会向任何应用提供定位服务。由于设备位置属于用户敏感数据,所以即使用户已经开启位置开关,应用在获取设备位置前仍需要向用户申请位置访问权限。在用户确认允许后,系统才会向应用提供定位服务,如下图所示。
在module.json5
配置文件中声明位置权限
应用程序要想使用位置信息,需要检查是否已经获取用户授权访问设备位置信息,若未获得授权,可以向用户申请需要的位置权限。系统提供的定位权限有:
权限名称 | 权限级别 | 授权方式 | 说明 |
| normal | user_grant | 允许应用获取设备位置信息。 需要与模糊位置权限一起申请。 |
| normal | user_grant | 允许应用获取设备模糊位置信息。 |
| normal | user_grant | 允许应用在后台运行时获取设备位置信息。 由于安全隐私要求,应用不能通过弹窗的形式被授予后台位置权限,应用如果需要使用后台位置权限,需要引导用户到设置界面手动授予。 |
加入App运行在前台,且访问设备当前的精准位置信息,需要在module.json5
中申请如下权限,并向用户申请授权,具体可参考 HarmonyOS应用程序访问控制探究。
导入geoLocationManager
模块
geoLocationManager
模块提供GNSS定位、网络定位(蜂窝基站、WLAN、蓝牙定位技术)、地理编码、逆地理编码、国家码和地理围栏等基本功能API。
获取当前设备位置
单次获取当前设备位置
多用于查看当前位置、签到打卡、服务推荐等场景。需要实例化SingleLocationRequest
对象,用于告知系统该向应用提供何种类型的位置服务,以及单次定位超时时间。
如果对位置的返回精度要求较高,建议LocatingPriority
参数优先选择PRIORITY_ACCURACY
,会将一段时间内精度较好的结果返回给应用。
如果对定位速度要求较高,建议LocatingPriority
参数优先选择PRIORITY_LOCATING_SPEED
,会将最先拿到的定位结果返回给应用。
以快速定位策略(PRIORITY_LOCATING_SPEED
)为例,调用方式如下:
以上是通过实例化SingleLocationRequest
对象来获取当前位置信息,还可以实例化当前位置信息请求参数CurrentLocationRequest
来获取当前位置信息,可以根据业务选择使用合适的实例化对象。
以快速获取位置(FIRST_FIX
)策略为例,调用代码如下:
持续定位
多用于导航、运动轨迹、出行等场景。需要实例化ContinuousLocationRequest
对象,用于告知系统该向应用提供何种类型的位置服务,以及位置结果上报的频率。
以地图导航场景为例,调用方式如下:
当然,最后还需要主动结束定位,不然会导致设备功耗高,耗电快,发热等问题。
总结
位置服务(Location Kit)是应用程序常见的能力之一,如天气预报App中可以使用位置服务查看所在城市的天气、健康运动类App中可以使用位置服务记录运动轨迹等。当开发者在一个你哟功能程序中使用位置服务时,需要按照约束与限制,确保用户敏感数据的安全。