【鸿蒙 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

相关文章

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为