1. 介绍
简介
定位服务(Location Kit)采用GNSS、Wi-Fi、基站等多途径的混合定位模式进行定位,赋予您的应用快速、精准地获取用户位置信息的能力,构建全球定位服务能力,助力您发展全球业务。您将通过本codelab学习如何调用Location Kit定位服务能力创建一款HarmonyOS应用程序(codelab APP)。
此应用程序的基本架构如图所示:codelab APP将集成HarmonyOS Location SDK,然后通过HarmonyOS Location SDK去调用HMS Core(APK)的定位服务能力。
您将建立什么
在这个codelab中,您将创建一个获取设备位置信息的APP。
您将会学到什么
- 如何配置开发环境。
- 如何调用Location Kit的定位服务能力。
2. 您需要什么
硬件要求
- 计算机(台式机或者笔记本电脑),用于安装DevEco Studio开发环境。
- 华为智能手表一部,用于运行开发调试版本的定位服务APP。
软件要求
- DevEco Studio(推荐使用2.1 Release及以上版本)
- JDK(推荐使用1.7+版本)
- API Version:5及以上
3. 能力接入准备
集成HUAWEI HMS Core能力,需要完成以下准备工作:
4. 配置开发环境
您需要在DevEco Studio打开您创建的工程。
- 打开DevEco Studio项目级"build.gradle"文件。

