HarmonyOS NEXT 获取当前位置信息

举报
水滴石轩 发表于 2025/03/14 09:07:57 2025/03/14
【摘要】 在鸿蒙原生开发中,位置信息属于半开放隐私信息,开发中要想获取当前设备信息,需要向用户弹框申请权限及需要再module.json5添加权限列表 "requestPermissions": [ { "name": "ohos.permission.LOCATION", "reason": "$string:permissionsReason", "us...

在鸿蒙原生开发中,位置信息属于半开放隐私信息,开发中要想获取当前设备信息,需要向用户弹框申请权限

及需要再module.json5添加权限列表



    "requestPermissions": [
      { "name": "ohos.permission.LOCATION",
        "reason": "$string:permissionsReason",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when":"always"
        }
      },
      { "name": "ohos.permission.APPROXIMATELY_LOCATION",
        "reason": "$string:permissionsReason",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when":"always"
        }
      }
    ]

此处我申请了ohos.permission.LOCATION和ohos.permission.APPROXIMATELY_LOCATION两个权限,这两个权限中ohos.permission.APPROXIMATELY_LOCATION是模糊定位权限,ohos.permission.LOCATION是精准定位权限;字面意思,更精准但也更好性能

在module.json5中添加权限申请后,根据业务需求是在entryAbility中添加用户弹框还是在调用的地方添加用户弹框,具体权限申请请查看https://developer.huawei.com/consumer/cn/blog/topic/03177279673669013

权限搞定后,可以获取定位信息了



const TAG: string = 'GRLocation';


/**
 * 获取系统缓存的最新位置
 * 如果系统当前没有缓存位置会返回错误码。
 * 推荐优先使用该接口获取位置,可以减少系统功耗。
 * 如果对位置的新鲜度比较敏感,可以先获取缓存位置,将位置中的时间戳与当前时间对比,若新鲜度不满足预期可以使用方式二获取位置
 *
 * @returns 缓存的最新位置
 */
export function getLastLocation(): geoLocationManager.Location | undefined {
  try {
    let location = geoLocationManager.getLastLocation();
    return location;
  } catch (err) {
    console.info(TAG, "errCode:" + err.code + ", message:" + err.message);
    return undefined;
  }
}

/**
 * 获取当前位置, 通过本模块获取到的坐标均为WGS-84坐标系坐标点
 * 坐标转换:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/map-convert-coordinate-V14
 *
 * 首先要实例化SingleLocationRequest对象,用于告知系统该向应用提供何种类型的位置服务,以及单次定位超时时间。
 *
 * 设置LocatingPriority:
 *  如果对位置的返回精度要求较高,建议LocatingPriority参数优先选择PRIORITY_ACCURACY,会将一段时间内精度较好的结果返回给应用。
 *  如果对定位速度要求较高,建议LocatingPriority参数选择PRIORITY_LOCATING_SPEED,会将最先拿到的定位结果返回给应用。
 *  两种定位策略均会同时使用GNSS定位和网络定位技术,以便在室内和户外场景下均可以获取到位置结果,对设备的硬件资源消耗较大,功耗也较大。
 *
 * 设置locatingTimeoutMs:
 * 因为设备环境、设备所处状态、系统功耗管控策略等的影响,定位返回的时延会有较大波动,建议把单次定位超时时间设置为10秒。
 */
export function getCurrentLocation() {
  let request: geoLocationManager.SingleLocationRequest = {
    'locatingPriority': geoLocationManager.LocatingPriority.PRIORITY_LOCATING_SPEED,
    'locatingTimeoutMs': 10000
  }
  try {
    geoLocationManager.getCurrentLocation(request).then((result) => { // 调用getCurrentLocation获取当前设备位置,通过promise接收上报的位置
      console.info(TAG, 'current location: ' + JSON.stringify(result));
    })
      .catch((error: BusinessError) => { // 接收上报的错误码
        console.info(TAG, 'promise, getCurrentLocation: error=' + JSON.stringify(error));
      });
  } catch (err) {
    console.info(TAG, "errCode:" + JSON.stringify(err));
  }
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。