[文章]基于HarmonyOS位置相关接口,获取设备实时位置,调用HarmonyOS方向传感器,获取方向信息

阅读量0
1
5
1. 介绍      
移动终端设备已经深入人们日常生活的方方面面,如:导航、外卖、出行打车等,这些都离不开定位用户终端设备的位置。HarmonyOS对于这些场景,定义了几种常见的位置能力使用场景,并针对使用场景做了适当的优化处理,应用可以直接匹配使用,简化开发复杂度,也可以使应用的使用体验更贴近每个用户。

HarmonyOS提供导航、出行约车等常见场景。如果应用只需要获取一次精准定位信息,不用实时上报位置信息 。HarmonyOS还提供了基本的定位优先级策略类型,比如:定位优先策略,快速定位优先策略等。详细文档可参照HarmonyOS位置开发概述文档。

本教程将为您介绍以下内容并展示完整示例:
  • 获取地址位置信息
  • 地理位置编码转化
  • 方向传感器

2. 搭建HarmonyOS环境
我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。
  • 安装DevEco Studio,详情请参考下载和安装软件。
  • 设置DevEco Studio开发环境,DevEco Studio开发环境依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
    • 如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
    • 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境。
  • 开发者可以参考以下链接,完成设备调试的相关配置:
    • 使用真机进行调试
    • 使用模拟器进行调试
您可以利用如下设备完成Codelab:
  • 开启了开发者模式的HarmonyOS真机或DevEco Studio自带模拟器。
    说明
    本篇文章使用的DevEco Studio版本为DevEco Studio 2.1 Beta4,使用的SDK版本为API Version 5。


3. 代码结构解读      
为了方便您的学习,我们提供了获取设备位置示例工程的完整代码,代码的工程结构如下:

  • location:LocationBean封装了位置的基本信息。
  • Slice:MainAbilitySlice应用主页面,位置获取逻辑实现类。
  • utils:LogUtil主要作用打印日志信息。
  • media:存放图片资源(本教程所需要的compass.png图片,已放在下方)


除以上文件,工程中还用到了两个xml布局文件,他们声明在了mainresourcesbaselayout目录下

4. 实现定位需要申请的权限      
应用在使用系统能力前,需要检查是否已经获取用户授权访问设备位置信息。如未获得授权,可以向用户申请需要的位置权限。申请方式请参考动态申请权限开发步骤。
系统提供的定位权限有:
  • ohos.permission.LOCATION
  • ohos.permission.LOCATION_IN_BACKGROUND
访问设备的位置信息,必须申请 ohos.permission.LOCATION 权限,并且获得用户授权。

如果应用在后台运行时也需要访问设备位置,除需要将应用声明为允许后台运行外,还必须申请 ohos.permission.LOCATION_IN_BACKGROUND 权限,这样应用在切入后台之后,系统依然可以继续上报位置信息。
开发者可以在应用config.json文件中声明所需要的权限,示例代码如下:
  1. module": {
  2. ......
  3.     "reqPermissions": [
  4.       {
  5.         "name": "ohos.permission.LOCATION",
  6.         "reason": "$string:reason_description",
  7.         "usedScene": {
  8.           "ability": [
  9.             "com.huawei.sample.location.MainAbility"
  10.           ],
  11.           "when": "always"
  12.         }
  13.       },
  14.       {
  15.         "name": "ohos.permission.LOCATION_IN_BACKGROUND"
  16.       }
  17.     ]
  18. }
复制代码

5. 创建定位参数      
实例化 Locator 对象,所有与基础定位请求打开位置服务的相关功能 API,比如:获取缓存位置等都是通过 Locator 提供的。

实例化 RequestParam 对象,用于告知系统该向应用提供何种类型的位置服务,以及位置结果上报的频率。示例代码如下:

  1. private void registerLocationEvent() {
  2.     if (hasPermissionGranted(PERM_LOCATION)) {
  3.         int timeInterval = 0;
  4.         int distanceInterval = 0;
  5.         locator = new Locator(context);
  6.         requestParam = new RequestParam(RequestParam.PRIORITY_LOW_POWER, timeInterval, distanceInterval);
  7.         //为开启定位服务方法
  8.         locator.startLocating(requestParam, locatorResult);
  9.     }
  10. }
复制代码

6. 返回设备定位信息      
实例化 LocatorCallback 对象,用于向系统提供位置上报的途径。
应用需要自行实现系统定义好的回调接口,并将其实例化。系统在定位成功确定设备的实时位置结果时,会通过onLocationReport 接口上报给应用。应用程序可以在 onLocationReport 接口的实现中完成自己的业务逻辑。示例代码如下:
  1. private class LocatorResult implements LocatorCallback {
  2.     [url=home.php?mod=space&uid=2735960]@Override[/url]
  3.     public void onLocationReport(Location location) {
  4.         HiLog.info(LABEL_LOG, "%{public}s","onLocationReport : " + location.getLatitude() + "-" + location.getAltitude());
  5.             setLocation(location);
  6.         }
  7.         @Override
  8.         public void onStatusChanged(int statusCode) {
  9.             HiLog.info(LABEL_LOG, "%{public}s", "MyLocatorCallback onStatusChanged : " + statusCode);
  10.         }
  11.         @Override
  12.         public void onErrorReport(int errorCode) {
  13.             HiLog.info(LABEL_LOG, "%{public}s", "MyLocatorCallback onErrorReport : " + errorCode);
  14.     }
  15. }
复制代码

说明
以上代码除数据同步外,还有部分场景业务代码。

7. 方向传感器的创建与订阅      
针对某些传感器,开发者需要请求相应的权限,才能获取传感器数据详细请见开发者文档。方向传感器不需要请求权限,通过创建传感器回调,并订阅传感器数据,然后接收并处理传感器数据即可。示例代码如下:
  1. private void initCompass() {
  2.     if (findComponentById(ResourceTable.Id_compass_icon_img) instanceof Image) {
  3.         compassImg = (Image) findComponentById(ResourceTable.Id_compass_icon_img);
  4.     }
  5.     if (findComponentById(ResourceTable.Id_compass_angle_text) instanceof Text) {
  6.         compassAngleText = (Text) findComponentById(ResourceTable.Id_compass_angle_text);
  7.     }
  8.     categoryOrientationAgent = new CategoryOrientationAgent();
  9.     CategoryOrientation categoryOrientation =categoryOrientationAgent.getSingleSensor(CategoryOrientation.SENSOR_TYPE_ORIENTATION);
  10.     categoryOrientationDataCallback =new ICategoryOrientationDataCallback() {
  11.         @Override
  12.         public void onSensorDataModified(CategoryOrientationData categoryOrientationData) {
  13.             degree = categoryOrientationData.getValues()[0];
  14.             handler.sendEvent(0);
  15.         }
  16.         @Override
  17.         public void onAccuracyDataModified(CategoryOrientation categoryOrientation, int var1) {}
  18.         @Override
  19.         public void onCommandCompleted(CategoryOrientation categoryOrientation) {}
  20.      };
  21.      categoryOrientationAgent.setSensorDataCallback(categoryOrientationDataCallback, categoryOrientation, SAMPLING_INTERVAL_NANOSECONDS);
  22. }
复制代码

8. 最终实现效果      
通过本教程的学习,你已经学会了鸿蒙定位,地理位置转化和方向传感器的基本使用。

完整示例代码(1).pdf
(112.87 KB, 下载次数: 4)



回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友