OSMDroidOfflineDemo源码调试记录

文章目录

  • 源码下载
  • 环境配置
  • 尝试不同离线加载
  • 遇到的问题

尝试安卓端加载离线地图,下载了使用osmdroid的离线版项目源码,更改JDK环境、gradle环境,一顿操作下来,踉踉跄跄的把程序跑起来了,但是离线的地图一直加载不出来。给我整emo了,先记录分享出来,看有没有和我一样别的盆友,一起探讨下。
我尝试了4种办法,目前只有第4种方法,使用 OfflineTileProvider类,才加载出来

源码下载

  • 项目的地址在这里:项目地址
  • 源码说明:原项目的gradle版本2.5,gradle的构建版本是3.1.2,目标sdk版本是28
    项目比较老,构建工具比较老,原项目配置下无法完成构建,我做了修改,在环境配置节
  • 使用的osmdroid安卓库是4.3implementation 'org.osmdroid:osmdroid-android:4.3'

环境配置

主要做了三处的修改

  1. 工程的build.gradle文件中仓库替换了国内的源
maven { url 'https://maven.aliyun.com/repository/google'}
maven { url 'https://maven.aliyun.com/repository/public'}
maven { url 'https://maven.aliyun.com/repository/jcenter'}
  1. 工程的build.gradle文件中更改了gradle构建版本
dependencies {classpath 'com.android.tools.build:gradle:7.4.2'
}
  1. 修改了gradle-wrapper.properties的distributionUrl
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip

尝试不同离线加载

