【HarmonyOS学习】定位相关知识(Locationkit)

简介

LocationKit提供了定位服务、地理围栏、地理编码、逆地理编码和国家码等功能。

可以实现点击获取用户位置信息、持续获取位置信息和区域进出监控等多项功能。

需要注意,需要确定用户已经开启定位信息,一下的代码没有做这一步的操作,默认开启了。

权限

申请位置权限的方式位置的精确度
只申请ohos.permission.APPROXIMATELY_LOCATION获取到模糊位置,精确度为5公里。
同时申请ohos.permission.APPROXIMATELY_LOCATION 和ohos.permission.LOCATION获取到精准位置,精准度在米级别。

如果应用需要在后台运行时访问设备位置,还需要申请ohos.permission.LOCATION_IN_BACKGROUND权限。

这里强烈推荐大家去使用 旺旺崔冰冰 大佬的工具库(ef-tool)以下的权限获取代码来自大佬的工具库权限相关的代码。

import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import { bundleManager, common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';export class AuthUtil {/*** 判断是否授权* @param permissions  待判断的权限* @returns 已授权true,未授权false*/static async checkPermissions(permissions: Permissions): Promise<boolean> {//判断是否授权let grantStatus: abilityAccessCtrl.GrantStatus = await AuthUtil.checkAccessToken(permissions);if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {//已经授权return true;} else {//未授权return false;}}/*** 发起授权* @param permissions  需要授权的权限* @param callBack  授权成功后的回调,1为用户同意授权,-1为用户拒绝授权* @returns*/static async reqPermissionsFromUser(permissions: Permissions, callBack: (index: number) => void): Promise<void> {let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗let request = await atManager.requestPermissionsFromUser(getContext() as common.UIAbilityContext, [permissions]);let grantStatus: Array<number> = request.authResults;let length: number = grantStatus.length;for (let i = 0; i < length; i++) {if (grantStatus[i] === 0) {// 用户授权,可以继续访问目标操作callBack(1);} else {callBack(-1);// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限return;}}}/*** 发起授权 以Promise方式返回* @param permissions 需要授权的权限* @returns 1表示授权成功继续业务操作,-1表示用户拒绝授权*/static async reqPermissions(permissions: Permissions): Promise<number> {let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗let request = await atManager.requestPermissionsFromUser(getContext() as common.UIAbilityContext, [permissions]);let grantStatus: Array<number> = request.authResults;let length: number = grantStatus.length;for (let i = 0; i < length; i++) {if (grantStatus[i] === 0) {// 用户授权,可以继续访问目标操作return 1;} else {// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限return -1;}}return -1;}/*** 检查是否授权* @param permission 待检查权限* @returns 授权状态*/private static async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;// 获取应用程序的accessTokenIDlet tokenId: number = 0;try {let bundleInfo: bundleManager.BundleInfo =await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;tokenId = appInfo.accessTokenId;} catch (error) {const err: BusinessError = error as BusinessError;console.log('获取应用绑定包信息失败:原因为:' + err.message)}// 校验应用是否被授予权限try {grantStatus = await atManager.checkAccessToken(tokenId, permission);} catch (error) {const err: BusinessError = error as BusinessError;console.log('校验授权信息失败:原因为:' + err.message)}return grantStatus;}
}

定位信息Location参数

在这里插入图片描述

单次获取设备定位信息

有两种方式,分别是获取系统缓存的最新位置和获取当前位置。

获取缓存的位置,可以减少系统功耗。如果对时间精度要求较高,直接获取当前位置较好。

以下是完整的代码

