Using osmdroid without getting access to external storage

For solving this problem I just added into my application class next code:

        @Override
            public void onCreate() {
            ...
            org.osmdroid.config.IConfigurationProvider osmConf = org.osmdroid.config.Configuration.getInstance();
            File basePath = new File(getCacheDir().getAbsolutePath(), "osmdroid");
            osmConf.setOsmdroidBasePath(basePath);
            File tileCache = new File(osmConf.getOsmdroidBasePath().getAbsolutePath(), "tile");
            osmConf.setOsmdroidTileCache(tileCache);
            ...
        }

This code changes the path of OSM cache from external to internal( getCacheDir())


https://github.com/osmdroid/osmdroid/wiki/FAQ

Fresh off the wiki press. Yes you can change the location to application private storage, in which case it should work just fine. Pro tip: set these before loading any map views.

OpenStreetMapTileProviderConstants.setCachePath(...) OpenStreetMapTileProviderConstants.setCacheSizes(...) OpenStreetMapTileProviderConstants.setOfflineMapsPath(...) OpenStreetMapTileProviderConstants.setUserAgentValue(...)

Update: Newer versions of osmdroid, starting in 5.6 and up use the following

Configuration.getInstance().setCachePath(...) Configuration.getInstance().setCacheSizes(...) Configuration.getInstance().setOfflineMapsPath(...) Configuration.getInstance().setUserAgentValue(...)


The actual answer to your question is no. OSMDroid needs to cache the tiles to work.

Therefore you need the correct permissions or you have to change the path, as suggested by spy and Dima.

Additionally, if you had a running system and updated to Android 10, you might encounter an exception Unable to start the sqlite tile writer. Check external storage availability. The reason for this can be scoped external storage.

The easiest workaround for this would be to fall back to the legacy file access:

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting
       Android 10 or higher. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>