当前位置: 首页 > 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);通知前端没有权限。

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

http://www.xdnf.cn/news/479503.html

相关文章:

  • 医学图像分析中的大规模基准测试与增强迁移学习|文献速递-深度学习医疗AI最新文献
  • 2025蓝桥杯JAVA编程题练习Day8
  • Java 后端给前端传Long值,精度丢失的问题与解决
  • 【pbootcms】打开访问首页显示未检测到您服务器环境的sqlite3数据库拓展,请检查php.ini中是否已经开启该拓展
  • 职业院校物联网安装调试员(工业数智技术)实训解决方案
  • 股指期货贴水为何会产生成本?
  • OceanBase 的系统变量、配置项和用户变量有何差异
  • 快速通关双链表秘籍
  • 旧 docker 版本通过 nvkind 搭建虚拟多节点 gpu 集群的坑
  • 智能裂变引擎 商业增长利器 —— 专业推客系统耀世而来
  • 图像对比度调整(局域拉普拉斯滤波)
  • 电子学会Python一级真题总结2
  • PHP 与 面向对象编程(OOP)
  • [250516] OpenAI 升级 ChatGPT:GPT-4.1 及 Mini 版上线!
  • 使用pytest实现参数化后,控制台输出的日志是乱码
  • 数学复习笔记 12
  • RabbitMQ ④-持久化 || 死信队列 || 延迟队列 || 事务
  • AWS Elastic Beanstalk控制台部署Spring极简工程(LB版)
  • Mysql存储过程(附案例)
  • LabVIEW光谱检测系统
  • 29、魔法微前端——React 19 模块化架构
  • 数值分析证明题
  • React底层架构深度解析:从虚拟DOM到Fiber的演进之路
  • 11.vue网页开启自动提交springboot后台查询-首页显示数据库表
  • Docker 无法拉取镜像解决办法
  • [MySQL排查] “Too many connections“ 错误?数据库最大连接数满了怎么办及优化
  • ProfibusDP主站转modbusTCP网关接DP从站网关通讯案例
  • 高可用消息队列实战:AWS SQS 在分布式系统中的核心解决方案
  • 数据科学和机器学习的“看家兵器”——pandas模块 之六
  • 微信小程序点击按钮跳转链接并显示