鸿蒙next开发中如何获取定位服务?

讲解如何开发位置服务应用,提供地理位置相关功能

鸿蒙next
定位
7天前
233浏览
收藏 0
回答 2
待解决
回答 2
按赞同
/
按时间
云也蹦迪

在“module.json5”声明"ohos.permission.LOCATION"权限,使用“abilityAccessCtrl”动态请求权限。借助“location.getLocatir”获取定位服务实例,用“getCurrentLocation”方法获取当前位置。注意确保设备开启定位服务,不同设备和系统观念版本可能有兼容性问题

分享
微博
QQ
微信
回复
7天前
Harmony魔法师

在鸿蒙Next(HarmonyOS NEXT)开发中,获取定位服务需要遵循以下步骤,包括权限申请、定位服务初始化和位置信息监听。


1. 配置权限 

1.1 声明权限 在 ​​module.json5​​ 文件中添加定位权限:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.LOCATION",
        "reason": "需要获取位置信息以提供服务"
      },
        {
        "name": " ohos.permission.APPROXIMATELY_LOCATION"
        "reason": "需要获取位置信息以提供服务"
      }
    ]
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

1.2 动态申请权限(API 9+) 在代码中动态请求用户授权:

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

async function requestLocationPermission() {
  let atManager = abilityAccessCtrl.createAtManager();
  try {
    await atManager.requestPermissionsFromUser(
      this.context, 
      ['ohos.permission.LOCATION',' ohos.permission.APPROXIMATELY_LOCATION']
    );
  } catch (err) {
    console.error('权限申请失败:', err);
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

2. 初始化定位服务 使用 ​​geoLocationManager​​ 模块获取定位服务实例:

import geoLocationManager from '@ohos.geoLocationManager';

// 初始化定位参数
let requestInfo: geoLocationManager.LocationRequest = {
  priority: geoLocationManager.LocationRequestPriority.FIRST_FIX, // 高精度
  scenario: geoLocationManager.LocationRequestScenario.UNSET, // 通用场景
  timeInterval: 1, // 更新间隔(秒)
  distanceInterval: 0, // 更新距离(米)
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

3. 监听位置变化 注册位置更新的回调函数:

let locationCallback = (location: geoLocationManager.Location) => {
  console.log('纬度:', location.latitude);
  console.log('经度:', location.longitude);
  console.log('精度:', location.accuracy);
};

// 开始监听位置
geoLocationManager.on('locationChange', requestInfo, locationCallback);

// 停止监听
// geoLocationManager.off('locationChange', locationCallback);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

### 4. 获取单次定位 如果需要一次性定位,使用 ​​getCurrentLocation​​:

import { geoLocationManager } from '@kit.LocationKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 方式一:使用CurrentLocationRequest作为入参
let requestInfo:geoLocationManager.CurrentLocationRequest = {'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX, 'scenario': geoLocationManager.LocationRequestScenario.UNSET,'maxAccuracy': 0};
let locationChange = (err:BusinessError, location:geoLocationManager.Location):void => {
    if (err) {
        console.error('locationChanger: err=' + JSON.stringify(err));
    }
    if (location) {
        console.info('locationChanger: location=' + JSON.stringify(location));
    }
};

try {
    geoLocationManager.getCurrentLocation(requestInfo, locationChange);
} catch (err) {
    console.error("errCode:" + err.code + ", message:"  + err.message);
}

// 方式二:使用SingleLocationRequest作为入参
let request:geoLocationManager.SingleLocationRequest = {'locatingTimeoutMs': 10000, 'locatingPriority': geoLocationManager.LocatingPriority.PRIORITY_ACCURACY};
let locationCallback = (err:BusinessError, location:geoLocationManager.Location):void => {
    if (err) {
        console.error('locationChanger: err=' + JSON.stringify(err));
    }
    if (location) {
        console.info('locationChanger: location=' + JSON.stringify(location));
    }
};

try {
    geoLocationManager.getCurrentLocation(request, locationCallback);
} catch (err) {
    console.error("errCode:" + err.code + ", message:"  + err.message);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.

注意事项

权限分级:若需要后台持续定位,需申请权限。

  • ohos.permission.LOCATION:用于获取精准位置,精准度在米级别。
  • ohos.permission.APPROXIMATELY_LOCATION:用于获取模糊位置,精确度为5公里。访问设备的位置信息,必须申请权限,并且获得用户授权

设备兼容性:检查设备是否支持定位:

let isLocationEnabled = geoLocationManager.isLocationEnabled();
  • 1.

错误处理:监听定位状态变化:


// 方式一:使用LocationRequest作为入参
let requestInfo:geoLocationManager.LocationRequest = {'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX, 'scenario': geoLocationManager.LocationRequestScenario.UNSET, 'timeInterval': 1, 'distanceInterval': 0, 'maxAccuracy': 0};
let locationChange = (location:geoLocationManager.Location):void => {
    console.info('locationChanger: data: ' + JSON.stringify(location));
};
try {
    geoLocationManager.on('locationChange', requestInfo, locationChange);
} catch (err) {
    console.error("errCode:" + err.code + ", message:"  + err.message);
}

// 方式二:使用ContinuousLocationRequest作为入参
let request:geoLocationManager.ContinuousLocationRequest = {'interval': 1, 'locationScenario': geoLocationManager.UserActivityScenario.NAVIGATION};
let locationCallback = (location:geoLocationManager.Location):void => {
    console.info('locationCallback: data: ' + JSON.stringify(location));
};
try {
    geoLocationManager.on('locationChange', request, locationCallback);
} catch (err) {
    console.error("errCode:" + err.code + ", message:"  + err.message);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

通过以上步骤,你可以在鸿蒙Next应用中实现精准的定位功能。确保在实际使用中合理申请权限并优化电量消耗。

参考文档:​​https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/js-apis-geolocationmanager-V13#geolocationmanagergetcurrentlocation​

已于2025-3-26 15:57:07修改
分享
微博
QQ
微信
回复
7天前


相关问题
HarmonyOS NEXT开发应用名如何获取
121浏览 • 0回复 待解决
鸿蒙开发如何请求华为打印服务
4197浏览 • 0回复 待解决
HarmonyOS 定位服务、地图服务
575浏览 • 1回复 待解决
HarmonyOS 定位服务
611浏览 • 1回复 待解决
安卓app在鸿蒙2.0无法获取定位信息
15553浏览 • 4回复 待解决