当前位置: 首页 > news >正文

#跟着若城学鸿蒙# web篇-获取定位

前言

在业务中,某些网页上需要获取用户的地理位置,然后按照用户搜索的兴趣点与用户的距离远近进行排序,这就需要h5能够获取到用户的位置。

由于 web 组件基于Chromium  M114 版本开发,前端就可以使用navigator.geolocation.getCurrentPosition来获取位置信息。

实现

定位权限

首先需要在配置文件中声明定位权限

在模块中module.json5文件中配置一下权限

      {"name" : "ohos.permission.APPROXIMATELY_LOCATION","reason": "$string:user_grant_approximately_location_reason","usedScene": {"abilities": ["EntryAbility"],"when": "inuse"}},{"name" : "ohos.permission.LOCATION","reason": "$string:user_grant_approximately_location_reason","usedScene": {"abilities": ["EntryAbility"],"when": "inuse"}},{"name" : "ohos.permission.LOCATION_IN_BACKGROUND","reason": "$string:user_grant_approximately_location_reason","usedScene": {"abilities": ["EntryAbility"],"when": "inuse"}}

这里我们配置了大致定位、精确定位和后台定位

前端页面

<!DOCTYPE html>
<html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>位置信息</title>
</head><body>
<p id="locationInfo">位置信息</p>
<button onclick="getLocation()">获取位置</button><script>function getLocation() {console.error("获取位置");if (navigator.geolocation) {console.error("可以使用 ");const options = {enableHighAccuracy: true,  // 是否启用高精度模式timeout: 5000,           // 超时时间(毫秒)maximumAge: 0            // 缓存位置的最大年龄(毫秒)};navigator.geolocation.getCurrentPosition((position) => {console.error("获取到定位结果");console.error("Latitude: " + position.coords.latitude + "<br />Longitude: " + position.coords.longitude);// 在这里处理获取到的位置信息var locationInfo = document.getElementById("locationInfo");locationInfo.innerHTML = "Latitude: " + position.coords.latitude + "<br />Longitude: " + position.coords.longitude;},(error) => {console.error("获取位置失败:",error);// 在这里处理错误情况},options);} else {console.error("不可以使用");}}</script>

web 组件

在 web 组件中,我们需要先允许访问位置信息,然后在收到前端请求时,进行处理

          //定位.geolocationAccess(true).onGeolocationShow((event)=>{AlertDialog.show({title: '位置权限请求',message: '是否允许获取位置信息',primaryButton: {value: '拒绝',action: () => {if (event) {event.geolocation.invoke(event.origin, false, false); // 不允许此站点地理位置权限请求}}},secondaryButton: {value: '允许',action: () => {if (event) {let context = getContext(this) as common.UIAbilityContext;let atManager = abilityAccessCtrl.createAtManager();atManager.requestPermissionsFromUser(context, ["ohos.permission.APPROXIMATELY_LOCATION","ohos.permission.LOCATION"]).then((data) => {event.geolocation.invoke(event.origin, true, false); // 允许此站点地理位置权限请求}).catch((error: BusinessError) => {console.error(`Failed to request permissions from user. Code is ${error.code}, message is ${error.message}`);})}}},cancel: () => {if (event) {event.geolocation.invoke(event.origin, false, false); // 不允许此站点地理位置权限请求}}})})

当点击页面中的获取位置时,会回调 web 的onGeolocationShow,这时候按照规范,需要先弹窗向用户解释为什么需要这个权限。当用户点击允许时,我们再去申请权限权限。当用户允许权限后,调用event.geolocation.invoke(event.origin, true, false); 通知前端可以定位了。当用户拒绝时回调event.geolocation.invoke(event.origin, false, false);通知前端没有权限。

这样我们就完成了定位请求。下面放一下效果图

相关文章:

  • 质量管理工程师面试总结
  • React文件上传组件封装全攻略
  • React Flow 节点属性详解:类型、样式与自定义技巧
  • python打卡day27
  • 组件导航 (HMRouter)+flutter项目搭建-混合开发+分栏效果
  • Jenkins的流水线执行shell脚本执行jar命令后项目未启动未输出日志问题处理
  • 变量赋值和数据类型
  • 线程池(ThreadPoolExecutor)实现原理和源码细节是Java高并发面试和实战开发的重点
  • 用GPU训练模型的那些事:PyTorch 多卡训练实战
  • moveit2报错!
  • MongoTemplate 基础使用帮助手册
  • C#中UI线程的切换与后台线程的使用
  • neo4j框架:ubuntu系统中neo4j安装与使用教程
  • 小白用AI 完整的deepseek使用指南
  • 面向SDV的在环测试深度解析——仿真中间件SIL KIT应用篇
  • oracle主备切换参考
  • Python机器学习笔记(二十五、算法链与管道)
  • SearxNG本地搜索引擎
  • Visual Studio 2022 中添加“高级保存选项”及解决编码问题
  • matlab 获取DEM数据中各栅格点的经纬度
  • 下周或迎外贸“抢出口”高峰,跨境电商敏感货物如何便利化“登机”?
  • A股三大股指低收:汽车股领涨,大金融走弱,两市成交近1.1万亿元
  • 国际奥委会举办研讨会,聚焦如何杜绝操纵比赛
  • 与总书记交流的上海人工智能实验室年轻人,在探索什么前沿领域?
  • 日本前卫艺术先驱群展上海:当具体派相遇古树古宅
  • 国务院关税税则委员会公布公告调整对原产于美国的进口商品加征关税措施