Как можно автоматически загрузить необходимую карту, хранящуюся в памяти? - PullRequest
1 голос
/ 12 апреля 2020

Я делаю мобильное приложение, используя osmdroid. Я хочу иметь возможность использовать его в Интернете и в автономном режиме. Я использую CacheManager для пользовательской загрузки карт, сохраняя их в файлах .sqlite в папке / osmdroid.

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

До сих пор я мог определить, существует ли соединение и использовать «провайдера» по умолчанию (MapTileProviderBasi c ), если есть соединение, или OfflineTileProvider, если его нет.

if (isNetworkAvaliable(this))
   loadOnlineMap();
else
   loadOfflineMap();

Проблема в том, что если я использую провайдера по умолчанию и нет соединения, он не загружает карту, хранящуюся в памяти ( .sqlite), только один в кэше (osmdroid /iles / 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), но не другой, который может понадобиться (например, Португалия. 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);

        }
        ...///...

     }

Вопрос: как мне это сделать, если в случае потери соединения или его отсутствия необходимая карта, хранящаяся в памяти, автоматически загружается?

...