尝试了四个项目,第一个和第二个日志里都有okhttp网络请求的报错,都会尝试去下载瓦片。
第四个尝试,有点特殊,他用到了OfflineTileProvider类,最后一个测试成功了。

  1. 尝试1:原项目,启动成功,无法加载离线的瓦片,源码项目参考Using OSMDroid for Offline mapping in Android, step-by-step
  • 说明:没有使用Provider直接给mapView设置 mapView.setTileSource(TileSourceFactory.MAPQUESTOSM);
  1. 尝试2:另外一个项目OSMOfflineMap-Android
  • 说明:用MapTileModuleProviderBase类结合 XYTileSource类,也是运行成功,没跑起来
  1. 尝试3:参考Android使用osmdroid加载在线地图,离线地图以及各种填坑姿势
  • 说明1:MapTileModuleProviderBase类结合 自定义CustomTileSource类继承BitmapTileSourceBase类
  • 说明2:用的osmdroid版本是implementation 'org.osmdroid:osmdroid-android:6.1.11'使用kotlin写,我用Java翻译了一下,也没有加载出地图瓦片
 public void mapViewOtherData0(MapView mapView){String strFilepath = copyAssetGetFilePath("tiles.zip");File exitFile =new File(strFilepath);if(!exitFile.exists()){System.out.println("文件不存在!");}else {try{// 获取解压后的文件夹名称String source = exitFile.getName().substring(0, exitFile.getName().lastIndexOf("."));// 创建归档文件对象数组IArchiveFile[] archives = new IArchiveFile[1];archives[0] =ArchiveFileFactory.getArchiveFile(exitFile);// 创建 CustomTileSource 对象CustomTileSource customTiles = new CustomTileSource(source , 1, 13, 256, ".png");// 创建一个大小为1的 MapTileModuleProviderBase 数组MapTileModuleProviderBase[] providers = new MapTileModuleProviderBase[1];providers[0] =new MapTileFileArchiveProvider(new SimpleRegisterReceiver(this),customTiles,archives);MapTileProviderArray tileProvider = new MapTileProviderArray(customTiles,new SimpleRegisterReceiver(this),providers);TilesOverlay tilesOverlay = new TilesOverlay(tileProvider,this);tilesOverlay.setLoadingBackgroundColor(Color.TRANSPARENT);mapView.getOverlayManager().add(tilesOverlay);IMapController mapViewController = mapView.getController();mapViewController.setZoom(10);
//        mapViewController.setCenter(BERLIN);}catch (Exception e){e.printStackTrace();}}}
private String copyAssetGetFilePath(String fileName) {try {File cacheDir = getApplicationContext().getCacheDir();if (!cacheDir.exists()) {cacheDir.mkdirs();}File outFile = new File(cacheDir, fileName);if (!outFile.exists()) {boolean res = outFile.createNewFile();if (!res) {return null;}} else {if (outFile.length() > 10) {//表示已经写入一次return outFile.getPath();}}InputStream is = getApplicationContext().getAssets().open(fileName);FileOutputStream fos = new FileOutputStream(outFile);byte[] buffer = new byte[1024];int byteCount;while ((byteCount = is.read(buffer)) != -1) {fos.write(buffer, 0, byteCount);}fos.flush();is.close();fos.close();return outFile.getPath();} catch (IOException e) {e.printStackTrace();}return null;}

报错信息

E Please configure a relevant user agent; current value is: osmdroid
  1. 尝试4:android osmdroid 加载常用离线地图格式(开源的在线地图),这个博客使用的mbtiles,目前还在下载中,可用图新地球下载,也可以直接用tiles.zip,已测试
  • 说明:使用OfflineTileProvider类
public void mapViewOtherData(MapView mapView){
//        String strFilepath = Environment.getExternalStorageDirectory().getPath() + "/njmap_DarkBlue.mbtiles";String strFilepath = copyAssetGetFilePath("tiles.zip");File exitFile =new File(strFilepath);
//        File exitFile = new File(strFilepath);String fileName = "tiles.zip";if (!exitFile.exists()) {mapView.setTileSource(TileSourceFactory.MAPNIK);}else {fileName = fileName.substring(fileName.lastIndexOf(".") + 1);if (fileName.length() == 0)return;if (ArchiveFileFactory.isFileExtensionRegistered(fileName)) {try {OfflineTileProvider tileProvider = new OfflineTileProvider((IRegisterReceiver) new SimpleRegisterReceiver(this), new File[] { exitFile });mapView.setTileProvider(tileProvider);String source = "";IArchiveFile[] archives = tileProvider.getArchives();if (archives.length > 0) {Set<String> tileSources = archives[0].getTileSources();if (!tileSources.isEmpty()) {source = tileSources.iterator().next();mapView.setTileSource(FileBasedTileSource.getSource(source));} else {mapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);}} elsemapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);Toast.makeText(this,"Using " + exitFile.getAbsolutePath() + " "+ source, Toast.LENGTH_LONG).show();mapView.invalidate();return;} catch (Exception ex) {ex.printStackTrace();}Toast.makeText(this,  " did not have any files I can open! Try using MOBAC", Toast.LENGTH_LONG).show();} else{Toast.makeText(this, " dir not found!", Toast.LENGTH_LONG).show();}}}

遇到的问题

android:exported needs to be explicitly specified for element <activity#com.example.android.osmdroidofflinedemo.MainActivity>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. 

办法在此:tools:node="merge"参考

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

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

相关文章

机器人笛卡尔空间阻抗控制

机器人笛卡尔空间阻抗控制是一种重要的机器人控制策略,它关注于机器人末端执行器在笛卡尔空间(即任务空间)内的动态特性,以实现与环境的柔顺交互。以下是对机器人笛卡尔空间阻抗控制的详细解释: 一、基本概念 笛卡尔空间:指机器人末端执行器(如手爪、工具等)所处的三维…

QT基础教程(QEvent事件和事件过滤器)

文章目录 前言一、具体介绍二、具体案例1.鼠标事件2.键盘事件3.窗口事件 三、事件过滤器事件过滤器的工作原理 总结 前言 本篇文章将带大家来学习QT中的QEvent事件&#xff0c;QEvent 是 Qt 框架中的一个核心类&#xff0c;用于处理各种事件。在 Qt 的事件处理系统中&#xff…

C++学习日记 | LAB 10 运算符重载与友元函数

资料来源&#xff1a;南科大 于仕琪 C/C Program Design LINK&#xff1a;CPP/week10 at main ShiqiYu/CPP GitHub 一、本节内容 本节首先以一个例子具体演示和回顾操作符重载、友元函数以及重载<<操作符。习题部分则为各种运算符重载以及输入输出重载 1.1 Operator o…

nginx 版本升级

Nginx 的版本最开始使用的是 Nginx-1.18.0 &#xff0c; 由于服务升级&#xff0c;需要将 Nginx 的版本升级到 Nginx-1.19.7 &#xff0c;要求 Nginx 不能中断提供服务。 为了应对上述的需求&#xff0c;提供两种解决方案&#xff1a; 方案1&#xff1a; make upgrade 完成升…

包装类和泛型

&#x1f389;欢迎大家收看&#xff0c;请多多支持&#x1f339; &#x1f970;关注小哇&#xff0c;和我一起成长&#x1f680;个人主页&#x1f680; 包装类&#x1f319; Java中每个基本数据类型都对应了一个包装类&#xff0c; 除了int的包装类是Integer&#xff0c;char…

STM32项目分享:智能风扇系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.com/video/BV1xw4m1Y7sA…

详解 @RequestHeader 注解在 Spring Boot 中的使用

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

springboot鲜花商城平台-计算机毕业设计源码56085

基于微信小程序的鲜花商城平台设计与实现 摘 要 鲜花商城小程序的研究旨在设计和开发一个方便、快捷的移动应用平台&#xff0c;为用户提供鲜花购买、资讯浏览和社交互动等功能。该研究包括以下几个方面的内容&#xff1a;首先&#xff0c;通过调研和分析鲜花市场和用户需求&a…

【你也能从零基础学会网站开发】 SQL结构化查询语言应用基础--DDL篇--SQL Server数据库开发之ALTER TABLE修改表语句使用详解

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 ALTER TABLE 语…

Docker NameSpace隔离

1、dd命令&#xff1a;dd 可从标准输入或文件中读取数据&#xff0c;根据指定的格式来转换数据&#xff0c;再输出到文件、设 备或标准输出 功能&#xff1a;用于读取、转换并输出数据 语法&#xff1a;dd OPTION 参数 1、 if文件名&#xff1a;输入文件名&#xff0c;默认为…

【C++】C++的类型的转换

目录 C语言中的类型转换 C中的类型转换 C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast C语言中的类型转换 C语言中又两种类型转换&#xff1a;&#xff08;强制&#xff09;显示类型转换和隐式类型转换。 &#xff08;强制&#xff09;显示类型…

Linux系统服务——【web,http协议,apache服务和nginx服务】(sixteen day)

一、web基础以及http协议 1、web基本概念和常识 前端开发一般用uniapp. 1、Web:为用户提供的一种在互联网上浏览信息的服务&#xff0c;Web 服务是动态的、可交互的、跨平台的和图形化的。 2、Web 服务为用户提供各种互联网服务&#xff0c;这些服务包括信息浏览服务&#xf…

深入源码:解析SpotBugs (3) Detector

文章目录 OpcodeStackDetector常用套路调用栈visit code类检测方法检测代码行检测 前面的博客也提到过&#xff0c;Spotbugs 里面 Detector2 与 Detector&#xff0c;FindBugs2 与 FindBugs&#xff0c;GUI2与GUI&#xff0c;可以视为 Spotbugs 与 FindBugs 新老技术的碰撞&…

STM32单片机C语言:继电器控制220v灯泡亮灭

本文旨在详细阐述如何利用STM32单片机结合继电器模块&#xff0c;实现对220V灯泡亮灭的远程控制。我们将深入探讨继电器的工作原理&#xff0c;构建相应的硬件电路&#xff0c;并提供具体的程序实现步骤&#xff0c;在智能家居与自动化控制领域的应用的比较多。 一、继电器原理…

接口测试支持IDEA插件一键同步API、新增思维导图快速评审测试用例,MeterSphere开源持续测试工具v3.1.0版本发布

2024年7月29日&#xff0c;MeterSphere开源持续测试工具正式发布v3.1.0版本。 在这一版本中&#xff0c;接口测试方面&#xff0c;支持通过IDEA插件一键同步API至MeterSphere&#xff1b;测试管理方面&#xff0c;“测试用例”模块新增通过思维导图模式快捷评审测试用例。在“…

扫码登录方案

以哔哩哔哩扫码登录为例 二维码解码后内容为&#xff1a;https://passport.bilibili.com/h5-app/passport/login/scan?navhide1&qrcode_keye60869ce7f5235c7123175a7effc6f90&frommain-fe-header 扫码登陆&#xff0c;利用已登录设备授权未登录设备登录的方式 扫码…

使用JavaFx Fxml笔记

使用JavaFx Fxml实现账号密码登录 HelloApplication.java&#xff1a;package com.example.dr295cmonth7;import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.geometry.Insets; import javafx.scene.Parent; import javafx.scene.Scene; i…

【论文精读】 | 基于图表示的视频抑郁症识别的两阶段时间建模框架

文章目录 0、Description1、Introduction2、Related work2.1 Relationship between depression and facial behaviours2.2 Video-based automatic depression analysis2.3 Facial graph representation 3、The proposed two-stage approach3.1 Short-term depressive behaviour…

请你谈谈:vue的渲染机制(render)- 2举例说明问题

如何在 Vue 的 render 函数中使用 createElement 方法来创建虚拟节点&#xff08;VNode&#xff09;。这里是一个稍微整理后的示例&#xff0c;它直接对应于你提供的注释和代码片段&#xff0c;但作为一个完整的 render 函数的一部分&#xff0c;可能位于一个 Vue 组件的 scrip…

javascript(一)

一、基本语法 1.位置 (1)JavaScript脚本必须位于<script>与</script>之间 (2)<script>标签可以位于<body>或者<head>部分中 2.输出语句 (1)window.alter() 弹出警告框 (2)document.write() 可以将内容在网页中打印出来&#xff0c;同时也…