【鸿蒙 HarmonyOS】获取设备的地理位置

一、背景

获取移动设备的地理位置,包含:经度、维度、具体地理位置等,地理位置信息能在许多业务场景中被应用,如导航、地图服务、位置服务、社交媒体等。

下面以一个Demo例子,来实现获取设备地理位置的功能

官方文档指引👉:文档中心

二、实现方法

2.1、申请位置权限

在model.json5文件中的module模块下添加如下请求权限:

{"module" : {"requestPermissions":[{"name": "ohos.permission.LOCATION",},{"name": "ohos.permission.APPROXIMATELY_LOCATION"}]}
}

2.2、具体实现

2.2.1、授权询问

先检测权限是否已经授权,如果未授权就弹出授权弹窗

// 检测权限是否已经授权,如果未授权就弹出授权弹窗reqPermissionsFromUser(permissions: Array<Permissions>){let context = getContext(this) as common.UIAbilityContext;let atManager = abilityAccessCtrl.createAtManager();// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗return atManager.requestPermissionsFromUser(context, permissions).then((data) => {let grantStatus: Array<number> = data.authResults;let length: number = grantStatus.length;for (let i = 0; i < length; i++) {if (grantStatus[i] === 0) {// 用户授权,可以继续操作return true} else {// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限return false}}// 授权成功}).catch((err) => {console.error(`requestPermissionsFromUser failed, code is ${err.code}, message is ${err.message}`);})}

2.2.2、获取当前位置

点击定位按钮,获取当前位置,包含:经度、维度、国家、省份及详细地址

@Entry
@Component
struct Index {@State mLatitude: string = '' // 经度@State mLongitude: string = '' // 纬度@State mAddresses: string = '' // 地址@State mCountryName: string = '' // 国家名称@State mAdministrativeArea: string = '' // 省份@State mLocality: string = '' // 地市@State mSubLocality: string = '' // 县区build() {Column({space:10}) {Button('定位').width('100%').margin({ top: 10, bottom: 10 }).onClick(()=>{this.getLocation()})Text('【当前位置信息】').fontSize(20)Text(`经度:${this.mLatitude}`).width(260)Text(`纬度:${this.mLongitude}`).width(260)Text(`地址:${this.mAddresses}`).width(260)Text(`县区:${this.mSubLocality}`).width(260)Text(`地市:${this.mLocality}`).width(260)Text(`省份:${this.mAdministrativeArea}`).width(260)Text(`国家:${this.mCountryName}`).width(260)}.width('100%').height('100%').backgroundColor('#EAEAEA').padding(10)}//获取当前位置async getLocation(){let status = await this.reqPermissionsFromUser(['ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION'])if(status){let location = geoLocationManager.getLastLocation()console.log('lucy',JSON.stringify(location))location['locale'] = 'zh'//逆地理编码服务geoLocationManager.getAddressesFromLocation(location,(err,data: any)=>{if(!err){console.log('lucy--',JSON.stringify(data))this.mLatitude = data[0].latitudethis.mLongitude = data[0].longitude;this.mAddresses = data[0].placeNamethis.mCountryName = data[0].countryNamethis.mAdministrativeArea = data[0].administrativeAreathis.mLocality = data[0].localitythis.mSubLocality = data[0].subLocality}})}}
}

备注:

真机调试时,使用逆地理编码getAddressesFromLocation获取结果都是英文,在使用getAddressesFromLocation()方法之前,添加location['locale'] = 'zh'参数即可

2.2.3、进入页面与离开页面操作

进入页面授权访问,绑定监听事件;离开页面,取消监听事件

  //进入页面授权访问,绑定监听事件async aboutToAppear(){let result = await this.reqPermissionsFromUser(['ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION'])if(result){geoLocationManager.on('locationChange',{priority:geoLocationManager.LocationRequestPriority.ACCURACY,timeInterval:0},value=>{console.log('lucy',JSON.stringify(value))})}}//离开页面,取消监听事件aboutToDisappear(){geoLocationManager.off('locationChange')}

2.2.4、完整代码

