Android Osmdroid + 天地图 (一)

Osmdroid + 天地图

  • 前言
  • 正文
    • 一、配置build.gradle
    • 二、配置AndroidManifest.xml
    • 三、获取天地图的API Key
      • ① 获取开发版SHA1
      • ② 获取发布版SHA1
    • 四、请求权限
    • 五、显示地图
    • 六、源码

前言

  Osmdroid是一款完全开源的地图基本操作SDK,我们可以通过这个SDK去加一些地图API,比如腾讯、百度、高德、Google等等。天地图API也是一个地图服务提供商,不过之前还是提供Android的地图SDK的,现在就只提供了API服务了,那么为什么我们会想到这个天地图API呢?因为贫穷,贫穷使我们相遇,如果你是个人项目不上架的那种我推荐你使用高德、百度、腾讯3家,但如果你要上架的话就涉及到一个可能会被宰的问题了,这3家商业授权都是5万一年,那不是开玩笑的,如果你的应用不是主导地图的话,完全犯不上去使用,下面我们进入正文去使用天地图API,效果图如下所示:

在这里插入图片描述

正文

  点击天地图API进入,之后完成注册登录及个人或企业开发者的认证工作,然后就到了喜闻乐见的创建Android项目的环节了。

一、配置build.gradle

在这里插入图片描述

这里我们就使用Empty Views Activity的模板,点击Next。

在这里插入图片描述

  修改一下项目名和包名,这个包名在下面的获取API Key要用到的,注意这里的构建配置语言也是Kotlin的,如果你不习惯,请改成Groovy,然后运行能看到Hello World!即可。

因为我们需要使用OsmdroidSDK库,所以我们现在app模块下的build.gradle.kts文件中导入如下代码:

	implementation("org.osmdroid:osmdroid-android:6.1.20")

这个库在mavenCentral()下,然后再配置viewBinding,代码如下所示:

    buildFeatures {viewBinding = true}

上述代码配置如下图所示:

在这里插入图片描述

二、配置AndroidManifest.xml

  因为用到地图自然就涉及到定位,还有API的使用就涉及到网络,而网络从Android8.0之后就默认是https请求方式,如果需要http的话则配置一下,针对上述的3个要求,我们首先配置一下权限,在AndroidManifest.xml中增加如下代码:

	<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

然后在res下的xml目录下创建一个network_security_config.xml文件里面代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config><base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" /></trust-anchors></base-config>
</network-security-config>

这个文件的配置内容就是允许http访问,我们需要在AndroidManifest.xml中的application标签中进行配置,如下所示:

	android:networkSecurityConfig="@xml/network_security_config"

上述的配置如下图所示:

在这里插入图片描述

三、获取天地图的API Key

相信你已经完成了我前面讲到的工作了,那么进入控制台,点击创建新应用。

在这里插入图片描述

可以看到这里我们需要发布版SHA1、开发版SHA1包名,包名我们创建项目的时候就有了。

① 获取开发版SHA1

首先我们来说明一下开发版SHA1的获取方式,刚才我们运行过了,下面使用快捷键Win+R,输入cmd,进入命令窗口,输入

cd .android

回车,然后输入

keytool -list -v -keystore debug.keystore

回车,会让你输入密码,密码就是android,输入后回车就看到一大串信息,其中就有我们SHA1,注意我们使用的是debug.keystore,所以得到的就是开发版SHA1,这个值在不同的电脑上就不一样,请注意。

在这里插入图片描述

复制一下粘贴过去即可。

② 获取发布版SHA1

下面来获取发布版SHA1,这个稍微麻烦一点,我们需要先生成一个APK。

在这里插入图片描述

点击Build➡️Generate Signed App Bundle/ APK...

在这里插入图片描述
这里选择APK,点击Next。

在这里插入图片描述

点击Create new...

在这里插入图片描述

  可以参考我这个方式去设置,这里我的两个密码都是一样的,你可以不一样,前提是你记得住,需要注意是的这个jks文件生成的位置,我是直接生成到项目的目录下了,点击OK

