一、简介

① 设备位置
  • 移动终端设备已经深入人们日常生活的方方面面,如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录等,这些习以为常的活动,都离不开定位用户终端设备的位置。
  • 当用户处于这些丰富的使用场景中时,系统的位置能力可以提供实时准确的位置数据。对于开发者,设计基于位置体验的服务,也可以使应用的使用体验更贴近每个用户。
  • 当应用在实现基于设备位置的功能时,如:驾车导航,记录运动轨迹等,可以调用该模块的 API 接口,完成位置信息的获取。
② 基本概念
  • 位置能力用于确定用户设备在哪里,系统使用位置坐标标示设备的位置,并用多种定位技术提供服务,如 GNSS 定位、基站定位、WLAN/蓝牙定位(基站定位、WLAN/蓝牙定位后续统称“网络定位技术”)。通过这些定位技术,无论用户设备在室内或是户外,都可以准确地确定设备位置。
  • 坐标:系统以 1984 年世界大地坐标系统为参考,使用经度、纬度数据描述地球上的一个位置。
  • GNSS 定位:基于全球导航卫星系统,包含:GPS、GLONASS、北斗、Galileo 等,通过导航卫星、设备芯片提供的定位算法,来确定设备准确位置。定位过程具体使用哪些定位系统,取决于用户设备的硬件能力。
  • 基站定位:根据设备当前驻网基站和相邻基站的位置,估算设备当前位置。此定位方式的定位结果精度相对较低,并且需要设备可以访问蜂窝网络。
  • WLAN、蓝牙定位:根据设备可搜索到的周围 WLAN、蓝牙设备位置,估算设备当前位置。此定位方式的定位结果精度依赖设备周围可见的固定 WLAN、蓝牙设备的分布,密度较高时,精度也相较于基站定位方式更高,同时也需要设备可以访问网络。
③ 应用与限制
  • 位置能力作为系统为应用提供的一种基础服务,需要应用在所使用的业务场景,向系统主动发起请求,并在业务场景结束时,主动结束此请求,在此过程中系统会将实时的定位结果上报给应用。
  • 使用设备的位置能力,需要用户进行确认并主动开启位置开关。如果位置开关没有开启,系统不会向任何应用提供位置服务。
  • 设备位置信息属于用户敏感数据,所以即使用户已经开启位置开关,应用在获取设备位置前仍需向用户申请位置访问权限。在用户确认允许后,系统才会向应用提供位置服务。

二、获取设备的位置信息

① 应用场景
  • 开发者可以调用 HarmonyOS 位置相关接口,获取设备实时位置,或者最近的历史位置。
  • 对于位置敏感的应用业务,建议获取设备实时位置信息。如果不需要设备实时位置信息,并且希望尽可能的节省耗电,开发者可以考虑获取最近的历史位置。
② 常用 API
  • 获取位置信息 API 功能:
