HarmonyOS鸿蒙Next中怎么调用系统定位进行开发?

HarmonyOS鸿蒙Next中怎么调用系统定位进行开发? 怎么调用定位呢? 系统定位鸿蒙开发

2 回复

关于位置服务的三个权限,LOCATION、APPROXIMATELY_LOCATION、LOCATION_IN_BACKGROUND:

1、常规位置服务, LOCATION 和 APPROXIMATELY_LOCATION 这两个权限是都需要申请的,并且LOCATION需要与APPROXIMATELY_LOCATION一起申请才可以 ,需要在module.json5文件中申请这两个权限;申请之后需要校验是否这两个权限,如果没有,需要调用requestPermissionsFromUser向用户申请,具体调用方法可参考下方demo;这两个权限目前没有说明需要跳转设置页面开启;

2、LOCATION_IN_BACKGROUND后台位置服务是必须要引导前往设置页面手动授予;

3、具体可参考API说明:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/permissions-for-all-V5#ohospermissionlocation_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中调用系统定位进行开发。

回到顶部