在这里插入图片描述
勾选上Remeber passwords,点击Next

在这里插入图片描述

点击Create等待生成APK。

在这里插入图片描述

当你在AS的右下角看到这个弹窗时,表示生成APK成功了,切换到Project模式查看一下,如下图所示:

在这里插入图片描述

  下面就是正式获取发布版SHA1的过程了,本来上面这一大串我是不想写的,但是又考虑到是小白的话,就还是写了,点击AS底部的Terminal,打开后默认就是当前项目的目录,然后我们只要输入

keytool -list -v -keystore .\openMap.jks

keytool -list -v -keystore后面的是你的jks的文件路径,如果你不是我这么配置的请写自己的实际路径,然后回车,输入密码再回车即可看到发布版SHA1,如下图所示:

在这里插入图片描述

下面回到天地图那个网页,此时我们已经填好了所有需要的值。

在这里插入图片描述

点击提交,就是提示创建成功,如果提示创建失败的话,你再点一次,有网络延迟的问题。创建成功就得到了我们访问天地图的Key了,如下图所示:

在这里插入图片描述

这个Key我们在项目中需要用到的,我们可以在com.llw.openmap下创建一个Config类,这里面配置这个Key,代码如下所示:

object Config {const val MAP_KEY = "f951c7d1b85975379f6ee20bb264abba"
}

四、请求权限

进入MainActivity,增加代码如下所示:

    // 定位权限private val permissions = arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION,android.Manifest.permission.ACCESS_COARSE_LOCATION,android.Manifest.permission.WRITE_EXTERNAL_STORAGE,android.Manifest.permission.READ_EXTERNAL_STORAGE)// 权限申请private val permissionLauncher =registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result ->if (!result.containsValue(false)) initMap() else requestPermission()}

