Android 从OSMBonuspack使用CacheManager.downloadAreaAsync时出现问题

Android 从OSMBonuspack使用CacheManager.downloadAreaAsync时出现问题,android,osmdroid,Android,Osmdroid,我只是在写一个应用程序,它应该能够预取Maptiles,以便在没有数据连接的地方使用该应用程序。因此,我在Android客户端OSMDroid和OSMDroid Bonuspack上使用开放街道地图。对于生产,我将使用自己的OSM服务器 这是我下载定义区域的分幅的代码: map.setTileSource(TileSourceFactory.MAPQUESTOSM); map.setBuiltInZoomControls(true); map.setMultiTouchControls(true

我只是在写一个应用程序,它应该能够预取Maptiles,以便在没有数据连接的地方使用该应用程序。因此,我在Android客户端OSMDroid和OSMDroid Bonuspack上使用开放街道地图。对于生产,我将使用自己的OSM服务器

这是我下载定义区域的分幅的代码:

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;
        }
    }