需要自定义Writer实现IFilesystemCache
public class ImgTileWriter implements IFilesystemCache {
private String dir;
public ImgTileWriter(String cacheDir) {
if (!cacheDir.endsWith(File.separator)) {
cacheDir += File.separator;
}
dir = cacheDir;
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();
}
}
@Override
public boolean saveFile(final ITileSource pTileSourceInfo, final long pMapTileIndex, final InputStream pStream, final Long pExpirationTime) {
FileOutputStream bos = null;
File file = null;
try {
int zoom = MapTileIndex.getZoom(pMapTileIndex);
int x = MapTileIndex.getX(pMapTileIndex);
int y = MapTileIndex.getY(pMapTileIndex);
file = new File(dir + ""+x +""+y+".png");
File parent = file.getParentFile();
if (!parent.exists()) parent.mkdirs();
if (file.exists()) {
return true;
}
bos = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = pStream.read(buffer, 0, 8192)) != -1) {
bos.write(buffer, 0, bytesRead);
}
bos.close();
pStream.close();
} catch (Throwable ex) {
if (file != null) file.delete();
Log.e("niupi", "Unable to store cached tile from " + pTileSourceInfo.name() + " " + MapTileIndex.toString(pMapTileIndex), ex);
} finally {
try {
if (bos != null) {
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
@Override
public boolean exists(ITileSource pTileSource, final long pMapTileIndex) {
int x = MapTileIndex.getX(pMapTileIndex);
int y = MapTileIndex.getY(pMapTileIndex);
// File file = new File(dir + DataTool.getMapCacheName(x, y, zoom));
File file = new File(dir + ""+x +"/"+y+".png");
return file.exists();
}
@Override
public void onDetach() {
}
@Override
public boolean remove(final ITileSource tileSource, final long pMapTileIndex) {
//not supported
return false;
}
@Override
public Long getExpirationTimestamp(final ITileSource pTileSource, final long pMapTileIndex) {
return null;
}
/**
* @since 5.6.5
*/
@Override
public Drawable loadTile(final ITileSource pTileSource, final long pMapTileIndex) throws Exception {
InputStream inputStream = null;
try {
int x = MapTileIndex.getX(pMapTileIndex);
int y = MapTileIndex.getY(pMapTileIndex);
// File file = new File(dir + DataTool.getMapCacheName(x, y, zoom));
File file = new File(dir + ""+x +""+y+".png");
inputStream = new FileInputStream(file);
return pTileSource.getDrawable(inputStream);
} finally {
if (inputStream != null) {
StreamUtils.closeStream(inputStream);
}
}
}
}
在MainActivity添加点击按钮调用下面的方法
CacheManager mgr = null;
ImgTileWriter writer=null;
private void osmTileDownload() {
try {
String outputName = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator +
"osmdroid" + File.separator +"osm";
writer = new ImgTileWriter(outputName);
mgr = new CacheManager(mMapView, writer);
int zoommin = 1;
int zoommax = 12;
//下载区域
BoundingBox bb = new BoundingBox(23.97956070462608, 113.9886474609375, 21.10841669888532, 112.0111083984375);//北东南西
mgr.downloadAreaAsync(getApplicationContext(), bb, zoommin, zoommax, new CacheManager.CacheManagerCallback() {
@Override
public void onTaskComplete() {
Toast.makeText(getApplicationContext(), "Download complete!", Toast.LENGTH_LONG).show();
if (writer != null)
writer.onDetach();
}
@Override
public void onTaskFailed(int errors) {
Toast.makeText(getApplicationContext(), "Download complete with " + errors + " errors", Toast.LENGTH_LONG).show();
if (writer != null)
writer.onDetach();
}
@Override
public void updateProgress(int progress, int currentZoomLevel, int zoomMin, int zoomMax) {
//NOOP since we are using the build in UI
}
@Override
public void downloadStarted() {
//NOOP since we are using the build in UI
}
@Override
public void setPossibleTilesInArea(int total) {
//NOOP since we are using the build in UI
}
});
} catch (Exception ex) {
//TODO something better?
ex.printStackTrace();
}
}
参考文章:https://blog.csdn.net/z19980115/article/details/79472005#comments