【高德地图】Android搭建3D高德地图详细教

📖Android搭建3D高德地图详细教程

    • 📖第1章 高德地图介绍
      • ✅了解高德地图
      • ✅2D地图与3D地图
    • 📖第2章 搭建3D地图并显示
      • ✅第 1 步:创建 Android 项目
      • ✅第 2 步:获取高德Key
      • ✅第 3 步:下载地图SDK
      • ✅第 4 步:添加地图 SDK
        • 🚩通过拷贝添加SDK开发包
        • 🚩通过Gradle集成SDK
      • ✅第 5 步:项目添加Key
      • ✅第 6 步:项目配置权限
      • ✅第 7 步:显示地图

📖第1章 高德地图介绍

✅了解高德地图

高德地图是一款由中国高德软件开发的地图应用程序,提供了包括地图、导航、公交、步行、骑行、出行、地理编码、逆地理编码、地图搜索、路径规划、天气预报、地图 SDK 等多种功能。

其中,Android 地图 SDK 是一套地图开发调用接口,开发者可以轻松地在自己的 Android 应用中加入地图相关的功能,包括:地图显示(含室内、室外地图)、与地图交互、在地图上绘制、兴趣点搜索、地理编码、离线地图等功能。

高德地图开放平台:https://lbs.amap.com/

image-20231205214240294

接下来的Android高德地图实战会经常参考官网中Android平台的高德地图相关文档。

image-20231205214437595

✅2D地图与3D地图

2D地图和3D地图是两种不同类型的地图呈现方式

  • 2D 地图(二维地图): 以平面方式呈现地理信息,通常包括经度和纬度坐标。这类地图是平面的,类似于传统的纸质地图,其中只有 x 和 y 轴。

  • 3D 地图(三维地图): 则以三维方式呈现地理信息,通常包括经度、纬度和高度坐标。这类地图更加真实地模拟了地球表面的地形和建筑物。

在高德地图中,2D地图在2019-11-14起便停止维护了,版型停留在V6.0.0 ,而3D地图和搜索一直在维护更新中, 所以后面的案例都是围绕3D地图展开。

image-20231208003151686

3D地图截止本篇文章编写时最近一次更新在2023-08-15,版本V9.8.2 。

image-20231208003406882

📖第2章 搭建3D地图并显示

image-20231229003926846

2D地图和3D地图搭建差不多,只是3D地图需要添加so库,而2D地图无需这一步骤,详细步骤参考如下:

✅第 1 步:创建 Android 项目

本篇案例使用的环境如下:

  • 编译器:Android Studio Giraffe | 2022.3.1
  • JDK:JDK11
  • Gradle插件版本7.2.1,Gradle版本7.3.3
  • SDK28,相当于android 9.0

2022.3.1的Android Studio对应的Gradle插件版本在3.2-8.1之间都可以,可以参考官网:

https://developer.android.google.cn/studio/releases/gradle-plugin?hl=zh-cn

image-20231205222707730

✅第 2 步:获取高德Key

这里默认你已经创建好了高德开发平台账号,如果没有注册,则先注册一下

**第1步:**创建新应用。进入到控制台,点击应用管理->我的应用->创建新应用

image-20231205223600785image-20231205223946843

第2步: 添加Key

image-20231205231655378

image-20231206215554779

**第3步:**获取SHA1安全码

获取SHA1安全码只需要一行命令:keytool -v -list -keystore keystore的文件路径

这行命令的本质就是使用JDK的bin目录下的keytool.exe文件来执行keytool 指令,根据keystore来生成SHA1安全码。

说明keystore 文件为 Android 签名证书文件。

注意: keystore有开发模式(debug)和发布模式(release),两种模式获取的SHA1值是不同的,发布 apk时 需要根据发布apk对应的keystore重新配置Key。而debug.keystore是在SDK的安装路径.android\下可以找到。

image-20231206221808857

所以只要有JDK环境和keystore文件即可生成SHA1安全码,下面提供两种方式:

  • Android Studio获取SHA1
  • JDK自带工具获取SHA1

🚩方式一:通过Android Studio获取SHA1

  • 打开Android StudioTerminal工具,在控制台直接输入下面命令
//1. 输入指令: 
keytool -v -list -keystore E:\software\Android\AndroidSdk\.android\debug.keystore//2. 输入密钥库口令: 默认密码是android

image-20231206232157181

🚩方式一:使用 keytool(jdk自带工具)获取SHA1(了解)

  1. win+R运行,输入cmd进入控制台:

image-20231206234027036

  1. 在弹出的控制台窗口中输入 cd .android 定位到 .android 文件夹:

image-20231206233855096

注意:

.android文件夹是在SDK安装路径,是你安装Android Studio一同安装的,如果你没有选择在其他位置,那就默认在C盘,直接使用cd .android即可,下面图片是我安装在其他位置。