import { geoLocationManager } from '@kit.LocationKit';
import { BusinessError } from '@kit.BasicServicesKit'
import json from '@ohos.util.json';
import { AuthUtil } from '../Util/AuthUtil';
import { Permissions } from '@kit.AbilityKit';@Entry
@Component
struct Index {locationPermissions: Permissions = 'ohos.permission.LOCATION'locationMatelyPermissions: Permissions = 'ohos.permission.APPROXIMATELY_LOCATION'async aboutToAppear(): Promise<void> {let permissionResult = await this.CheckPermission();if (!permissionResult) {//这里需要指引用户二次开启return;}}/*** 查看缓存中的位置*/GetLastLocation() {//查看系统缓存的最新位置let location = geoLocationManager.getLastLocation();console.log(json.stringify(location))}/*** 查看当前最新位置**locatingPriority 有两个相关标签*  1.geoLocationManager.LocatingPriority.PRIORITY_LOCATING_SPEED ->如果对定位速度要求较高建议使用这个*  2.geoLocationManager.LocatingPriority.PRIORITY_ACCURACY ->如果对位置的返回精度要求较高使用这个* locatingTimeoutMs 单次定位时间,建议10S*/GetSingleLocation() {let request: geoLocationManager.SingleLocationRequest = {'locatingPriority': geoLocationManager.LocatingPriority.PRIORITY_LOCATING_SPEED,'locatingTimeoutMs': 10000}try {geoLocationManager.getCurrentLocation(request).then((result) => { // 调用getCurrentLocation获取当前设备位置,通过promise接收上报的位置console.log('current location: ' + JSON.stringify(result));}).catch((error: BusinessError) => { // 接收上报的错误码console.error('promise, getCurrentLocation: error=' + JSON.stringify(error));});} catch (err) {console.error("errCode:" + JSON.stringify(err));}}build() {Column() {Button("查看系统中缓存的最新位置").width(220).height(50).margin({ bottom: 40 }).onClick(() => this.GetLastLocation())Button("查看最新位置").width(220).height(50).margin({ bottom: 40 }).onClick(() => {this.GetSingleLocation()})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}/*** 检查定位权限是否添加* @returns true为已经添加,false为未添加*/private async CheckPermission(): Promise<boolean> {let result: boolean = true;let locationPermissionCheck = await AuthUtil.checkPermissions(this.locationPermissions)if (!locationPermissionCheck) {AuthUtil.reqPermissionsFromUser(this.locationPermissions, (index: number) => {if (index === -1) {result = false;}})}if (!result) {return result;}let locationMatelyPermissionCheck = await AuthUtil.checkPermissions(this.locationMatelyPermissions)if (!locationMatelyPermissionCheck) {AuthUtil.reqPermissionsFromUser(this.locationMatelyPermissions, (index: number) => {if (index === -1) {result = false;}})}return result;}
}

持续获取设备定位信息

import { geoLocationManager } from '@kit.LocationKit';
import { BusinessError } from '@kit.BasicServicesKit'
import json from '@ohos.util.json';
import { AuthUtil } from '../Util/AuthUtil';
import { Permissions } from '@kit.AbilityKit';@Entry
@Component
struct Index {locationPermissions: Permissions = 'ohos.permission.LOCATION'locationMatelyPermissions: Permissions = 'ohos.permission.APPROXIMATELY_LOCATION'async aboutToAppear(): Promise<void> {let permissionResult = await this.CheckPermission();if (!permissionResult) {//这里需要指引用户二次开启return;}}/*** 持续定位(ContinuousLocationRequest对象)** interval-> 上报位置信息的时间间隔,单位是秒** locationScenario ->用户活动场景枚举* 1. NAVIGATION:导航场景。需要高定位精度和实时性能。* 2. SPORT:运动场景。要求高定位精度。* 3. TRANSPORT:运输场景。需要高定位精度和实时性能。* 4. TRANSPORT:运输场景。需要高定位精度和实时性能。* 5. DAILY_LIFE_SERVICE:日常生活场景。定位精度要求低。*/OpenContinuosLocation() {let request: geoLocationManager.ContinuousLocationRequest = {'interval': 1,'locationScenario': geoLocationManager.UserActivityScenario.NAVIGATION}let locationCallback = (location: geoLocationManager.Location): void => {console.log('定位信息: ' + JSON.stringify(location));};try {geoLocationManager.on('locationChange', request, locationCallback);} catch (err) {console.error("errCode:" + JSON.stringify(err));}}/*** 关闭持续定位*/ClosedContinuosLocation() {geoLocationManager.off('locationChange', (loca: geoLocationManager.Location) => {console.log("持续定位关闭");console.log("最后一次定位" + json.stringify(loca));})}build() {Column() {Button("开启持续定位").width(220).height(50).margin({ bottom: 40 }).onClick(() => {this.OpenContinuosLocation()})Button("关闭持续定位").width(220).height(50).margin({ bottom: 40 }).onClick(() => {this.ClosedContinuosLocation()})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}/*** 检查定位权限是否添加* @returns true为已经添加,false为未添加*/private async CheckPermission(): Promise<boolean> {let result: boolean = true;let locationPermissionCheck = await AuthUtil.checkPermissions(this.locationPermissions)if (!locationPermissionCheck) {AuthUtil.reqPermissionsFromUser(this.locationPermissions, (index: number) => {if (index === -1) {result = false;}})}if (!result) {return result;}let locationMatelyPermissionCheck = await AuthUtil.checkPermissions(this.locationMatelyPermissions)if (!locationMatelyPermissionCheck) {AuthUtil.reqPermissionsFromUser(this.locationMatelyPermissions, (index: number) => {if (index === -1) {result = false;}})}return result;}
}

地理编码地址获取

两种方式:通过经纬度坐标获取和通过详细地址描述获取。

import { geoLocationManager } from '@kit.LocationKit';
import { Permissions } from '@kit.AbilityKit';
import { AuthUtil } from '../Util/AuthUtil';@Entry
@Component
struct Loaction_Page2 {locationPermissions: Permissions = 'ohos.permission.LOCATION'locationMatelyPermissions: Permissions = 'ohos.permission.APPROXIMATELY_LOCATION'async aboutToAppear(): Promise<void> {let permissionResult = await this.CheckPermission();if (!permissionResult) {//这里需要指引用户二次开启return;}this.CheckGeoService()}LocationToAddress() {this.CheckGeoService()let reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest ={"locale": "zh","country": "CN","latitude": 40.02099028,"longitude": 115.96965089,"maxItems": 1};try {geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {if (err) {console.log('getAddressesFromLocation err: ' + JSON.stringify(err));} else {console.log('getAddressesFromLocation data: ' + JSON.stringify(data));}});} catch (err) {console.error("errCode:" + JSON.stringify(err));}}LocationNameToAddress() {let geocodeRequest: geoLocationManager.GeoCodeRequest = {"description": "广东省广州市海珠区阅江西路222号(广州塔站B出口170米左右)","maxItems": 1};try {geoLocationManager.getAddressesFromLocationName(geocodeRequest, (err, data) => {if (err) {console.log('getAddressesFromLocationName err: ' + JSON.stringify(err));} else {console.log('getAddressesFromLocationName data: ' + JSON.stringify(data));}});} catch (err) {console.error("errCode:" + JSON.stringify(err));}}build() {Column() {Button("具体地址得到地理编码").width(220).height(50).margin({ bottom: 40 }).onClick(() => {this.LocationNameToAddress();})Button("具体坐标得到地理编码").width(220).height(50).margin({ bottom: 40 }).onClick(() => {this.LocationToAddress();})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}/*** 查询地理编码和逆地理编码是否可用*/private CheckGeoService(): boolean {try {let isAvailable = geoLocationManager.isGeocoderAvailable();if (isAvailable) {console.log("地理编码和逆地理编码可用")return true;} else {console.log("地理编码和逆地理编码不可用")return false;}} catch (err) {console.error("errCode:" + JSON.stringify(err));return false;}}/*** 检查定位权限是否添加* @returns true为已经添加,false为未添加*/private async CheckPermission(): Promise<boolean> {let result: boolean = true;let locationPermissionCheck = await AuthUtil.checkPermissions(this.locationPermissions)if (!locationPermissionCheck) {AuthUtil.reqPermissionsFromUser(this.locationPermissions, (index: number) => {if (index === -1) {result = false;}})}if (!result) {return result;}let locationMatelyPermissionCheck = await AuthUtil.checkPermissions(this.locationMatelyPermissions)if (!locationMatelyPermissionCheck) {AuthUtil.reqPermissionsFromUser(this.locationMatelyPermissions, (index: number) => {if (index === -1) {result = false;}})}return result;}
}

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

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

相关文章

数据分析入门指南:数据库入门(五)

本文将总结CDA认证考试中数据库中部分知识点&#xff0c;内容来源于《CDA模拟题库与备考资料PPT》 。 CDA认证&#xff0c;作为源自中国、面向全球的专业技能认证&#xff0c;覆盖金融、电信、零售、制造、能源、医疗医药、旅游、咨询等多个行业&#xff0c;旨在培养能够胜任数…

仿源码大师主界面UI的iAPP源文件

仿源码大师首页主界面的布局 首页&#xff0c;分类&#xff0c;需求&#xff0c;我的 就只有这几个界面内容而已 资源静态 没有任何动画和功能 纯UI布局 纯UI布局 他的最新版已经不是这个UI布局 放心使用 以学习参考为目的&#xff0c;如有不妥望告知 原创&#xff0c;纯…

一个非常好的美图展示网站整站打包源码,集成了wordpress和开源版ripro主题,可以完美运营。

一个非常好的美图展示网站整站打包源码&#xff0c;集成了wordpress和开源版ripro主题&#xff0c;可以完美运营。 自带了5个多g的美图资源&#xff0c;让网站内容看起来非常大气丰富&#xff0c;可以快速投入运营。 这个代码包&#xff0c;原网站已经稳定运营多年&#xff0…

Python和C++行人轨迹预推算和空间机器人多传感融合双图算法模型

&#x1f3af;要点 &#x1f3af;双图神经网络模型&#xff1a;最大后验推理和线性纠错码解码器 | &#x1f3af;重复结构和过约束问题超图推理模型 | &#x1f3af;无向图模型变量概率计算、和积消息传播图结构计算、隐马尔可夫模型图结构计算、矩阵图结构计算、图结构学习 |…

PostgreSql创建触发器并增加IF判断条件

在 PostgreSQL 中&#xff0c;可以使用触发器&#xff08;Trigger&#xff09;来在表上定义自定义的插入&#xff08;INSERT&#xff09;、更新&#xff08;UPDATE&#xff09;和删除&#xff08;DELETE&#xff09;操作的行为。触发器是与表相关联的特殊函数&#xff0c;它们在…

Linux 12:多线程2

1. 生产者消费者模型 生产者消费者模型有三种关系&#xff0c;两个角色&#xff0c;一个交易场所。 三种关系&#xff1a; 生产者之间是什么关系?竞争 - 互斥 消费者和消费者之间?竞争 - 互斥 消费者和消费者之间?互斥和同步 两个角色&#xff1a; 生产者和消费者 一个交…

【Apache POI】Java解析Excel文件并处理合并单元格-粘贴即用

同为牛马&#xff0c;点个赞吧&#xff01; 一、Excel文件样例 二、工具类源码 import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory; import org.springframework.web.multip…

mac M1 创建Mysql8.0容器

MySLQ8.0 拉取m1镜像 docker pull mysql:8.0创建挂载文件夹并且赋予权限 sudo chmod 777 /Users/zhao/software/dockerLocalData/mysql 创建容器并且挂载 docker run --name mysql_8 \-e MYSQL_ROOT_PASSWORDadmin \-v /Users/zhao/software/dockerLocalData/mysql/:/var/l…

利用patch-package补丁,解决H5预览PDF时电子签章不显示问题

利用patch-package补丁&#xff0c;解决H5预览PDF时电子签章不显示问题 一、问题描述 在生产环境中&#xff0c;遇到了一个紧急的技术问题&#xff1a;用户在移动端H5页面上查看电子票时&#xff0c;PDF文件预览功能正常&#xff0c;但其中的电子签章未能正常显示。这一问题直…

C++ AVL树

目录 ​编辑 0.前言 1.AVL树的概念 1.1 平衡因子 1.2 AVL树的性质 2.AVL树节点的定义 3.AVL树的插入 4.AVL树的旋转 4.1 左单旋&#xff08;LL旋转&#xff09; 4.2 右单旋&#xff08;RR旋转&#xff09; 4.3 右左旋&#xff08;RL旋转&#xff09; 4.4 左右旋&…

集群架构-web服务器(接入负载均衡+数据库+会话保持redis)--15454核心配置详解

紧接着前面的集群架构深化—中小型公司&#xff08;拓展到大型公司业务&#xff09;–下面图简单回顾一下之前做的及故障核心知识总结&#xff08;等后期完全整理后&#xff0c;上传资源希望能帮大家&#xff09; web集群架构-接入负载均衡部署web02服务器等 web集群-搭建web0…

介绍 Elasticsearch 中的 Learning to Tank - 学习排名

作者&#xff1a;来自 Elastic Aurlien Foucret 从 Elasticsearch 8.13 开始&#xff0c;我们提供了原生集成到 Elasticsearch 中的学习排名 (learning to rank - LTR) 实现。LTR 使用经过训练的机器学习 (ML) 模型为你的搜索引擎构建排名功能。通常&#xff0c;该模型用作第二…

postman接口测试实战篇

击杀小游戏接口测试 接口测试简单介绍击杀小游戏代码下载单接口测试(postman)接口关联并参数化接口测试简单介绍 首先思考两个问题:1.接口是什么?2.接口测试是什么? 1.我们总是把接口想的很复杂,其实呢,它就是一个有特定输入和输出参数的交互逻辑处理单元,它不需要知…

通过 EMR Serverless Spark 提交 PySpark 流任务

在大数据快速发展的时代&#xff0c;流式处理技术对于实时数据分析至关重要。EMR Serverless Spark提供了一个强大而可扩展的平台&#xff0c;它不仅简化了实时数据处理流程&#xff0c;还免去了服务器管理的烦恼&#xff0c;提升了效率。本文将指导您使用EMR Serverless Spark…

PostgreSQL使用(二)

说明&#xff1a;本文介绍PostgreSQL的DML语言&#xff1b; 插入数据 -- 1.全字段插入&#xff0c;字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入&#xff0c;字段名必须写全 insert into tb_student (id, name) values (2,…

[数据集][目标检测]导盲犬拐杖检测数据集VOC+YOLO格式4635张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4635 标注数量(xml文件个数)&#xff1a;4635 标注数量(txt文件个数)&#xff1a;4635 标注…

graham 算法计算平面投影点集的凸包

文章目录 向量的内积&#xff08;点乘&#xff09;、外积&#xff08;叉乘&#xff09;确定旋转方向numpy 的 cross 和 outernp.inner 向量与矩阵计算示例np.outer 向量与矩阵计算示例 python 示例生成样例散点数据图显示按极角排序的结果根据排序点计算向量转向并连成凸包 基本…

Linux云计算 |【第一阶段】ENGINEER-DAY3

主要内容&#xff1a; LVM逻辑卷管理、VDO、RAID磁盘阵列、进程管理 一、新建逻辑卷 1、什么是逻辑卷 逻辑卷&#xff08;Logical Volume&#xff09;是逻辑卷管理&#xff08;Logical Volume Management&#xff0c;LVM&#xff09;系统中的一个概念。LVM是一种用于磁盘管理…

C++ :友元类

友元类的概念和使用 (1)将类A声明为B中的friend class后&#xff0c;则A中所有成员函数都成为类B的友元函数了 (2)代码实战&#xff1a;友元类的定义和使用友元类是单向的 (3)友元类是单向的&#xff0c;代码实战验证 互为友元类 (1)2个类可以互为友元类&#xff0c;代码实战…

Intel和AMD用户再等等!微软确认Win11 24H2年底前登陆

微软近日确认&#xff0c;Windows 11 24H2版本将于2024年底前正式登陆使用英特尔和AMD处理器的PC。 根据微软介绍&#xff0c;Windows 11 24H2将作为传统功能更新&#xff0c;将在今年晚些时候提供给所有设备。 此前&#xff0c;微软已向搭载骁龙X Plus和X Elite系列处理器的Co…