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

2024-04-07 07:52

本文主要是介绍【鸿蒙 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、实现效果

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

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

最后:👏👏😊😊😊👍👍 

这篇关于【鸿蒙 HarmonyOS】获取设备的地理位置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882038

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素。 <div id="test"><div></div><div></div

vcpkg子包路径批量获取

获取vcpkg 子包的路径,并拼接为set(CMAKE_PREFIX_PATH “拼接路径” ) import osdef find_directories_with_subdirs(root_dir):# 构建根目录下的 "packages" 文件夹路径root_packages_dir = os.path.join(root_dir, "packages")# 如果 "packages"

Weex入门教程之4,获取当前全局环境变量和配置信息(屏幕高度、宽度等)

$getConfig() 获取当前全局环境变量和配置信息。 Returns: config (object): 配置对象;bundleUrl (string): bundle 的 url;debug (boolean): 是否是调试模式;env (object): 环境对象; weexVersion (string): Weex sdk 版本;appName (string): 应用名字;

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

鸿蒙开发中实现自定义弹窗 (CustomDialog)

效果图 #思路 创建带有 @CustomDialog 修饰的组件 ,并且在组件内部定义controller: CustomDialogController 实例化CustomDialogController,加载组件,open()-> 打开对话框 , close() -> 关闭对话框 #定义弹窗 (CustomDialog)是什么? CustomDialog是自定义弹窗,可用于广告、中