当前位置: 首页 > article >正文

《仿盒马》app开发技术分享-- 原生地图展示(端云一体)

开发准备

上一节我们实现了获取当前用户的位置,并且成功的拿到了经纬度,这一节我们就要根据拿到的经纬度,结合我们其他的知识点来实现地图的展示。

功能分析

地图的展示,我们需要在管理中心先给我们对应的应用开启地图api功能,否则是不能展示的,其次是我们要配置自签,不配置的话也是无法使用地图功能,然后我们还需要注意应用是否开启了联网权限,如果这些都已经完成,那么我们在地图显示之前还需要进行权限时候获取的校验

代码实现

首先我们在进入页面之前判断是否已经开启了定位权限
bundleManager.getBundleInfoForSelf(bundleFlags).then((data) => {

    }).catch((err: BusinessError) => {hilog.error(0x0000, 'testTag', 'getBundleInfoForSelf failed. Cause: %{public}s', err.message);});

要实现这个功能我们还需要获取app的acctokenid
bundleManager.getBundleInfoForSelf(bundleFlags).then((data) => {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.checkAccessToken(data.appInfo.accessTokenId, ‘ohos.permission.LOCATION’).then((status: abilityAccessCtrl.GrantStatus) => {
if (status==0) {
this.addressSetting=true
this.locationKey=true
this.reqPermissionsFromUser(permissions);
}
}).catch((err: BusinessError) => {
console.error(checkAccessToken fail, err->${JSON.stringify(err)});
});
}).catch((err: BusinessError) => {
hilog.error(0x0000, ‘testTag’, ‘getBundleInfoForSelf failed. Cause: %{public}s’, err.message);
});
这时候我们就通过反悔的status进行判断,当status等于0,我们就执行reqPermissionsFromUser,获取当前的位置经纬度,然后在里边实现地图参数的初始化和回调

this.mapOptions = {
position: {
target: {
latitude: locationInfo.latitude,
longitude: locationInfo.longitude
},
zoom: 10
}
};
this.callback = async (err, mapController) => {
if (!err) {
this.mapController = mapController;
this.mapEventManager = this.mapController.getEventManager();
let callback = () => {
console.info(“TAG”, on-mapLoad);
}
this.mapEventManager.on(“mapLoad”, callback);
}
};
都实现之后我们再添加对应的生命周期方法
onPageShow(): void {
if (this.mapController) {
this.mapController.show();
}
}

onPageHide(): void {
if (this.mapController) {
this.mapController.hide();
}
}
到这里我们的地图展示就实现了,我们执行一下代码看看效果
在这里插入图片描述
可以看到我们的地图已经成功展示出来了,完整代码如下