import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';
import geoLocationManager from '@ohos.geoLocationManager';
@Entry
@Component
struct Index {@State mLatitude: string = '' // 经度@State mLongitude: string = '' // 纬度@State mAddresses: string = '' // 地址@State mCountryName: string = '' // 国家名称@State mAdministrativeArea: string = '' // 省份@State mLocality: string = '' // 地市@State mSubLocality: string = '' // 县区//进入页面授权访问,绑定监听事件async aboutToAppear(){let result = await this.reqPermissionsFromUser(['ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION'])if(result){geoLocationManager.on('locationChange',{priority:geoLocationManager.LocationRequestPriority.ACCURACY,timeInterval:0},value=>{console.log('lucy',JSON.stringify(value))})}}//离开页面,取消监听事件aboutToDisappear(){geoLocationManager.off('locationChange')}// 检测权限是否已经授权,如果未授权就弹出授权弹窗reqPermissionsFromUser(permissions: Array<Permissions>){let context = getContext(this) as common.UIAbilityContext;let atManager = abilityAccessCtrl.createAtManager();// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗return atManager.requestPermissionsFromUser(context, permissions).then((data) => {let grantStatus: Array<number> = data.authResults;let length: number = grantStatus.length;for (let i = 0; i < length; i++) {if (grantStatus[i] === 0) {// 用户授权,可以继续操作return true} else {// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限return false}}// 授权成功}).catch((err) => {console.error(`requestPermissionsFromUser failed, code is ${err.code}, message is ${err.message}`);})}build() {Column({space:10}) {Button('定位').width('100%').margin({ top: 10, bottom: 10 }).onClick(()=>{this.getLocation()})Text('【当前位置信息】').fontSize(20)Text(`经度:${this.mLatitude}`).width(260)Text(`纬度:${this.mLongitude}`).width(260)Text(`地址:${this.mAddresses}`).width(260)Text(`县区:${this.mSubLocality}`).width(260)Text(`地市:${this.mLocality}`).width(260)Text(`省份:${this.mAdministrativeArea}`).width(260)Text(`国家:${this.mCountryName}`).width(260)}.width('100%').height('100%').backgroundColor('#EAEAEA').padding(10)}//获取当前位置async getLocation(){let status = await this.reqPermissionsFromUser(['ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION'])if(status){let location = geoLocationManager.getLastLocation()console.log('lucy',JSON.stringify(location))location['locale'] = 'zh'//逆地理编码服务geoLocationManager.getAddressesFromLocation(location,(err,data: any)=>{if(!err){console.log('lucy--',JSON.stringify(data))this.mLatitude = data[0].latitudethis.mLongitude = data[0].longitude;this.mAddresses = data[0].placeNamethis.mCountryName = data[0].countryNamethis.mAdministrativeArea = data[0].administrativeAreathis.mLocality = data[0].localitythis.mSubLocality = data[0].subLocality}})}}
}

2.3、实现效果

进入页面先授权访问位置信息,然后点击定位按钮,获取当前位置信息

备注:实现效果需进行真机调试,预览器和本地模拟器实现不了此效果

最后:👏👏😊😊😊👍👍 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试下的AI之路(4)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

实时计算平台设计方案:913-基于100G光口的DSP+FPGA实时计算平台

基于100G光口的DSPFPGA实时计算平台 一、产品概述 基于以太网接口的实时数据智能计算一直应用于互联网、网络安全、大数据交换的场景。以DSPFPGA的方案&#xff0c;体现了基于硬件计算的独特性能&#xff0c;区别于X86GPU的计算方案&#xff0c;保留了高带宽特性&…

Ceph学习 - 1.存储知识

文章目录 1.存储基础1.1 基础知识1.1.1 存储基础1.1.2 存储使用 1.2 文件系统1.2.1 简介1.2.2 数据存储1.2.3 存储应用的基本方式1.2.4 文件存储 1.3 小结 1.存储基础 学习目标&#xff1a;这一节&#xff0c;我们从基础知识、文件系统、小节三个方面来学习。 1.1 基础知识 1.…

UART设计

一、UART通信简介 通用异步收发器&#xff0c; 特点&#xff1a;串行、异步、全双工通信 优点&#xff1a;通信线路简单&#xff0c;传输距离远 缺点&#xff1a;传输速度慢 数据传输速率&#xff1a;波特率&#xff08;单位&#xff1a;baud&#xff0c;波特&#xff09; …

如何高效学习Python编程语言

理解Python的应用场景 不同的编程语言有不同的发展历史和应用场景,了解Python主要应用在哪些领域对于学习它会有很大帮助。Python最初是一种通用脚本语言,主要用于系统级任务自动化。随着时间的推移,它逐步成为数据处理、科学计算、Web开发、自动化运维等众多领域的主要编程语…

Navicat设置mysql权限

新建用户&#xff1a; 注意&#xff1a;如果不生效执行刷新命令:FLUSH PRIVILEGES; 执行后再重新打开查看&#xff1b; 查询权限命令&#xff1a;1234为新建的用户名&#xff0c;localhost为访问的地址 SHOW GRANTS FOR 1234localhost;如果服务器设置服务器权限后可能会出现权…

潜伏三年,核弹级危机一触即发,亚信安全深度分析XZ Utils后门事件

2024年3月29日星期五上午8点&#xff0c;有研究人员称xz/liblzma中的后门导致SSH服务器内存泄露&#xff0c;使得SSH服务异常&#xff08;https://www.openwall.com/lists/oss-security/2024/03/29/4&#xff09;。github中“xz”压缩工具主要由Larhzu和Jia Tan共同负责维护&am…

力扣25. K 个一组翻转链表

