Android 从OSMBonuspack使用CacheManager.downloadAreaAsync时出现问题
我只是在写一个应用程序,它应该能够预取Maptiles,以便在没有数据连接的地方使用该应用程序。因此,我在Android客户端OSMDroid和OSMDroid Bonuspack上使用开放街道地图。对于生产,我将使用自己的OSM服务器 这是我下载定义区域的分幅的代码:Android 从OSMBonuspack使用CacheManager.downloadAreaAsync时出现问题,android,osmdroid,Android,Osmdroid,我只是在写一个应用程序,它应该能够预取Maptiles,以便在没有数据连接的地方使用该应用程序。因此,我在Android客户端OSMDroid和OSMDroid Bonuspack上使用开放街道地图。对于生产,我将使用自己的OSM服务器 这是我下载定义区域的分幅的代码: map.setTileSource(TileSourceFactory.MAPQUESTOSM); map.setBuiltInZoomControls(true); map.setMultiTouchControls(true
map.setTileSource(TileSourceFactory.MAPQUESTOSM);
map.setBuiltInZoomControls(true);
map.setMultiTouchControls(true);
BoundingBoxE6 boxE6 = new BoundingBoxE6(51.758971, 7.100778, 50.653902, 6.689312);
CacheManager cacheManager = new CacheManager(map);
cacheManager.downloadAreaAsync(getActivity(), boxE6, 13, 15);
根据OSMdroid BonuPack的GitHub页面,My build.gradle包含所需的所有依赖项(当然没有生成错误):
当我运行代码时,会出现对话框,显示下载每个缩放级别的平铺的进度。但我的日志中充斥着以下错误:
Error downloading MapTile: /15/17015/11010
java.lang.NoClassDefFoundError: org.osmdroid.http.HttpClientFactory
at org.osmdroid.bonuspack.cachemanager.CacheManager.loadTile(CacheManager.java:95)
at org.osmdroid.bonuspack.cachemanager.CacheManager$DownloadingTask.downloadArea(CacheManager.java:259)
at org.osmdroid.bonuspack.cachemanager.CacheManager$DownloadingTask.doInBackground(CacheManager.java:230)
at org.osmdroid.bonuspack.cachemanager.CacheManager$DownloadingTask.doInBackground(CacheManager.java:207)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Proguard已禁用。由于我无法找到org.osmdroid.http.HttpClientFactory丢失的原因,我创建了
FixedCacheManager
并重写了loadTile()
。在该方法中,我使用OkHttp下载互动程序:
@Override
public boolean loadTile(OnlineTileSourceBase tileSource, MapTile tile) {
File file = this.getFileName(tileSource, tile);
if(file.exists()) {
return true;
} else {
InputStream in = null;
BufferedOutputStream out = null;
boolean var15;
try {
String e = tileSource.getTileURLString(tile);
Request request = new Request.Builder().get().url(e).build();
Response response = client.newCall(request).execute();
if(!response.isSuccessful()) {
Log.w("BONUSPACK", "Problem downloading MapTile: " + tile + " HTTP response: " + response.code());
boolean entity1 = false;
return entity1;
}
final ResponseBody body = response.body();
if(body == null) {
Log.w("BONUSPACK", "No content downloading MapTile: " + tile);
boolean dataStream1 = false;
return dataStream1;
}
in = body.byteStream();
ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, 8192);
StreamUtils.copy(in, out);
out.flush();
byte[] data = dataStream.toByteArray();
ByteArrayInputStream byteStream = new ByteArrayInputStream(data);
this.mTileWriter.saveFile(tileSource, tile, byteStream);
byteStream.reset();
var15 = true;
} catch (UnknownHostException var22) {
Log.w("BONUSPACK", "UnknownHostException downloading MapTile: " + tile + " : " + var22);
return false;
} catch (FileNotFoundException var23) {
Log.w("BONUSPACK", "Tile not found: " + tile + " : " + var23);
return false;
} catch (IOException var24) {
Log.w("BONUSPACK", "IOException downloading MapTile: " + tile + " : " + var24);
return false;
} catch (Throwable var25) {
Log.e("BONUSPACK", "Error downloading MapTile: " + tile, var25);
return false;
} finally {
StreamUtils.closeStream(in);
StreamUtils.closeStream(out);
}
return var15;
}
}
回答:您的osmdroid和osmbonus包不匹配 您需要osmdroid 5.0.1和osmbonuspack 5.5
原因:OSMDROID5.x支持较新的android API(或缺少)。osmbonuspack也进行了更新,以支持这些更改。。。。在v5.5中您使用的是哪个版本的osmdroid和OSMBonusPack?它被删除了,因为谷歌不想让我们再使用Apache Http客户端,这已经不再相关了。OSM Bonus back也进行了更新,以反映这一变化。也许遗漏了什么。
@Override
public boolean loadTile(OnlineTileSourceBase tileSource, MapTile tile) {
File file = this.getFileName(tileSource, tile);
if(file.exists()) {
return true;
} else {
InputStream in = null;
BufferedOutputStream out = null;
boolean var15;
try {
String e = tileSource.getTileURLString(tile);
Request request = new Request.Builder().get().url(e).build();
Response response = client.newCall(request).execute();
if(!response.isSuccessful()) {
Log.w("BONUSPACK", "Problem downloading MapTile: " + tile + " HTTP response: " + response.code());
boolean entity1 = false;
return entity1;
}
final ResponseBody body = response.body();
if(body == null) {
Log.w("BONUSPACK", "No content downloading MapTile: " + tile);
boolean dataStream1 = false;
return dataStream1;
}
in = body.byteStream();
ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, 8192);
StreamUtils.copy(in, out);
out.flush();
byte[] data = dataStream.toByteArray();
ByteArrayInputStream byteStream = new ByteArrayInputStream(data);
this.mTileWriter.saveFile(tileSource, tile, byteStream);
byteStream.reset();
var15 = true;
} catch (UnknownHostException var22) {
Log.w("BONUSPACK", "UnknownHostException downloading MapTile: " + tile + " : " + var22);
return false;
} catch (FileNotFoundException var23) {
Log.w("BONUSPACK", "Tile not found: " + tile + " : " + var23);
return false;
} catch (IOException var24) {
Log.w("BONUSPACK", "IOException downloading MapTile: " + tile + " : " + var24);
return false;
} catch (Throwable var25) {
Log.e("BONUSPACK", "Error downloading MapTile: " + tile, var25);
return false;
} finally {
StreamUtils.closeStream(in);
StreamUtils.closeStream(out);
}
return var15;
}
}