import { MapComponent, mapCommon, map } from '@kit.MapKit';
import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
import PermissionDialogWidget from '../dialog/PermissionDialogWidget';
import { geoLocationManager } from '@kit.LocationKit';
import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';const permissions: Array<Permissions> = ['ohos.permission.APPROXIMATELY_LOCATION','ohos.permission.LOCATION'];
let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION;
@Entry
@Component
struct PushAddressPage {private mapOptions?: mapCommon.MapOptions;private callback?: AsyncCallback<map.MapComponentController>;private mapController?: map.MapComponentController;private mapEventManager?: map.MapEventManager;@State flag:boolean=false@State ss:number=0@State  locationKey:boolean=false@State  addressSetting:boolean=falsepermissionController:CustomDialogController=new CustomDialogController({builder:PermissionDialogWidget({titleText:"权限说明",contentText: '仿盒马想要申请位置权限,用于地址选择等功能。同意该权限后,选择地址时会复用此权限,不会重新申请,不授权上述权限,不影响APP其他功能使用。',}),alignment: DialogAlignment.Top,})@State locationInfo:geoLocationManager.ReverseGeoCodeRequest|null=nullaboutToAppear(): void {try {let locationEnabled = geoLocationManager.isLocationEnabled();if (locationEnabled) {this.addressSetting=truebundleManager.getBundleInfoForSelf(bundleFlags).then((data) => {let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();atManager.checkAccessToken(data.appInfo.accessTokenId, 'ohos.permission.LOCATION').then((status: abilityAccessCtrl.GrantStatus) => {if (status==0) {this.addressSetting=truethis.locationKey=truethis.reqPermissionsFromUser(permissions);}}).catch((err: BusinessError) => {console.error(`checkAccessToken fail, err->${JSON.stringify(err)}`);});}).catch((err: BusinessError) => {hilog.error(0x0000, 'testTag', 'getBundleInfoForSelf failed. Cause: %{public}s', err.message);});}else {this.addressSetting=false}} catch (err) {console.error("errCode:" + err.code + ", message:"  + err.message);}}build() {if (this.flag){Column() {Stack({alignContent:Alignment.Bottom}){Column(){MapComponent({ mapOptions: this.mapOptions, mapCallback: this.callback }).width('100%').height('100%');}.layoutWeight(1)if (this.addressSetting&&!this.locationKey){Row(){Text().width(40)Text("定位未开启").fontColor(Color.Black)Text("开启定位").fontColor(Color.White).backgroundColor(Color.Pink).borderRadius(10).padding(10).onClick(()=>{this.reqPermissionsFromUser(permissions);this.permissionController.open();})}.padding(10).borderRadius(5).margin({bottom:30}).backgroundColor('#33000000').justifyContent(FlexAlign.SpaceAround).width('90%')}}.backgroundColor(Color.White).height('100%').width('100%')}}}reqPermissionsFromUser(permissions: Array<Permissions>): void {let context = getContext(this) as common.UIAbilityContext;let atManager = abilityAccessCtrl.createAtManager();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) {this.locationKey=truethis.permissionController.close()let request: geoLocationManager.SingleLocationRequest = {'locatingPriority': geoLocationManager.LocatingPriority.PRIORITY_LOCATING_SPEED,'locatingTimeoutMs': 10000}try {geoLocationManager.getCurrentLocation(request).then((result) => {console.log('current location: ' + JSON.stringify(result));let locationInfo:geoLocationManager.ReverseGeoCodeRequest=result;this.mapOptions = {position: {target: {latitude: locationInfo.latitude,longitude: locationInfo.longitude},zoom: 10}};this.callback = async (err, mapController) => {if (!err) {this.mapController = mapController;this.mapEventManager = this.mapController.getEventManager();let callback = () => {console.info("TAG", `on-mapLoad`);}this.mapEventManager.on("mapLoad", callback);}};this.flag=true}).catch((error:BusinessError) => {console.error('promise, getCurrentLocation: error=' + JSON.stringify(error));});} catch (err) {console.error("errCode:" + JSON.stringify(err));}} else {this.locationKey=falsethis.permissionController.close()return;}}}).catch((err:Error) => {console.error(`requestPermissionsFromUser failed, code is ${err.name}, message is ${err.message}`);})}aboutToDisappear() {this.permissionController!=undefined// 将dialogController置空}onPageShow(): void {if (this.mapController) {this.mapController.show();}}onPageHide(): void {if (this.mapController) {this.mapController.hide();}}}

相关文章:

《仿盒马》app开发技术分享-- 原生地图展示(端云一体)

开发准备 上一节我们实现了获取当前用户的位置&#xff0c;并且成功的拿到了经纬度&#xff0c;这一节我们就要根据拿到的经纬度&#xff0c;结合我们其他的知识点来实现地图的展示。 功能分析 地图的展示&#xff0c;我们需要在管理中心先给我们对应的应用开启地图api功能&…...

Linux 操作文本文件列数据的常用命令

文章目录 Linux 操作文本文件列数据的常用命令基本列处理命令高级列处理列数据转换和排序列数据统计和分析 Linux 操作文本文件列数据的常用命令 Linux 提供了多种强大的命令来处理文本文件中的列数据&#xff0c;以下是一些最常用的命令和工具&#xff1a; 基本列处理命令 c…...

IP、子网掩码、默认网关、DNS

IP、子网掩码、默认网关、DNS 1. 概述1.1 windows配置处 2.IP 地址&#xff08;Internet Protocol Address&#xff09;2.1 公网ip2.2 内网ip2.3 &#x1f310; 公网 IP 与内网 IP 的关系&#xff08;NAT&#xff09; 3. 子网掩码&#xff08;Subnet Mask&#xff09;4. 默认网…...

华为OD机试真题——字符串加密 (2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

角度回归——八参数检测四边形Gliding Vertex

文章目录 一、介绍&#xff08;一&#xff09;五参数检测方法&#xff08; 基于角度&#xff09;&#xff08;二&#xff09;八参数检测方法&#xff08;point-based&#xff09;的边界 二、方案分析&#xff08;一&#xff09;问题定义&#xff08;二&#xff09;方案&#xf…...

JVM 高质量面试题

&#x1f4cc; 文章目录 一、JVM 内存结构与运行时模型1. JVM 内存结构分区及作用2. 栈帧结构及方法调用链维护3. 逃逸分析及其对对象分配策略的影响4. TLAB 的作用及提升对象创建效率的机制 二、垃圾回收器与 GC 调优1. CMS 与 G1 垃圾收集器的设计区别及适用场景2. Full GC 频…...

AI助力,制作视频裁剪软件

1. 视频裁剪软件套路多 最近再做一些测试&#xff0c;经常需要录屏什么的&#xff0c;有时候录制的时长视频&#xff0c;需要裁剪&#xff0c;比如去掉开头一些帧或者结尾的一些帧&#xff0c;就想保留关键点。但是网上下的一些软件&#xff0c;打开一用都是要付费的。所以想着…...

SQL注入基础

普通sql注入:后台能提供有价值的错误信息&#xff0c;显示在页面 手动注入 1. 寻找sql注入点 get注入 ?idxx url后加测试是否存在注入漏洞&#xff0c;报错则存在 post注入 把参数封装…...

使用 A2A Python SDK 实现 CurrencyAgent

谷歌官方的a2a-python SDK最近频繁的更新,我们的教程也需要跟着更新,这篇文章,我们通过 a2a-python sdk的 0.2.3 版本,实现一个简单的CurrencyAgent。 https://a2aprotocol.ai/blog/a2a-sdk-currency-agent-tutorial-zh 目录 源码准备详细过程 创建项目创建虚拟环境添加依…...

qt浏览文件支持惯性

#include <QApplication> #include <QListWidget> #include <QScroller> #include <QScrollerProperties>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建列表控件并添加示例项QListWidget listWidget;for (int i 0; i <…...

Python类的力量:第六篇:设计模式——Python面向对象编程的“架构蓝图”

文章目录 前言&#xff1a;从“代码堆砌”到“模式复用”的思维跃迁 一、创建型模式&#xff1a;对象创建的“智能工厂”1. 单例模式&#xff08;Singleton&#xff09;&#xff1a;全局唯一的“资源管家”2. 工厂模式&#xff08;Factory&#xff09;&#xff1a;对象创建的“…...

[实战]用户系统-2-完善登录和校验以及VIP

这里写目录标题 完善登录和校验新建lib-auth创建配置引入配置和JWT完善登录基本登录单点登录多点登录校验和拦截编写守卫编写装饰器使用完善VIP修改mysql模型编写vip守卫代码进度完善登录和校验 之前我们模拟过用户的登录,本节将实现token的生成,校验,redis做黑名单。我们需…...

负载均衡笔记

并发数—同时服务的调用方的数量 吞吐量—单位时间内&#xff0c;能接受和返回的数据请求量 TPS。 Transaction事务 QPS。Query 请求/查询 优化点&#xff1a; 减少并发数—防止并非过高 低级—限流—可用的用户少了&#xff1f;&#xff01; 多开几个口—分流 DNS 解析域…...

印度语言指令驱动的无人机导航!UAV-VLN:端到端视觉语言导航助力无人机自主飞行

作者&#xff1a;Pranav Saxena, Nishant Raghuvanshi and Neena Goveas单位&#xff1a;比尔拉理工学院&#xff08;戈瓦校区&#xff09;论文标题&#xff1a;UAV-VLN: End-to-End Vision Language guided Navigation for UAVs论文链接&#xff1a;https://arxiv.org/pdf/250…...

mysql都有哪些锁?

MySQL中的锁机制是确保数据库并发操作正确性和一致性的重要组成部分&#xff0c;根据锁的粒度、用途和特性&#xff0c;可以分为多种类型。以下是MySQL中常见的锁及其详细说明&#xff1a; 一、按锁的粒度划分 行级锁&#xff08;Row-level Locks&#xff09; 描述&#xff1a;…...

解锁未来AI:使用DACA模式和Agentic技术提高开发效率

学习Agentic AI:Dapr Agentic Cloud Ascent (DACA)设计模式的应用与演进 背景介绍 近年来,Agentic AI(代理型人工智能)的概念在学术界和产业界掀起了一阵热潮。Agentic AI指的是能够自主感知、决策和行动的智能体系统,它们不仅改变了我们与技术互动的方式,也为行业发展…...

HarmonyOS NEXT 使用 relationalStore 实现数据库操作

大家好&#xff0c;我是V哥。在 HarmonyOS NEXT 开发中&#xff0c;如何操作数据库&#xff0c;V 哥在测试中总结了以下学习代码&#xff0c;分享给你&#xff0c;如何想要系统学习鸿蒙开发&#xff0c;可以了解一下 V 哥最近刚刚上架出版的 《HarmonyOS 鸿蒙开发之路 卷2 从入…...

R语言学习--Day04--数据分析技巧

在清洗完数据&#xff0c;在对数据分析前&#xff0c;我们要懂得先梳理一下我们的逻辑&#xff0c;即数据是什么形式的&#xff0c;要进行哪种分析&#xff0c;有可能呈现什么特点&#xff0c;进而再想怎么处理数据去画图可以最大程度地凸显我们要的特点。 一般来讲&#xff0…...

SRS流媒体服务器之RTC播放环境搭建

环境概述 srs版本 commit 44f0c36b61bc7c3a1d51cb60be0ec184c840f09d Author: winlin <winlinvip.126.com> Date: Wed Aug 2 10:34:41 2023 0800Release v4.0-r5, 4.0 release5, v4.0.271, 145574 lines. rtc.conf # WebRTC streaming config for SRS. # see full.…...

Android 性能优化入门(三)—— ANR 问题分析

需要清楚 ANR 的概念、类型、如何产生以及如何定位分析。 1、概述 1.1 ANR 的概念 ANR&#xff08;Application Not Responding&#xff09;应用程序无响应。如果你应用程序在主线程被阻塞太长时间&#xff0c;就会出现 ANR&#xff0c;通常出现 ANR&#xff0c;系统会弹出一…...

用HTML5实现实时ASCII艺术摄像头

用HTML5实现实时ASCII艺术摄像头 项目简介 这是一个将摄像头画面实时转换为ASCII字符艺术的Web应用&#xff0c;基于HTML5和原生JavaScript实现。通过本项目可以学习到&#xff1a; 浏览器摄像头API的使用Canvas图像处理技术实时视频流处理复杂DOM操作性能优化技巧 功能亮点…...

鸿蒙Flutter实战:22-混合开发详解-2-Har包模式引入

以 Har 包的方式加载到 HarmonyOS 工程 创建工作 创建一个根目录 mkdir ohos_flutter_module_demo这个目录用于存放 flutter 项目和鸿蒙项目。 创建 Flutter 模块 首先创建一个 Flutter 模块&#xff0c;我们选择与 ohos_app 项目同级目录 flutter create --templatemodu…...

游戏引擎学习第302天:使用精灵边界进行排序

在 game_render_group.cpp 中&#xff1a;正确计算 GetBoundFor() 里的 SpriteBound 值 我们正在进行游戏的排序问题调试。虽然这是一个二维游戏&#xff0c;但包含一些三维元素&#xff0c;因此排序变得比较复杂和棘手。混合二维和三维元素时&#xff0c;需要依赖一些比较主观…...

SpringBoot+MyBatis

切换数据库连接词 引入数据库连接词的依赖&#xff0c;配置数据库连接池的类型&#xff1b; 编写测试类&#xff1a; package org.example.threelayerdecouplingdomeapplication2;import org.example.threelayerdecouplingdomeapplication2.mapper.UserMapper; import org.ex…...

wireshark: Display Filter Reference

https://www.wireshark.org/docs/dfref/// 这个里面的扩展功能还是很强大&#xff0c;可以帮着问题分析。支持大量的自定义化的字段读取功能&#xff0c;支持很多的协议。 https://www.wireshark.org/docs/dfref///f/frame.html frame.time_delta Time delta from previous ca…...

Java基础 Day19

一、泛型&#xff08;JDK5引入&#xff09; 1、基本概念 在编译阶段约束操作的数据类型&#xff0c;并进行检查 好处&#xff1a;统一数据类型&#xff0c;将运行期的错误提升到了编译期 泛型的默认类型是 Object 2、泛型类 在创建类的时候写上泛型 在创建具体对象的时候…...

VMware+Windows 11 跳过安装阶段微软账号登录

OOBE 阶段 来到这里 断开网络适配器 VMware右下角&#xff0c;点击网络适配器&#xff0c;断开连接 同时按下 Shift 和 F10 &#xff0c;打开命令提示符(cmd.exe) 输入 oobe\BypassNRO.cmd 并回车 接下来正常进行即可...

HarmonyOS开发-应用间跳转

1. HarmonyOS开发-应用间跳转 在鸿蒙中,我们再开发过程当中或多或少都会遇见想要从一个App的页面跳转至另一个App的页面,这个时候我们要怎么进行跳转呢,其实在HarmonyOS开发者文档中只需要用到Want对象和startAbility()方法进行跳转就可以了。 1.1. 实现 (1)我们要先准备两个…...

网工每日一练

2025/5/22.每日一练&#xff08;单选题&#xff09; 路由器在查找路由表时存在最长匹配原则&#xff0c;这里的长度指的是以下哪个参数&#xff1f; A. NextHopIP地址的大小 B. 路由协议的优先级 C. Cost D. 掩码的长度 路由器在查找路由表时遵循的最长匹配原则中&#xff0c;“…...

使用 Navicat 17 for PostgreSQL 时,请问哪个版本支持 PostgreSQL 的 20150623 版本?还是每个版本都支持?

&#x1f9d1;‍&#x1f4bb; PostgreSQL 用户 使用 Navicat 17 for PostgreSQL 时&#xff0c;请问哪个版本支持 PostgreSQL 的 20150623 版本&#xff1f;还是每个版本都支持&#xff1f; &#x1f9d1;‍&#x1f527; 官方技术中心 Navicat Premium 17 和 Navicat for P…...