1. 介绍 移动终端设备已经深入人们日常生活的方方面面,如:导航、外卖、出行打车等,这些都离不开定位用户终端设备的位置。HarmonyOS对于这些场景,定义了几种常见的位置能力使用场景,并针对使用场景做了适当的优化处理,应用可以直接匹配使用,简化开发复杂度,也可以使应用的使用体验更贴近每个用户。
HarmonyOS提供导航、出行约车等常见场景。如果应用只需要获取一次精准定位信息,不用实时上报位置信息 。HarmonyOS还提供了基本的定位优先级策略类型,比如:定位优先策略,快速定位优先策略等。详细文档可参照HarmonyOS位置开发概述文档。
本教程将为您介绍以下内容并展示完整示例:
2. 搭建HarmonyOS环境我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。
- 安装DevEco Studio,详情请参考下载和安装软件。
- 设置DevEco Studio开发环境,DevEco Studio开发环境依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
- 如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
- 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境。
- 开发者可以参考以下链接,完成设备调试的相关配置:
您可以利用如下设备完成Codelab:
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文件中声明所需要的权限,示例代码如下:
- module": {
- ......
- "reqPermissions": [
- {
- "name": "ohos.permission.LOCATION",
- "reason": "$string:reason_description",
- "usedScene": {
- "ability": [
- "com.huawei.sample.location.MainAbility"
- ],
- "when": "always"
- }
- },
- {
- "name": "ohos.permission.LOCATION_IN_BACKGROUND"
- }
- ]
- }
复制代码
5. 创建定位参数
实例化 Locator 对象,所有与基础定位请求打开位置服务的相关功能 API,比如:获取缓存位置等都是通过 Locator 提供的。
实例化 RequestParam 对象,用于告知系统该向应用提供何种类型的位置服务,以及位置结果上报的频率。示例代码如下:
- private void registerLocationEvent() {
- if (hasPermissionGranted(PERM_LOCATION)) {
- int timeInterval = 0;
- int distanceInterval = 0;
- locator = new Locator(context);
- requestParam = new RequestParam(RequestParam.PRIORITY_LOW_POWER, timeInterval, distanceInterval);
- //为开启定位服务方法
- locator.startLocating(requestParam, locatorResult);
- }
- }
复制代码
6. 返回设备定位信息
实例化 LocatorCallback 对象,用于向系统提供位置上报的途径。
应用需要自行实现系统定义好的回调接口,并将其实例化。系统在定位成功确定设备的实时位置结果时,会通过onLocationReport 接口上报给应用。应用程序可以在 onLocationReport 接口的实现中完成自己的业务逻辑。示例代码如下:
- private class LocatorResult implements LocatorCallback {
- [url=home.php?mod=space&uid=2735960]@Override[/url]
- public void onLocationReport(Location location) {
- HiLog.info(LABEL_LOG, "%{public}s","onLocationReport : " + location.getLatitude() + "-" + location.getAltitude());
- setLocation(location);
- }
- @Override
- public void onStatusChanged(int statusCode) {
- HiLog.info(LABEL_LOG, "%{public}s", "MyLocatorCallback onStatusChanged : " + statusCode);
- }
- @Override
- public void onErrorReport(int errorCode) {
- HiLog.info(LABEL_LOG, "%{public}s", "MyLocatorCallback onErrorReport : " + errorCode);
- }
- }
复制代码
说明
以上代码除数据同步外,还有部分场景业务代码。
7. 方向传感器的创建与订阅
针对某些传感器,开发者需要请求相应的权限,才能获取传感器数据详细请见开发者文档。方向传感器不需要请求权限,通过创建传感器回调,并订阅传感器数据,然后接收并处理传感器数据即可。示例代码如下:
- private void initCompass() {
- if (findComponentById(ResourceTable.Id_compass_icon_img) instanceof Image) {
- compassImg = (Image) findComponentById(ResourceTable.Id_compass_icon_img);
- }
- if (findComponentById(ResourceTable.Id_compass_angle_text) instanceof Text) {
- compassAngleText = (Text) findComponentById(ResourceTable.Id_compass_angle_text);
- }
- categoryOrientationAgent = new CategoryOrientationAgent();
- CategoryOrientation categoryOrientation =categoryOrientationAgent.getSingleSensor(CategoryOrientation.SENSOR_TYPE_ORIENTATION);
- categoryOrientationDataCallback =new ICategoryOrientationDataCallback() {
- @Override
- public void onSensorDataModified(CategoryOrientationData categoryOrientationData) {
- degree = categoryOrientationData.getValues()[0];
- handler.sendEvent(0);
- }
- @Override
- public void onAccuracyDataModified(CategoryOrientation categoryOrientation, int var1) {}
- @Override
- public void onCommandCompleted(CategoryOrientation categoryOrientation) {}
- };
- categoryOrientationAgent.setSensorDataCallback(categoryOrientationDataCallback, categoryOrientation, SAMPLING_INTERVAL_NANOSECONDS);
- }
复制代码
8. 最终实现效果 通过本教程的学习,你已经学会了鸿蒙定位,地理位置转化和方向传感器的基本使用。