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?
问题:
回答1:
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(...)
回答2:
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);
...
}
回答3:
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>