**第4步:**生产key

将SHA1安全码在第二步进行输入并提交即可获取key

image-20231206234733859

提交后就能看到我们生成的调试版本key

image-20231206235030288

✅第 3 步:下载地图SDK

官网地址:https://lbs.amap.com/api/android-sdk/download/

image-20231207001758935

✅第 4 步:添加地图 SDK

🚩通过拷贝添加SDK开发包

1、添加 jar 文件:

将下载的地图 SDK 的 jar包复制到工程(此处截图以官方示例Demo为例子)的 libs 目录下,如果有老版本 jar 包在其中,请删除。如图所示:

image-20231207003956790

2、添加 so 库:

说明3D地图才需要添加so库,2D地图无需这一步骤。

保持project查看方式,以下介绍两种导入so文件的方法。

将下载文件的 armeabi 文件夹复制到 libs 目录,如果有这个目录,请将下载的 so 库复制到这个目录。

image-20231207004342554

然后打开build.gradle,找到 sourceSets 标签,在里面增加一项配置,如图所示:

image-20231207004604478

没有则添加

    sourceSets {main {jniLibs.srcDirs = ['libs']}}
🚩通过Gradle集成SDK

1、在Project的``settings.gradle中添加国内mavenjcenter`仓库地址

在2022年1月的Gradle7.1.0版本做了更新,将buildscriptallprojects的仓库配置被挪到Project下的setting.gradle里面了,所以不在build.gradle文件中配置了。

    repositories {maven { url 'https://maven.aliyun.com/repository/public/' }maven { url 'https://maven.aliyun.com/repository/google/' }maven { url 'https://maven.aliyun.com/repository/jcenter' }google()mavenCentral()gradlePluginPortal()}

image-20231207214709757

2、在主工程的build.gradle文件配置dependencies

根据项目需求添加SDK依赖。引入各个SDK功能最新版本, dependencies 配置方式如下:

SDK引入代码
3D地图compile ‘com.amap.api:3dmap:latest.integration’
2D地图compile ‘com.amap.api:map2d:latest.integration’
导航compile ‘com.amap.api:navi-3dmap:latest.integration’
搜索compile ‘com.amap.api:search:latest.integration’
定位compile ‘com.amap.api:location:latest.integration’

主工程的build.gradle文件在Project目录中位置:

dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.amap.api:3dmap:latest.integration'implementation 'com.amap.api:search:latest.integration'implementation 'com.amap.api:location:latest.integration'
}

注意:

  • 3D地图 SDK 和导航 SDK,5.0.0 版本以后全面支持多平台 so 库(armeabi、armeabi-v7a、arm64-v8a、x86、x86_64),开发者可以根据需要选择。同时还需要注意的是:如果您涉及到新旧版本更替请移除旧版本的 so 库之后替换新版本 so 库到工程中。
  • navi导航SDK 5.0.0以后版本包含了3D地图SDK,所以请不要同时引入 map3d 和 navi SDK。
  • 如果build失败提示com.amap.api:XXX:X.X.X 找不到,请确认拼写及版本号是否正确,如果访问不到jcenter可以切换为maven仓库尝试一下。
  • 依照上述方法引入 SDK 以后,不需要在libs文件夹下导入对应SDK的 so 和 jar 包,会有冲突。

✅第 5 步:项目添加Key

AndroidManifest.xmlapplication标签中配置Key:

<applicationandroid:icon="@drawable/icon"android:label="@string/app_name" ><meta-dataandroid:name="com.amap.api.v2.apikey"android:value="请输入您的用户Key"/>……
</application>

image-20231207221617001

✅第 6 步:项目配置权限

AndroidManifest.xml中配置权限:

地图SDK:

<!--允许访问网络,必选权限-->
<uses-permission android:name="android.permission.INTERNET" />  <!--允许获取粗略位置,若用GPS实现定位小蓝点功能则必选-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!--允许获取设备和运营商信息,用于问题排查和网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />    <!--允许获取网络状态,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <!--允许获取wifi网络信息,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!--允许获取wifi状态改变,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!--允许写入扩展存储,用于数据缓存,若无此权限则写到私有目录-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--允许写设备缓存,用于问题排查-->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />  <!--允许读设备等信息,用于问题排查-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

搜索SDK:

<!--允许访问网络,必选权限-->
<uses-permission android:name="android.permission.INTERNET" />  <!--允许读设备等信息,用于问题排查-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />    <!--允许获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <!--允许获取wifi网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!--允许写入扩展存储,用于搜索结果缓存,若无此权限则写到私有目录-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--允许写设备缓存,用于问题排查-->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />  <!--允许读设备等信息,用于问题排查-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

可以更具需求来添加权限配置:

image-20231207215830030

✅第 7 步:显示地图

分为三个步骤:

  • 在布局文件中添加地图控件
  • 在activity或fragment中初始化地图容器
  • 使用AMap地图控制器类来显示并操作地图
  1. activity_main.xml布局文件中添加MapView组件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"></com.amap.api.maps.MapView></LinearLayout>
  1. activity中初始化地图容器
        MapsInitializer.updatePrivacyShow(this,true,true);//隐私合规接口MapsInitializer.updatePrivacyAgree(this,true);//隐私合规接口MapView mapView = findViewById(R.id.map); //获取地图视图对象mapView.onCreate(savedInstanceState);//创建地图
  1. 获取地图对象并显示
      if (aMap == null) {aMap = mMapView.getMap();  //获取地图对象并显示}

注意:

初始化地图容器之前必须进行隐私合规接口的检查,否则可能不能正常显示map,或者地图将白屏,这是因为近几年来关于用户隐私问题越来被重视。

完整示例代码如下:

public class  MainActivity extends AppCompatActivity {private MapView mMapView  = null;//地图容器private AMap aMap;//地图对象AMap@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化地图定位initMap(savedInstanceState);  }/*** 初始化地图* @param savedInstanceState*/private void initMap(Bundle savedInstanceState) {MapsInitializer.updatePrivacyShow(this, true, true);//隐私合规接口MapsInitializer.updatePrivacyAgree(this, true);//隐私合规接口AMapLocationClient.updatePrivacyAgree(this, true);AMapLocationClient.updatePrivacyShow(this, true, true);mMapView = findViewById(R.id.map); //获取地图视图对象mMapView.onCreate(savedInstanceState);//创建地图if (aMap == null) {aMap = mMapView.getMap();}}/*** 生命周期-onDestroy*/@Overrideprotected void onDestroy() {super.onDestroy();mMapView.onDestroy(); //销毁地图}/*** 生命周期-onResume*/@Overrideprotected void onResume() {super.onResume();mMapView.onResume(); //重新绘制加载地图}/*** 生命周期-onPause*/@Overrideprotected void onPause() {super.onPause();mMapView.onPause();//暂停地图的绘制}/*** 生命周期-onSaveInstanceState*/@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mMapView.onSaveInstanceState(outState);//保存地图当前的状态}
}

在项目中使用地图的时候需要注意,需要合理的管理地图生命周期,这非常的重要。

image-20231207224940224


在这里插入图片描述

✅第1,2章 Android搭建3D高德地图详细教
✅第 3 章 初始化定位并显示小蓝点
✅第 4 章Android高德地图绘制标记点Marker
✅第 5 章Android高德地图控件交互详细介绍

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

发现了一个超赞的办公利器!ONLYOFFICE 文档 8.0 强势登场!

迎接 ONLYOFFICE 文档 v8.0发布后的全新升级&#xff01;现在&#xff0c;适用于 Linux、Windows 和 macOS 的免费 ONLYOFFICE 桌面应用程序更加强大&#xff01;全新的 RTL 界面、本地界面主题、与 Moodle 的集成等实用功能&#xff0c;让你的办公体验更加出色&#xff01;全新…

system V 共享内存

1.共享内存的原理 要理解共享内存的原理&#xff0c;首先我们得记起进程间通信的前提&#xff1a;必须让不同的进程看到同一份资源&#xff08;必须由OS提供&#xff09; 我们都知道进程都会有自己的进程地址空间&#xff0c;然后都会通过页表与物理内存进行映射&#xff0c;…

springboot214基于springboot的多媒体素材库的开发与应用

多媒体素材库的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定多媒体素材库的总体功…

vue源码分析之nextTick源码分析-逐行逐析-错误分析

nextTick的使用背景 在vue项目中&#xff0c;经常会使用到nextTick这个api&#xff0c;一直在猜想其是怎么实现的&#xff0c;今天有幸研读了下&#xff0c;虽然源码又些许问题&#xff0c;但仍值得借鉴 核心源码解析 判断当前环境使用最合适的API并保存函数 promise 判断…

SD-WAN组网:打造跨国企业无缝网络连接体验

在数字化转型的时代&#xff0c;越来越多的企业迈向国际化&#xff0c;然而&#xff0c;由于自建网络架构的限制和跨域网络的复杂性&#xff0c;企业在不同地理位置的站点之间难以实现高效的数据互通和协作。这就是为什么SD-WAN成为跨国企业组网的理想选择的原因。 跨国企业常见…

你真的了解nsight compute中的Roofline Charts吗?

此文章是之前看nsight-compute官网的时候做的笔记。因为这个记笔记的时候使用的文档记录下来会更直观好看&#xff0c;所以本次的笔记采用了截图的方式。中英文是方便沟通记忆&#xff0c;概念对齐。

HashMap 源码学习-jdk1.8

1、一些常量的定义 这里针对MIN_TREEIFY_CAPACITY 这个值进行解释一下。 java8里面&#xff0c;HashMap 的数据结构是数组 &#xff08;链表或者红黑树&#xff09;&#xff0c;每个数组节点下可能会存在链表和红黑树之间的转换&#xff0c;当同一个索引下面的节点超过8个时…

网安播报 | AI生成代码对组织和软件供应链构成了重大风险

1、AI生成代码对组织和软件供应链构成了重大风险 根据Veracode最新发布的软件安全报告&#xff0c;42%的应用程序和71%的组织中普遍存在软件安全债务&#xff0c;而AI生成代码的激增将导致安全债务问题恶化并对软件供应链构成重大风险。更令人担忧的是&#xff0c;46%的组织持续…

短视频新媒体的福音:视频抽插帧AI效率是人工的100倍以上

进入全民短视频时代&#xff0c;人像视频的拍摄也正在迈向专业化。随着固化审美的瓦解&#xff0c;十级磨皮的网红滤镜被打破&#xff0c;多元化的高级质感成为新的风向标&#xff0c;“美”到每一帧是人们对动态视频提出的更高要求。 目前&#xff0c;大部分手机均可记录主流的…

ABB触摸屏维修工控机显示屏维修CP405 A1/A0

ABB人机界面维修常见故障&#xff1a;黑屏白屏花屏&#xff0c;按触摸屏无反应或反应慢触摸不好&#xff0c;内容错乱&#xff0c;进不了系统界面&#xff0c;无背光背光暗&#xff0c;有背光无字符&#xff0c;不能通信&#xff0c;按键无无反应等均可维修。 此维修检测方法有…

信号信号槽

三、信号槽 概念 信号和槽是两种函数&#xff0c;这是Qt在C基础上新增的特性&#xff0c;类似于其他技术中的回调的概念。 信号槽通过程序员提前设定的“约定”&#xff0c;可以实现对象之间的通信&#xff0c;有两个先决条件。 通信的对象都是在QOBject类中派生出来的。 QOBje…

springboot212球队训练信息管理系统

球队训练信息管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装球队训练信息管理系统软件…

代理IP为什么会有延迟?

在当今信息高速发展的时代&#xff0c;随着代理IP在数据采集、网络安全和匿名浏览等领域的应用&#xff0c;已成为网络技术中不可或缺的一环。然而&#xff0c;用户在使用代理IP时经常会遇到一个问题——延迟。 那我们要如何解决这个问题呢&#xff1f; 这需要从代理IP的原理说…

第七章 正则表达式

目录 1.1. 概念&#xff1a; 1.2. 基本正则表达式 1.2.1. 常见元字符 1.2.2. POSIX字符类 1.2.3. 示例 1.3. 扩展正则表达式 1.3.1. 概念 1.3.2. 示例 1.1. 概念&#xff1a; 在进行程序设计的过程中&#xff0c;用户会不可避免地遇到处理某些文本的情况。有的时候&am…

android 15

https://android-developers.googleblog.com/2024/02/first-developer-preview-android15.html android 15的预览版出了&#xff0c;这个版本的发布计划大概是这样的&#xff08;大约是今年8月发布最终版本&#xff09; https://developer.android.com/about/versions/15/over…

Day34 线程Thread

文章目录 1.什么是线程1.1 概念1.2 进程和线程的区别1.3 线程资源 2.函数接口2.1 创建线程 : pthread_create2.2 退出线程: pthread_exit2.3 回收线程资源 1.什么是线程 1.1 概念 线程是一个轻量级的进程&#xff0c;为了提高系统的性能引入线程。 在同一个进程中可以创建的多…

【YOLO v5 小目标改进】SPD-Conv

SPD-Conv 提出背景SPD-Conv YOLO v5 小目标改进定义 SPD-Conv导入SpaceToDepth模块修改 .yaml 文件 提出背景 论文&#xff1a;https://arxiv.org/pdf/2208.03641v1.pdf 代码&#xff1a;https://github.com/labsaint/spd-conv 文章提出一个新的卷积神经网络(CNN)构建块&…

echarts多y轴样式重叠问题

1、主要属性设置 yAxis: [{//y轴1nameTextStyle: {align: "right",padding: 0}},{//y轴2nameTextStyle: {align: "left",padding: 0}},{//y轴3axisLabel: {margin: 50},nameTextStyle: {align: "left",padding: [0, 0, 0, 50]},axisPointer: {l…

二轮充电桩协议商用通讯协议

文章目录 一、基础通信协议框架二、命令的定义各数据单位定义&#xff1a; 三、设备上传3.0.1、设备心跳包&#xff08;01 指令&#xff09;3.0.2、设备注册包&#xff08;20 指令&#xff09;3.0.3、设备获取服务器时间&#xff08;22 指令&#xff09;3.1、设备心跳包&#x…

基于springboot+vue的靓车汽车销售网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…