- 在"allprojects > repositories"里面配置HMS Core SDK的Maven仓地址。
allprojects { repositories { maven {url 'https://repo.huaweicloud.com/repository/maven/'} // 配置HMS Core SDK的Maven仓地址 maven { url 'https://developer.huawei.com/repo/' } jcenter() } } - 在"buildscript > repositories"里面配置HMS Core SDK的Maven仓地址和agconnect服务依赖。
buildscript { repositories { maven {url 'https://repo.huaweicloud.com/repository/maven/'} // 配置HMS Core SDK的Maven仓地址 maven { url 'https://developer.huawei.com/repo/' } jcenter() } dependencies { classpath 'com.huawei.ohos:hap:2.4.4.2' // 添加agconnect服务依赖 classpath 'com.huawei.agconnect:agcp-harmony:1.1.0.300' classpath 'com.huawei.ohos:decctest:1.2.4.0' } } - 添加编译依赖,打开应用级"build.gradle"文件。

- 在相应的的app模块中添加SDK依赖。
dependencies { implementation 'com.huawei.hms:location-harmony:6.3.0.300' } 添加agcp插件配置。请根据实际情况选择:
在文件头部声明下一行添加如下配置。apply plugin: 'com.huawei.agconnect'- 添加agconnect依赖。在"dependencies "中添加如下编译依赖。
dependencies { // agconnect依赖组件 implementation 'com.huawei.agconnect:agconnect-core-harmony:1.1.0.300' }
5. 配置混淆脚本
您编译APP前需要配置混淆配置文件,避免混淆HMS Core SDK导致功能异常。
- 打开HarmonyOS应用级的混淆配置文件"proguard-rules.pro"。
- 添加用于排除HMS Core SDK的混淆配置。
-ignorewarnings -repackageclasses -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keep public class com.huawei.hms.location.harmony.* { *;} -keep public class com.huawei.hms.location.harmony.base.* { *;} -keep class com.huawei.hmf.tasks.* {*;}
6. 定位服务开发
Demo开发过程中涉及到的xxx.java文件均取自示例中源码,建议您先下载示例代码。
- 申请定位权限。
a) 需要在"config.json"文件中的"reqPermissions"字段中添加相关权限。
Harmony提供了两种位置权限:ohos.permission.LOCATION (位置权限)和ohos.permission.LOCATION_IN_BACKGROUND(后台定位权限)。<!--允许程序获取网络信息状态--> ohos.permission.GET_NETWORK_INFO <!--允许程序通过WiFi或移动基站的方式获取用户粗略的经纬度信息,允许应用在前台运行时获取位置信息--> ohos.permission.LOCATION <!--允许应用在后台运行时获取位置信息--> ohos.permission.LOCATION_IN_BACKGROUND示例代码如下:
{ "module": { "reqPermissions": [ { "name": "ohos.permission.GET_NETWORK_INFO", "reason": "Allows programs to obtain network information status." }, { "name": "ohos.permission.LOCATION", "reason": "Allows applications to obtain location information when running in the foreground." }, { "name": "ohos.permission.LOCATION_IN_BACKGROUND", "reason": "Allows applications to obtain location information when running in the background." } ] } }
b) 在"BaseAbilitySlice.java"中动态申请相关权限。if (verifySelfPermission("ohos.permission.LOCATION") != IBundleManager.PERMISSION_GRANTED) { printLog(HiLog.INFO, TAG, "Self: LOCATION permission not granted!"); if (canRequestPermission("ohos.permission.LOCATION")) { printLog(HiLog.INFO, TAG, "Self: can request permission here"); requestPermissionsFromUser( new String[]{"ohos.permission.LOCATION"}, REQUEST_CODE); } else { printLog(HiLog.WARN, TAG, "Self: enter settings to set permission"); } } else { printLog(HiLog.INFO, TAG, "Self: LOCATION permission granted!"); } if (verifySelfPermission("ohos.permission.LOCATION_IN_BACKGROUND") != IBundleManager.PERMISSION_GRANTED) { printLog(HiLog.INFO, TAG, "Self: LOCATION_IN_BACKGROUND permission not granted!"); if (canRequestPermission("ohos.permission.LOCATION_IN_BACKGROUND")) { printLog(HiLog.INFO, TAG, "Self: can request permission here"); requestPermissionsFromUser( new String[]{"ohos.permission.LOCATION_IN_BACKGROUND"}, REQUEST_CODE); } else { printLog(HiLog.WARN, TAG, "Self: enter settings to set permission"); } } else { printLog(HiLog.INFO, TAG, "Self: LOCATION_IN_BACKGROUND permission granted!"); } - 创建定位服务客户端。
在"BaseAbilitySlice"中的onStart()方法中创建一个FusedLocationClient实例,通过该实例调用定位相关接口。public FusedLocationClient fusedLocationClient; @Override protected void onStart(Intent intent) { super.onStart(intent); fusedLocationClient = new FusedLocationClient(this); } - 创建位置信息请求体。
LocationRequest locationRequest = new LocationRequest(); locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); locationRequest.setInterval(5000); locationRequest.setNeedAddress(true); locationRequest.setLanguage("zh"); - 创建结果回调类。
LocationCallback locationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { if (locationResult != null) { List<Location> locations = locationResult.getLocations(); if (!locations.isEmpty()) { printLog(HiLog.INFO, TAG, "onLocationResult location is not empty"); List<HWLocation> hwLocationList = locationResult.getHWLocationList(); if (!hwLocationList.isEmpty()) printLog(HiLog.INFO, TAG, "onLocationResult hwLocationList is not empty"); for (HWLocation hwLocation : hwLocationList) { String result = "[new]onLocationResult location[Longitude,Latitude,Accuracy," + "CountryName,State,City,County,FeatureName,Provider]:" + hwLocation.getLongitude() + "," + hwLocation.getLatitude() + "," + hwLocation.getAccuracy() + "," + hwLocation.getCountryName() + "," + hwLocation.getState() + "," + hwLocation.getCity() + "," + hwLocation.getCounty() + "," + hwLocation.getFeatureName() + "," + hwLocation.getProvider(); printLog(HiLog.INFO, TAG, result); showLocation.setText(result); } } } } @Override public void onLocationAvailability(LocationAvailability locationAvailability) { super.onLocationAvailability(locationAvailability); if (locationAvailability != null) { printLog(HiLog.INFO, TAG, "onLocationAvailability isLocationAvailable:" + locationAvailability.isLocationAvailable()); } } }; - 请求位置更新。
private void requestLocationUpdates() { LocationRequest locationRequest = buildLocationRequest(); fusedLocationClient .requestLocationUpdates(locationRequest, locationCallback) .addOnSuccessListener(var -> { printLog(HiLog.INFO, TAG, "requestLocationUpdatesWithCallback onSuccess"); }) .addOnFailureListener(e -> { printLog(HiLog.INFO, TAG, "requestLocationUpdatesWithCallback onFailure:" + e.getMessage()); }); } - 移除位置信息更新请求。
private void removeLocationUpdates() { fusedLocationClient .removeLocationUpdates(locationCallback) .addOnSuccessListener(var -> { printLog(HiLog.INFO, TAG, "removeLocationUpdatesWithCallback onSuccess"); }) .addOnFailureListener(e -> { printLog(HiLog.INFO, TAG, "removeLocationUpdatesWithCallback onFailure:" + e.getMessage()); }); }
7. 成果展示
您可以点击请求位置更新按钮,并将位置信息打印到当前界面。
![]() | ![]() |
剩余
