我正在使用 osmdroid 制作移动应用程序。我希望能够在线和离线使用它。我使用 CacheManager 通过将它们存储在 /osmdroid 文件夹中的 .sqlite 文件中来自定义下载地图。
public void downloadMap() {
final SqliteArchiveTileWriter writer;
createArea();
String outputName = basePathMapTileProvider + area.name + ".sqlite";
map.setTileSource(TileSourceFactory.OpenTopo);
try {
writer=new SqliteArchiveTileWriter(outputName);
CacheManager cacheManager = new CacheManager(map,writer);
//loadOfflineMap();
cacheManager.downloadAreaAsync(ctx, area, zoomMin, zoomMax, new CacheManager.CacheManagerCallback() {
@Override
public void onTaskComplete() {
Toast.makeText(ctx, R.string.download_complete, Toast.LENGTH_LONG).show();
// loadOfflineMap();
if (writer!=null)
writer.onDetach();
}
@Override
public void updateProgress(int progress, int currentZoomLevel, int zoomMin, int zoomMax) {
}
@Override
public void downloadStarted() {
Toast.makeText(ctx, R.string.download_started, Toast.LENGTH_LONG).show();
}
@Override
public void setPossibleTilesInArea(int total) {
}
@Override
public void onTaskFailed(int errors) {
Toast.makeText(ctx, R.string.download_error, Toast.LENGTH_LONG).show();
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
}
到目前为止,我可以确定连接是否存在,如果有连接,则使用默认的“提供程序”(MapTileProviderBasic),如果没有,则使用 OfflineTileProvider。
if (isNetworkAvaliable(this))
loadOnlineMap();
else
loadOfflineMap();
问题是,如果我使用默认提供程序并且没有连接,它不会加载存储在内存中的地图(.sqlite),只加载缓存中的一个(osmdroid/tiles/cache.db)。
private void loadOnlineMap(){
// Loading de main map
map = findViewById(R.id.map);
map.setTileSource(TileSourceFactory.OpenTopo);
mapController = map.getController();
mapController.setZoom(11.0);
//we add default zoom buttons, and ability to zoom with 2 fingers (multi-touch)
// map.setBuiltInZoomControls(true);
map.getZoomController().setVisibility(CustomZoomButtonsController.Visibility.ALWAYS);
map.setMultiTouchControls(true);
...///...
如果我使用离线提供程序(OfflineTileProvider),它只会加载我在构造函数中指定的文件(例如 spain.sqlite),而不是另一个可能需要的文件(例如 portugal.sqlite),甚至不是那个在缓存中。
private void loadOfflineMap(){
if (!IS_THERE_SOME_MAP_FILE_DOWNLOADED){
Toast.makeText (this,"No existen mapas descargados.\nProceda a descargar un mapa para poder usar la aplicación Offline",Toast.LENGTH_LONG).show ();
return;
}
File f = new File(basePathMapTileProvider + "spain.sqlite");
OfflineTileProvider m_OfflineTileProvider = null;
try {
m_OfflineTileProvider = new OfflineTileProvider (
new SimpleRegisterReceiver (this), new File[] { f });
} catch (Exception ex) {
ex.printStackTrace ();
}
map.setTileProvider(m_OfflineTileProvider);
IArchiveFile[] archives = m_OfflineTileProvider.getArchives ();
if (archives.length > 0){
String[] tileSources = archives[0].getTileSources ().toArray (new String[0]);
map.setUseDataConnection (false);
ITileSource tilesource = FileBasedTileSource.getSource(tileSources[0]);
map.setTileSource(tilesource);
}
...///...
}
问题是:如果连接丢失或没有连接,我该怎么做,存储在内存中的必要地图会自动加载?