Using osmdroid without getting access to external storage
Asked Answered
O

3

7

In my app I am using osmdroid for working with map. Map tiles are downloaded and kept in /storage/osmdroid. The application requires permissions WRITE_EXTERNAL_STORAGE and READ_EXTERNAL_STORAGE. If I deny access to storage, map is not shown. Is any way to show map without access to phone memory?

Organotherapy answered 18/8, 2016 at 13:36 Comment(1)
/storage/osmdroid. Who is determining that storage location?Lehr
B
7

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(...)

Buckels answered 18/8, 2016 at 21:51 Comment(0)
A
15

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

Absorption answered 30/10, 2018 at 8:58 Comment(4)
With above solution i still need external storage permission.Rumpus
I needed this fix when moving from Android 8 to 9Dissepiment
Does this code need to run every time the Map Activity is created? or just once? perhaps in a Splash Activity?Wheelchair
@Wheelchair once - "...I just added into my application class..."Absorption
B
7

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(...)

Buckels answered 18/8, 2016 at 21:51 Comment(0)
H
7

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>
Hambrick answered 7/11, 2019 at 23:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.