接口名 功能描述
Locator(Context context) 创建Locator实例对象
RequestParam(int scenario) 根据定位场景类型创建定位请求的RequestParam对象
onLocationReport(Location location) 获取定位结果
onStatusChanged​(int type) 获取定位过程中的状态信息
onErrorReport​(int type) 获取定位过程中的错误信息
startLocating(RequestParam request, LocatorCallback callback) 向系统发起定位请求
requestOnce(RequestParam request, LocatorCallback callback) 向系统发起单次定位请求
stopLocating(LocatorCallback callback) 结束定位
getCachedLocation() 获取系统缓存的位置信息
③ 使用流程
  • 应用在使用系统能力前,需要检查是否已经获取用户授权访问设备位置信息。如未获得授权,可以向用户申请需要的位置权限。
  • 系统提供的定位权限有:
    • ohos.permission.LOCATION
    • ohos.permission.LOCATION_IN_BACKGROUND
  • 访问设备的位置信息,必须申请 ohos.permission.LOCATION 权限,并且获得用户授权。
  • 如果应用在后台运行时也需要访问设备位置,除需要将应用声明为允许后台运行外,还必须申请 ohos.permission.LOCATION_IN_BACKGROUND 权限,这样应用在切入后台之后,系统可以继续上报位置信息。
  • 开发者可以在应用 config.json 文件中声明所需要的权限,示例代码如下:
 {"module": {"reqPermissions": [{"name": "ohos.permission.LOCATION","reason": "$string:reason_description","usedScene": {"ability": ["com.myapplication.LocationAbility"],"when": "inuse"}, {...}]}}
  • 实例化 Locator 对象,所有与基础定位能力相关的功能 API,都是通过 Locator 提供的(其中入参需要提供当前应用程序的 AbilityInfo 信息,便于系统管理应用的定位请求)。
 Locator locator = new Locator(context);
  • 实例化 RequestParam 对象,用于告知系统该向应用提供何种类型的位置服务,以及位置结果上报的频率。
    • 方式一:为了面向开发者提供贴近其使用场景的 API 使用方式,系统定义了几种常见的位置能力使用场景,并针对使用场景做了适当的优化处理,应用可以直接匹配使用,简化开发复杂度。
    • 系统当前支持场景如下表所示:
场景名称 常量定义 说明
导航场景 SCENE_NAVIGATION 适用于在户外定位设备实时位置的场景,如车载、步行导航。在此场景下,为保证系统提供位置结果精度最优,主要使用GNSS定位技术提供定位服务,结合场景特点,在导航启动之初,用户很可能在室内、车库等遮蔽环境,GNSS技术很难提供位置服务。为解决此问题,我们会在GNSS提供稳定位置结果之前,使用系统网络定位技术,向应用提供位置服务,以在导航初始阶段提升用户体验。此场景默认以最小1秒间隔上报定位结果,使用此场景的应用必须申请
轨迹跟踪场景 SCENE_TRAJECTORY_TRACKING 适用于记录用户位置轨迹的场景,如运动类应用记录轨迹功能。主要使用GNSS定位技术提供定位服务。
此场景默认以最小1秒间隔上报定位结果,并且应用必须申请ohos.permission.LOCATION权限,同时获得用户授权
出行约车场景 SCENE_CAR_HAILING 适用于用户出行打车时定位当前位置的场景,如网约车类应用。
此场景默认以最小1秒间隔上报定位结果,并且应用必须申请ohos.permission.LOCATION权限,同时获得用户授权
生活服务场景 SCENE_DAILY_LIFE_SERVICE 生活服务场景,适用于不需要定位用户精确位置的使用场景,如新闻资讯、网购、点餐类应用,做推荐、推送时定位用户大致位置即可。
此场景默认以最小1秒间隔上报定位结果,并且应用至少申请ohos.permission.LOCATION权限,同时获得用户授权
无功耗场景 SCENE_NO_POWER 无功耗场景,适用于不需要主动启动定位业务。系统在响应其他应用启动定位业务并上报位置结果时,会同时向请求此场景的应用程序上报定位结果,当前的应用程序不产生定位功耗。
此场景默认以最小1秒间隔上报定位结果,并且应用需要申请ohos.permission.LOCATION权限,同时获得用户授权
  • 以导航场景为例,实例化方式如下:
 RequestParam requestParam = new RequestParam(RequestParam.SCENE_NAVIGATION);
    • 方式二:如果定义的现有场景类型不能满足所需的开发场景,系统提供了基本的定位优先级策略类型。
    • 定位优先级策略类型说明:
策略类型 常量定义 说明
定位精度优先策略 PRIORITY_ACCURACY 定位精度优先策略主要以GNSS定位技术为主,在开阔场景下可以提供米级的定位精度,具体性能指标依赖用户设备的定位硬件能力,但在室内等强遮蔽定位场景下,无法提供准确的位置服务。
应用必须申请ohos.permission.LOCATION权限,同时获得用户授权。
快速定位优先策略 PRIORITY_FAST_FIRST_FIX 快速定位优先策略会同时使用GNSS定位、基站定位和WLAN、蓝牙定位技术,以便室内和户外场景下,通过此策略都可以获得位置结果,当各种定位技术都有提供位置结果时,系统会选择其中精度较好的结果返回给应用。因为对各种定位技术同时使用,对设备的硬件资源消耗较大,功耗也较大。
应用必须申请ohos.permission.LOCATION权限,同时获得用户授权。
低功耗定位优先策略 PRIORITY_LOW_POWER 低功耗定位优先策略主要使用基站定位和WLAN、蓝牙定位技术,也可以同时提供室内和户外场景下的位置服务,因为其依赖周边基站、可见WLAN、蓝牙设备的分布情况,定位结果的精度波动范围较大,如果对定位结果精度要求不高,或者使用场景多在有基站、可见WLAN、蓝牙设备高密度分布的情况下,推荐使用,可以有效节省设备功耗。
应用至少申请ohos.permission.LOCATION权限,同时获得用户授权
  • 以定位精度优先策略为例,实例化方式如下:
 RequestParam requestParam = new RequestParam(RequestParam.PRIORITY_ACCURACY, 0, 0);
    • 后两个入参用于限定系统向应用上报定位结果的频率,分别为位置上报的最小时间间隔,和位置上报的最小距离间隔,开发者可以参考API具体说明进行开发。
  • 实例化 LocatorCallback 对象,用于向系统提供位置上报的途径。应用需要自行实现系统定义好的回调接口,并将其实例化。系统在定位成功确定设备的实时位置结果时,会通过 onLocationReport 接口上报给应用。应用程序可以在 onLocationReport 接口的实现中完成自己的业务逻辑。
 MyLocatorCallback locatorCallback = new MyLocatorCallback();public class MyLocatorCallback implements LocatorCallback {@Overridepublic void onLocationReport(Location location) {}@Overridepublic void onStatusChanged(int type) {}@Overridepublic void onErrorReport(int type) {}}
  • 启动定位:
 locator.startLocating(requestParam, locatorCallback);
  • 如果应用不需要持续获取位置结果,可以使用如下方式启动定位,系统会上报一次实时定位结果后,自动结束应用的定位请求。应用不需要执行结束定位。
 locator.requestOnce(requestParam, locatorCallback);
  • (可选)结束定位:
 locator.stopLocating(locatorCallback);
  • 如果应用使用场景不需要实时的设备位置,可以获取系统缓存的最近一次历史定位结果(此接口的使用需要应用向用户申请 ohos.permission.LOCATION 权限)。
 locator.getCachedLocation();

三、(逆)地理编码转化

① 应用场景
  • 使用坐标描述一个位置,非常准确,但是并不直观,面向用户表达并不友好。
  • 系统向开发者提供了地理编码转化能力(将坐标转化为地理编码信息),以及逆地理编码转化能力(将地理描述转化为具体坐标)。其中地理编码包含多个属性来描述位置,包括国家、行政区划、街道、门牌号、地址描述等等,这样的信息更便于用户理解。
② 地理编码转化 API
  • 进行坐标和地理编码信息的相互转化,所使用的接口说明如下:
接口名 功能描述
GeoConvert() 创建GeoConvert实例对象
GeoConvert(Locale locale) 根据自定义参数创建GeoConvert实例对象
getAddressFromLocation(double latitude, double longitude, int maxItems) 根据指定的经纬度坐标获取地理位置信息。纬度取值范围为[-90, 90],经度取值范围为[-180, 180]
getAddressFromLocationName​(String description, int maxItems) 根据地理位置信息获取相匹配的包含坐标数据的地址列表
getAddressFromLocationName​(String description, double minLatitude, double minLongitude, double maxLatitude, double maxLongitude, int maxItems) 根据指定的位置信息和地理区域获取相匹配的包含坐标数据的地址列表。纬度取值范围为[-90, 90],经度取值范围为[-180, 180]
③ 地理编码转化流程
  • 实例化 GeoConvert 对象,所有与(逆)地理编码转化能力相关的功能API,都是通过 GeoConvert 提供的(如果需要根据自定义参数实例化 GeoConvert 对象,如语言、地区等,可以使用 GeoConvert(Locale locale)):
 GeoConvert geoConvert = new GeoConvert();
  • 获取转化结果:
    • 调用 getAddressFromLocation(double latitude, double longitude, int maxItems), 坐标转化地理位置信息:
 geoConvert.getAddressFromLocation(40.0, 116.0, 1);
  • 调用 getAddressFromLocationName​(String description, int maxItems) 位置描述转化坐标。
 geoConvert.getAddressFromLocationName("北京大兴国际机场", 1);
  • 如果需要查询的位置描述可能出现多地重名的请求,可以调用 getAddressFromLocationName​(String description, double minLatitude, double minLongitude, double maxLatitude, double maxLongitude, int maxItems),通过设置一个经纬度范围,以高效地获取期望的准确结果。
 geoConvert.getAddressFromLocationName("北京大兴国际机场", 0.0, 0.0, 90.0, 180.0, 1);

HarmonyOS之设备定位的使用与地理编码的转化相关推荐

  1. android studio高德地图的显示于定位(附带逆地理编码围栏)

    首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息 网站:http://lbs.amap.com/api/android-sdk/guide/create-p ...

  2. ios 百度地图指定区域_ios百度地图的使用(普通定位、反地理编码)

    iOS定位 - 普通定位(没有地图) - 反地理编码(得到具体位置),下面通过代码给大家详解,代码如下: #import 使用到的头文件 要引入CoreLocation这个包 使用的代理名称 //1. ...

  3. 【HMS Core】定位地图服务常见问题,穿戴设备支持、比例尺支持、在非华为手机上逆地理编码的支持?

     1.关于华为HMS-定位服务穿戴设备的支持问题. 想为华为手表开发定位服务相关的app,华为哪些手表支持定位服务,并且定位数据可以提供给开发者.基于华为自己的编译器开发的app,能否打包成apk包提 ...

  4. 高德地图 SDK集成 定位 地理编码 搜索 经纬度获取 功能工具类

    最近项目要集成高德地图,然后可以根据语音输入指令,进行定位和地理编码搜索功能,从而实现获取当前位置经纬度和根据地址获取经纬度的功能 下载文件之只放了libs和主要代码文件 https://downlo ...

  5. iOS项目开发— CoreLocation的定位服务和地理编码与发编码实现

      一.CoreLocation简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 (1)导航:去任意陌生的地方 (2)周边:找餐馆.找酒店.找银行.找电影院 2.在上述应用中,都用 ...

  6. android百度导航实现,Android 集成百度地图实现设备定位

    Android 集成百度地图实现设备定位 步骤1: 申请android 端SDK : http://lbsyun.baidu.com/ 步骤2: 下载基础版SDK 步骤3: 下载示例程序 步骤4: 开 ...

  7. 室内定位:基于NB/LTE Cat.1蜂窝网络的穿戴设备定位 BLE-4

    ①适用说明 基于蜂窝网络的穿戴设备定位与传统的GPS定位手表类似,只是增加了在室内环境下主动扫描和采集蓝牙iBeacon信号的功能,以便利用室内定位引擎来得到穿戴设备在室内场景的实时位置信息. 从定位 ...

  8. Unity GPS定位之逆地理编码(获取经纬度并转换成地理位置)

    unity定位 前言 最近在做一款手游,然后策划给的需求就是定位到当前用户所在的城市,然后花了一个上午给做了出来,思路大概就是通过手机定位获取到当前位置的经度和纬度,然后通过各个地图(我这里用的是百度 ...

  9. iOS开发:高德地图显示、定位、反地理编码

    iOS 高德地图 1.前期准备: 申请Key:  成为开发者 2.开发环境配置: (1).手动配置 (2).cocoa Pods集成:开发环境配置 3.代码实现: 主要功能有: (1).地图的显示: ...

最新文章

  1. 苹果微信更新不了最新版本_微信版本又双叒叕更新了,这个功能正式下线
  2. CentOS安装ElasticSearch及其问题解决
  3. tf.metrics.accuracy
  4. MVC应用程序实现上传文件(续)
  5. Manacher 最长回文子串
  6. cdoj 1150 排名表 拓扑排序
  7. SSH项目中根据Hibernate的映射文件生成数据库表的方案:
  8. 喜庆新年春节 祝贺语词 艺术字体PSD分层素材
  9. 多目标跟踪数据集 :mot16、mot17数据集介绍
  10. JMeter:生成漂亮的多维度的HTML报告
  11. 为什么说红黑树是“近似平衡”的?
  12. 要关闭python解释器用什么快捷键_Python 解释器
  13. 彻底删除mysql server 2005_sql2005卸载工具(sql server 2005卸载工具)
  14. NTSD命令用法详解
  15. 深入浅出Mysql 读书笔记
  16. 防火墙、防病毒网关、IDS以及该类安全产品开发
  17. 服务器硬件工程师从入门到精通系列视频教程(1)-基础篇-赵振坤-专题视频课程...
  18. 如何正确认识和提升自己的格局
  19. vantUI弹出框和微信小程序的究极大坑
  20. 推荐一个好的节拍器软件?3款App帮你成为节奏大师

热门文章

  1. C++ 变量判定的螺旋法则
  2. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器出现no compatible source was found for this media问题的解决...
  3. 每天学点Python之collections
  4. Vue.js 笔记之 img src
  5. 《代码大全2》读书笔记(七)
  6. Bug测试报告--食物链教学工具--奋斗吧兄弟
  7. spring 登录提示 Bad credentials
  8. [Everyday Mathematics]20150214
  9. 饲料企业精细化生产管理方案
  10. 【原】动态申请二维数组并释放的三种方法