HarmonyOS鸿蒙Next中模拟器怎么获取当前位置

HarmonyOS鸿蒙Next中模拟器怎么获取当前位置 只需要位置信息,不需要地图

10 回复

【背景知识】

系统提供的定位权限有:

  • ohos.permission.LOCATION:用于获取精准位置,精准度在米级别。
  • ohos.permission.APPROXIMATELY_LOCATION:用于获取模糊位置,精确度为5公里。
  • ohos.permission.LOCATION_IN_BACKGROUND:用于后台获取位置,应用切换到后台仍然需要获取定位信息的场景。

由于安全隐私要求,应用不能通过弹窗的形式被授予后台位置权限,应用如果需要使用后台位置权限,需要引导用户到设置界面手动授予。

更多关于HarmonyOS鸿蒙Next中模拟器怎么获取当前位置的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


不支持地理围栏和地理逆编码;网络基站定位已支持,底层使用GPS定位

请问有具体的网络基站定位案例吗,


相关案例:

  • 案例一:某城市交通管理部门使用网络基站定位技术监控交通流量,优化信号灯控制,减少拥堵。
  • 案例二:一家大型商场利用网络基站定位为顾客提供室内导航服务,提升购物体验。

标题

这是第一段文本。

这是第二段文本。

import geoLocationManager from '@ohos.geoLocationManager';
import { BusinessError } from "@ohos.base";
import abilityAccessCtrl from "@ohos.abilityAccessCtrl";

@Entry
@Component
export struct LocationPage {
  atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager()

  build() {
    Column { // 在module.json5里申明ohos.permission.LOCATION,ohos.permission.APPROXIMATELY_LOCATION权限
      Button('获取当前定位授权').onClick(() => {
        const context = getContext()
        this.atManager.requestPermissionsFromUser(context,
          ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'], (err, data) => {
            data.authResults.forEach(item => {
              if (item === 0) {
                console.info(`location permission: 权限申请成功`);
              } else {
                console.info(`location permission: 权限申请失败`);
              }
            })
          })
      })
      Button('判断定位位置是否使能').onClick(() => {
        try {
          let locationEnabled = geoLocationManager.isLocationEnabled();
          console.info(`location permission = ${locationEnabled}`)
        } catch (err) {
          console.error("location permission: errCode:" + (err as BusinessError.BusinessError).code + ",errMessage:" +
          (err as BusinessError.BusinessError).message);
        }
      })
      Button('获取当前定位').onClick(() => {
        let requestInfo: geoLocationManager.CurrentLocationRequest = {
          'priority': geoLocationManager.LocationRequestPriority.ACCURACY,
          'scenario': geoLocationManager.LocationRequestScenario.NAVIGATION,
          'maxAccuracy': 0
        };
        try {
          geoLocationManager.getCurrentLocation(requestInfo)
            .then(location => { // 使用 逆地址 编码进行解析
              let reverseGeocodeReq: geoLocationManager.ReverseGeoCodeRequest =
                { 'latitude': location.latitude, 'longitude': location.longitude, 'maxItems': 1 }
              geoLocationManager.getAddressesFromLocation(reverseGeocodeReq, (err, resultValues) => {
                console.info('location getAddressesFromLocation = ' + JSON.stringify(resultValues))
              })
            }).catch(error => {
            console.error('location: promise, getCurrentLocation: error=' + JSON.stringify(error));
          });
        } catch (err) {
          console.error("location: errCode:" + (err as BusinessError.BusinessError).code + ",errMessage:" +
          (err as BusinessError.BusinessError).message);
        }
      })
    }
  }
}
module.json5:
'requestPermissions': [
{
  'name':
  'ohos.permission.INTERNET'
}
,
{
  "name":
  "ohos.permission.LOCATION",
  "reason":
  '$string:app_loc',
  "usedScene":
  {
    "abilities": []
  }
}
,
{
  "name":
  "ohos.permission.APPROXIMATELY_LOCATION",
  "reason":
  '$string:app_name',
  "usedScene":
  {
    "abilities": []
  }
}
]

然后在模拟器中打开位置(顶部下拉即可看到)与GPS,在GPS中手动输入经纬度,在代码中即可获取

按照此操作处理后日志提示location getAddressesFromLocation = undefined,GPS与位置全部都已经打开,

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { const atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager() hilog.info(0x0000, ‘testTag’, ‘%{public}s’, ‘Ability onCreate’); try { atManager.requestPermissionsFromUser(this.context, [“ohos.permission.APPROXIMATELY_LOCATION”,“ohos.permission.LOCATION”]).then((data) => { if (data.authResults[0] == 0) { identifier.getOAID((err: BusinessError, data: string) => { if (err.code) { hilog.error(0x0000, ‘testTag’, ‘%{public}s’, get oaid failed, error: ${err.code} ${err.message}); } else { const oaid: string = data; hilog.info(0x0000, ‘testTag’, ‘%{public}s’, succeeded in getting oaid by callback , oaid: ${oaid}); } }); } else { hilog.error(0x0000, ‘testTag’, ‘%{public}s’, ‘user rejected’); } }).catch((err: BusinessError) => { hilog.error(0x0000, ‘testTag’, ‘%{public}s’, request permission failed, error: ${err.code} ${err.message}); }) } catch (err) { hilog.error(0x0000, ‘testTag’, ‘%{public}s’, catch err->${err.code}, ${err.message}); } }

我发现的原因是逆地理编码不可用,是可以获取到经纬度的,在逆地理编码时,我检查逆地理服务状态,是false,请问您的模拟器可以使用逆地理编码服务吗。

在HarmonyOS Next中获取模拟器当前位置需要使用@ohos.geoLocationManager模块。步骤如下:

  1. config.json中声明ohos.permission.LOCATION权限
  2. 导入geoLocationManager模块
  3. 调用getCurrentLocation方法获取位置信息

示例代码:

import geoLocationManager from '@ohos.geoLocationManager';
try {
  let location = await geoLocationManager.getCurrentLocation();
  console.log('当前位置:', location);
} catch (err) {
  console.error('获取位置失败:', err);
}

注意需要在模拟器设置中开启模拟位置功能。

在HarmonyOS Next中获取模拟器当前位置,可以通过@ohos.geolocation模块实现。以下是关键代码示例:

  1. 首先在module.json5中声明权限:
"requestPermissions": [
  {
    "name": "ohos.permission.LOCATION"
  }
]
  1. 获取位置的核心代码:
import geolocation from '@ohos.geolocation';

// 获取单次位置
geolocation.getCurrentLocation((err, data) => {
  if (err) {
    console.error('获取位置失败:' + JSON.stringify(err));
    return;
  }
  console.info('当前位置:' + JSON.stringify(data));
});

// 或者持续监听位置变化
geolocation.on('locationChange', (data) => {
  console.info('位置变化:' + JSON.stringify(data));
});

返回的data对象包含:

  • latitude:纬度
  • longitude:经度
  • altitude:海拔(可选)
  • accuracy:精度(米)
  • time:时间戳

注意:

  1. 模拟器默认位置可在DevEco Studio的模拟器设置中配置
  2. 真机调试需要确保GPS已开启
  3. 首次调用会弹出权限请求对话框
回到顶部