HarmonyOS鸿蒙Next中怎么调用系统定位进行开发?
HarmonyOS鸿蒙Next中怎么调用系统定位进行开发? 怎么调用定位呢? 系统定位鸿蒙开发
关于位置服务的三个权限,LOCATION、APPROXIMATELY_LOCATION、LOCATION_IN_BACKGROUND:
1、常规位置服务, LOCATION 和 APPROXIMATELY_LOCATION 这两个权限是都需要申请的,并且LOCATION需要与APPROXIMATELY_LOCATION一起申请才可以 ,需要在module.json5文件中申请这两个权限;申请之后需要校验是否这两个权限,如果没有,需要调用requestPermissionsFromUser向用户申请,具体调用方法可参考下方demo;这两个权限目前没有说明需要跳转设置页面开启;
2、LOCATION_IN_BACKGROUND后台位置服务是必须要引导前往设置页面手动授予;
import { BusinessError } from '@kit.BasicServicesKit';
import { abilityAccessCtrl, bundleManager, common, PermissionRequestResult, Permissions } from '@kit.AbilityKit';
import { map } from '@kit.MapKit';
import { geoLocationManager } from '@kit.LocationKit';
export class MapPermissionsCheckUtil{
private mapController?: map.MapComponentController;
private static mapPermissionsCheckUtil: MapPermissionsCheckUtil;
static instance() {
if (!MapPermissionsCheckUtil.mapPermissionsCheckUtil) {
MapPermissionsCheckUtil.mapPermissionsCheckUtil = new MapPermissionsCheckUtil();
}
return MapPermissionsCheckUtil.mapPermissionsCheckUtil;
}
// 校验应用是否被授予定位权限,可以通过调用checkAccessToken()方法来校验当前是否已经授权。
async checkPermissions(): Promise<boolean> {
const permissions: Array<Permissions> = ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'];
for (let permission of permissions) {
let grantStatus: abilityAccessCtrl.GrantStatus = await this.checkAccessToken(permission);
if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
// 启用我的位置图层,mapController为地图操作类对象,获取方式详见地图呈现章节
this.mapController?.setMyLocationEnabled(true);
// 启用我的位置按钮
this.mapController?.setMyLocationControlsEnabled(true);
return true;
}
}
return false;
}
requestPermissions(): void {
//如果没有被授予定位权限,动态向用户申请授权
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(getContext() as common.UIAbilityContext, ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'])
.then((data: PermissionRequestResult) => {
// 启用我的位置图层
this.mapController?.setMyLocationEnabled(true);
// 启用我的位置按钮
this.mapController?.setMyLocationControlsEnabled(true);
})
.catch((err: BusinessError) => {
console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
})
}
async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
let tokenId: number = 0;
try {
// 获取应用程序的accessTokenID
let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
tokenId = appInfo.accessTokenId;
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
}
// 校验应用是否被授予权限
try {
grantStatus = await atManager.checkAccessToken(tokenId, permission);
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`);
}
return grantStatus;
}
getLocation2CN(latitude:number,longitude:number):string{
//根据地理编码创建 geoLocationManager.ReverseGeoCodeRequest 对象,并且调用geoLocationManager.isGeocoderAvailable()判断(逆)地理编码服务状态。
let reverseGeocodeRequest:geoLocationManager.ReverseGeoCodeRequest = {"latitude": latitude, "longitude": longitude, "maxItems": 1};
let isAvailable = geoLocationManager.isGeocoderAvailable();
let locationStr = "";
if(isAvailable){
try {
geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {
if (err) {
console.log('getAddressesFromLocation err: ' + JSON.stringify(err));
} else {
let temp = data[0];
// 详细地址
locationStr = ""+temp.countryName + temp.placeName;
console.log('getAddressesFromLocation data: ' + JSON.stringify(data) +"locationStr:"+locationStr);
}
});
} catch (err) {
console.error("errCode:" + (err as BusinessError).code + ",errMessage:" + (err as BusinessError).message);
}
}
return locationStr;
}
}
更多关于HarmonyOS鸿蒙Next中怎么调用系统定位进行开发?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中调用系统定位进行开发,主要涉及使用GeoLocationManager类和相关API。首先,需要在config.json文件中声明定位权限,如下所示:
{
"module": {
"reqPermissions": [
{
"name": "ohos.permission.LOCATION"
}
]
}
}
接下来,在代码中初始化GeoLocationManager实例,并请求定位权限:
import geoLocationManager from '@ohos.geoLocationManager';
// 初始化GeoLocationManager
let locationManager = geoLocationManager.getGeoLocationManager();
// 请求定位权限
let permissions = ['ohos.permission.LOCATION'];
let permissionRequestResult = await abilityAccessCtrl.requestPermissionsFromUser(permissions);
在获取权限后,可以通过on方法监听位置变化,或使用getCurrentLocation方法获取当前位置:
// 监听位置变化
locationManager.on('locationChange', (location) => {
console.log('Current location:', location);
});
// 获取当前位置
locationManager.getCurrentLocation().then((location) => {
console.log('Current location:', location);
}).catch((error) => {
console.error('Failed to get location:', error);
});
以上代码展示了如何在HarmonyOS鸿蒙Next中调用系统定位进行开发。