首先我们定义了定位权限和权限请求返回,使用ActivityResult API的方式,然后我们需要写initMap()checkPermission()函数,代码如下所示:

    /*** 初始化地图*/private fun initMap() {}/*** 检查权限*/private fun checkPermission() {permissions.forEach { permission ->if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {// 请求权限requestPermission()return}}// 初始化地图initMap()}/*** 请求权限*/private fun requestPermission() {permissionLauncher.launch(permissions)}

最后我们在onResume()生命周期中检查权限,调用checkPermission(),代码如下所示:

    override fun onResume() {super.onResume()// 检查权限checkPermission()}

目前为止整个页面代码如下图所示:

在这里插入图片描述

  为什么我要贴图呢,因为是真的有人把代码写错位置,然后问我为什么报错?现在我们运行一下,你会发现弹窗请求权限,同意之后会看到都是格子,因为我们还没有加载地图API的,这里我们就要加载天地图。

五、显示地图

要显示地图就需要用到Osmdroid了,在Config中添加如下代码:

    // 默认GeoPointval defaultGeoPoint = GeoPoint(39.909, 116.39742)/*** 天地图 有标注电子地图*/var TDTCIA_W: OnlineTileSourceBase = object : XYTileSource("Tian Di Tu CIA",0, 20, 256, "",arrayOf("http://t0.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t1.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t2.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t3.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t4.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t5.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t6.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY","http://t7.tianditu.com/DataServer?T=cia_w&tk=$MAP_KEY")) {override fun getTileURLString(pMapTileIndex: Long) =("$baseUrl&X=${MapTileIndex.getX(pMapTileIndex)}&Y=${MapTileIndex.getY(pMapTileIndex)}&L=${MapTileIndex.getZoom(pMapTileIndex)}")}

添加了一个默认的经纬度坐标,然后通过Osmdroid去加载天地图的在线瓦片资源,然后回到MainActivity,这里首先我们用上ViewBinding,代码如下所示:

    private lateinit var binding: ActivityMainBinding

然后在onCreate中配置代码,如下所示:

	binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)

位置如下图所示:

在这里插入图片描述

下面进入initMap()中去配置地图,代码如下所示:

    private fun initMap() {binding.mapView.apply {setTileSource(Config.TDTCIA_W)  // 设置瓦片地图资源minZoomLevel = 5.0              // 最小缩放级别maxZoomLevel = 20.0             // 最大缩放级别isTilesScaledToDpi = true       // 图块是否缩放到 DPI// 设置默认的地图中心点controller.apply {setZoom(12.0)setCenter(Config.defaultGeoPoint)}zoomController.setVisibility(Visibility.NEVER)setMultiTouchControls(true)overlayManager.tilesOverlay.isEnabled = true}}

下面可以运行一下,我从头开始运行一下:

在这里插入图片描述

虽然可能效果不是特别好,但是起码是个地图啊,免费的你还要什么自行车。

六、源码

如果对你有所帮助的话,不妨欢迎StarFork

源码地址:OpenMap

APK下载地址:OpenMap1.0.apk

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

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

相关文章

HTML5+CSS前端开发【保姆级教学】+新闻文章初体验

Hello&#xff0c;各位编程猿们&#xff01;上一篇文章介绍了前端以及软件的安装&#xff0c;这一篇我们要继续讲解页面更多知识点&#xff0c;教大家做一篇新闻题材的文章 新闻文章 当我们点开浏览器经常看到各种各样的文章&#xff0c;今天我们就来看看大家最喜欢关注的体育…

无人机动力系统测试-实测数据与CFD模拟仿真数据关联对比分析

我们经常被问到这样的问题&#xff1a;“我们计划运行 CFD 仿真&#xff0c;我们还需要对电机和螺旋桨进行实验测试吗&#xff1f;我们可能有偏见&#xff0c;但我们的答案始终是肯定的&#xff0c;而且有充分的理由。我们自己执行了大量的 CFD 仿真&#xff0c;但我们承认&…

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(二)

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

深度学习神经网络创新点方向

一、引言 深度学习神经网络在过去几十年里取得了令人瞩目的成就&#xff0c;从图像识别、语音处理到自然语言理解等众多领域都有广泛应用。然而&#xff0c;随着数据量的不断增长和应用场景的日益复杂&#xff0c;对神经网络的创新需求也愈发迫切。本文将探讨深度学习神经网络…

C++析构函数详解

C析构函数详解&#xff1a;对象销毁与资源清理 在 C 中&#xff0c;析构函数是与构造函数相对应的特殊成员函数&#xff0c;它在对象生命周期结束时被自动调用&#xff0c;用于执行对象销毁之前的清理操作。析构函数主要用于释放对象占用的资源&#xff0c;如动态分配的内存、打…

Minikube 上安装 Argo Workflow

文章目录 步骤 1&#xff1a;启动 Minikube 集群步骤 2&#xff1a;安装Argo Workflow步骤 3&#xff1a;访问UI创建流水线任务参考 前提条件&#xff1a; Minikube&#xff1a;确保你已经安装并启动了 Minikube。 kubectl&#xff1a;确保你已经安装并配置了 kubectl&#xff…

计算机编程中的设计模式及其在简化复杂系统设计中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的…

基于 CentOS7.6 的 Docker 下载常用的容器(MySQLRedisMongoDB),解决拉取容器镜像失败问题

安装MySQL&Redis&MongoDB mysql选择是8版本&#xff0c;redis是选择4版本、mongoDB选择最新版&#xff0c;也可以根据自己的需要进行下载对应的版本&#xff0c;无非就是容器名:版本号 这样去拉去相关的容器镜像。如果你还不会在服务器中安装 docker&#xff0c;可以查…

【分布式】万字图文解析——深入七大分布式事务解决方案

分布式事务 分布式事务是指跨多个独立服务或系统的事务管理&#xff0c;以确保这些服务中的数据变更要么全部成功&#xff0c;要么全部回滚&#xff0c;从而保证数据的一致性。在微服务架构和分布式系统中&#xff0c;由于业务逻辑往往会跨多个服务&#xff0c;传统的单体事务…

SystemVerilog学习笔记(十一):接口

在Verilog中&#xff0c;模块之间的通信是使用模块端口指定的。 Verilog模块连接的缺点 声明必须在多个模块中重复。存在声明不匹配的风险。设计规格的更改可能需要修改多个模块。 接口 SystemVerilog引入了 interface 结构&#xff0c;它封装了模块之间的通信。一个 inter…

ARM 汇编指令

blr指令的基本概念和用途 在 ARM64 汇编中&#xff0c;blr是 “Branch with Link to Register” 的缩写。它是一种分支指令&#xff0c;主要用于跳转到一个由寄存器指定的地址&#xff0c;并将返回地址保存到链接寄存器&#xff08;Link Register&#xff0c;LR&#xff09;中。…

pycharm分支提交操作

一、Pycharm拉取Git远程仓库代码 1、点击VCS > Get from Version Control 2、输入git的url&#xff0c;选择自己的项目路径 3、点击Clone&#xff0c;就拉取成功了 默认签出分支为main 选择develop签出即可进行开发工作 二、创建分支&#xff08;非必要可以不使用&#xf…

【MySQL】优化方向+表连接

目录 数据库表连接 表的关系与外键 数据库设计 规范化 反规范化 事务一致性 表优化 索引优化 表结构优化 查询优化 数据库表连接 表的关系与外键 表之间的关系 常见表关系总结 一对一关系&#xff1a;每一条记录在表A中对应表B的唯一一条记录&#xff0c;反之也是&a…

【数据库】mysql数据库迁移前应如何备份数据?

MySQL 数据库的备份是确保数据安全的重要措施之一。在进行数据库迁移之前&#xff0c;备份现有数据可以防止数据丢失或损坏。以下是一套详细的 MySQL 数据库备份步骤&#xff0c;适用于大多数情况。请注意&#xff0c;具体的命令和工具可能因 MySQL 版本的不同而有所差异。整个…

mybatis 动态SQL语句

10. 动态SQL 10.1. 介绍 什么是动态SQL&#xff1a;动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 官网描述&#xff1a;MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验&#xff0c;你就能体会到根据不同条件拼接 SQL 语句的痛苦…

shell脚本_永久环境变量和字符串操作

一、永久环境变量 1. 常见的环境变量 2. 设置永久环境变量 3.1.将脚本加进PATH变量的目录中 3.2.添加进环境变量里 3.2.修改用户的 shell 配置文件 二、字符串操作 1. 字符串拼接 2. 字符串切片 3. 字符串查找 4. 字符串替换 5. 字符串大小写转换 6. 字符串分割 7…

【Go】-bufio库解读

目录 Reader和Writer接口 bufio.Reader/Writer 小结 其他函数-Peek、fill Reader小结 Writer Scanner结构体 缓冲区对于网络数据读写的重要性 Reader和Writer接口 在net/http包生成的Conn 接口的实例中有两个方法叫做Read和Write接口 type Conn interface {Read(b []b…

场景营销在企业定制开发 AI 智能名片 S2B2C 商城小程序中的应用与价值

摘要&#xff1a;本文深入剖析了品牌广告效果不佳与场景营销缺失之间的内在联系&#xff0c;阐述了场景营销对于品牌落地和转化的关键意义。同时&#xff0c;详细探讨了如何将场景营销理念与实践应用于企业定制开发的 AI 智能名片 S2B2C 商城小程序中&#xff0c;借助移动时代的…

uniapp 实现tabbar分类导航及滚动联动效果

思路&#xff1a;使用两个scroll-view&#xff0c;tabbar分类导航使用scrollleft移动&#xff0c;内容联动使用页面滚动onPageScroll监听滚动高度 效果图 <template><view class"content" ><view :class"[isSticky ? tab-sticky: ]">…

Flutter中的Material Theme完全指南:从入门到实战

Flutter作为一款热门的跨平台开发框架&#xff0c;其UI组件库Material Design深受开发者喜爱。本文将深入探讨Flutter Material Theme的使用&#xff0c;包括如何借助Material Theme Builder创建符合产品需求的主题风格。通过多个场景和代码实例&#xff0c;让你轻松掌握这一工…