在不访问外部存储的情况下使用 osmdroid
Using osmdroid without getting access to external storage
在我的应用程序中,我使用 osmdroid 处理地图。地图图块已下载并保存在 /storage/osmdroid 中。该应用程序需要 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 权限。如果我拒绝访问存储,则不会显示地图。有什么方法可以在不访问 phone 内存的情况下显示地图?
https://github.com/osmdroid/osmdroid/wiki/FAQ
刚从维基媒体上脱颖而出。是的,您可以将位置更改为应用程序私有存储,在这种情况下它应该可以正常工作。专业提示:在加载任何地图视图之前设置这些。
OpenStreetMapTileProviderConstants.setCachePath(...)
OpenStreetMapTileProviderConstants.setCacheSizes(...)
OpenStreetMapTileProviderConstants.setOfflineMapsPath(...)
OpenStreetMapTileProviderConstants.setUserAgentValue(...)
更新:
较新版本的 osmdroid,从 5.6 开始及以上使用以下
Configuration.getInstance().setCachePath(...)
Configuration.getInstance().setCacheSizes(...)
Configuration.getInstance().setOfflineMapsPath(...)
Configuration.getInstance().setUserAgentValue(...)
为了解决这个问题,我刚刚在我的应用程序中添加了 class 下一个代码:
@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);
...
}
此代码将 OSM 缓存的路径从外部更改为内部 (getCacheDir()
)
您问题的实际答案是否定的。 OSMDroid 需要缓存图块才能工作。
因此您需要正确的权限,否则您必须按照间谍和 Dima 的建议更改路径。
此外,如果您有 运行 系统并更新到 Android 10,您可能会遇到异常 Unable to start the sqlite tile writer. Check external storage availability.
原因可能是 scoped external storage。
最简单的解决方法是回退到旧文件访问:
<manifest ... >
<!-- This attribute is "false" by default on apps targeting
Android 10 or higher. -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
在我的应用程序中,我使用 osmdroid 处理地图。地图图块已下载并保存在 /storage/osmdroid 中。该应用程序需要 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 权限。如果我拒绝访问存储,则不会显示地图。有什么方法可以在不访问 phone 内存的情况下显示地图?
https://github.com/osmdroid/osmdroid/wiki/FAQ
刚从维基媒体上脱颖而出。是的,您可以将位置更改为应用程序私有存储,在这种情况下它应该可以正常工作。专业提示:在加载任何地图视图之前设置这些。
OpenStreetMapTileProviderConstants.setCachePath(...)
OpenStreetMapTileProviderConstants.setCacheSizes(...)
OpenStreetMapTileProviderConstants.setOfflineMapsPath(...)
OpenStreetMapTileProviderConstants.setUserAgentValue(...)
更新: 较新版本的 osmdroid,从 5.6 开始及以上使用以下
Configuration.getInstance().setCachePath(...)
Configuration.getInstance().setCacheSizes(...)
Configuration.getInstance().setOfflineMapsPath(...)
Configuration.getInstance().setUserAgentValue(...)
为了解决这个问题,我刚刚在我的应用程序中添加了 class 下一个代码:
@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);
...
}
此代码将 OSM 缓存的路径从外部更改为内部 (getCacheDir()
)
您问题的实际答案是否定的。 OSMDroid 需要缓存图块才能工作。
因此您需要正确的权限,否则您必须按照间谍和 Dima 的建议更改路径。
此外,如果您有 运行 系统并更新到 Android 10,您可能会遇到异常 Unable to start the sqlite tile writer. Check external storage availability.
原因可能是 scoped external storage。
最简单的解决方法是回退到旧文件访问:
<manifest ... >
<!-- This attribute is "false" by default on apps targeting
Android 10 or higher. -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>