Problem: 25. K 个一组翻转链表 文章目录 题目描述思路复杂度Code 题目描述 思路 1.创建虚拟头节点dummy并将其next指针指向head&#xff0c;创建指针pre、end均指向dummy&#xff1b; 2.编写反转单链表的函数reverse 3.当end -> next 不为空时&#xff1a; 3.1.每次k个一组…

Bigtable [OSDI‘06] 论文阅读笔记

原论文&#xff1a;Bigtable: A Distributed Storage System for Structured Data (OSDI’06) 1. Introduction Bigtable 是一种用于管理结构化数据的分布式存储系统&#xff0c;可扩展到非常大的规模&#xff1a;数千台服务器上的数据量可达 PB 级别&#xff0c;同时保证可靠…

阿里巴巴拍立淘API新功能揭秘:图片秒搜商品,实现智能化个性化购物新体验

在数字化快速发展的今天&#xff0c;智能化和个性化已经成为购物体验中不可或缺的元素。为了满足消费者日益增长的购物需求&#xff0c;阿里巴巴中国站不断推陈出新&#xff0c;其中拍立淘API的新功能——图片秒搜商品&#xff0c;无疑为智能化个性化购物体验开创了新的篇章。 …

【机器学习入门】使用YOLO模型进行物体检测

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 第6章 人工神经网络(一) 第6章 人工神经网络(二) 卷积和池化 第6章 使用pytorch进行手写数字识别 文章目录 系列文章目录前…

八股面试速成—计算机网络部分

暑期实习面试在即&#xff0c;这几天八股和算法轮扁我>_ 八股部分打算先找学习视屏跟着画下思维导图&#xff0c;然后看详细的面试知识点&#xff0c;最后刷题 其中导图包含的是常考的题&#xff0c;按照思维导图形式整理&#xff0c;会在复盘后更新 细节研究侧重补全&a…

基于单片机冬季供暖室温调节控制系统

**单片机设计介绍&#xff0c;基于单片机冬季供暖室温调节控制系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的冬季供暖室温调节控制系统是一种集温度检测、控制和显示功能于一体的智能化系统。该系统以单片机为…

C++ 指针与结构

三种存取结构成员的方式&#xff1a; ① 通过结构变量名&#xff1b; ②通过指向结构的指针和间接运算符(*)&#xff1b; ③通过指向结构的指针和指向成员运算符(->);

【已解决】ZIP压缩文件如何设置密码?

ZIP是常用的压缩格式之一&#xff0c;对于重要的ZIP文件&#xff0c;我们还可设置密码保护&#xff0c;那ZIP压缩文件怎么设置密码呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 给ZIP文件设置密码&#xff0c;我们需要用到支持ZIP格式的解压缩软件&#xff0c;比如7…

2024HW-->Wireshark攻击流量分析

在HW中&#xff0c;最离不开的&#xff0c;肯定是看监控了&#xff0c;那么就要去了解一些wireshark的基础用法以及攻击的流量&#xff01;&#xff01;&#xff01;&#xff01; 1.Wireshark的基本用法 比如人家面试官给你一段流量包&#xff0c;你要会用 1.分组详情 对于我…

UE4_如果快速做出毛玻璃效果_假景深

UE4_如果快速做出毛玻璃效果_假景深 2022-08-20 15:02 一个SpiralBlur-SceneTexture材质节点完成效果&#xff0c;启用半透明材质通过修改BlurAmount数值大小调整效果spiralBlur-SceneTexture custom节点&#xff0c;HLSL语言float3 CurColor 0;float2 BaseUV MaterialFloa…

pytest的时候输出一个F后面跟很多绿色的点解读

使用pytest来测试pyramid和kotti项目&#xff0c;在kotti项目测试的时候&#xff0c;输出一个F后面跟很多绿色的点&#xff0c;是什么意思呢&#xff1f; 原来在使用pytest进行测试时&#xff0c;输出中的“F”代表一个失败的测试&#xff08;Failed&#xff09;&#xff0c;而…

隧道风速风向检测器的工作原理

TH-SQX1隧道风速风向检测器是一种专门用于隧道内部风速和风向监测的设备。它基于超声波技术进行测量&#xff0c;通过发射和接收超声波信号&#xff0c;利用信号传输时间差来精确测量风速和风向。这种检测器具有测量准确、响应速度快、稳定性好等优点&#xff0c;适用于隧道内部…

技术再度取得优势,人工智能兴起推动需求,美芯涨价收割市场,收割中国制造?...

独家首发 ------------- 分析机构指出一季度全球存储芯片涨价了15%左右&#xff0c;而近期三星半导体预测全球存储芯片的价格还将继续上涨&#xff0c;预计二季度至少上涨两成&#xff0c;显示出美系芯片在忍受了一年多的亏损之后再度联手涨价。 2022年中国存储芯片取得了重大进…