在不访问外部存储的情况下使用 osmdroid

Using osmdroid without getting access to external storage

在我的应用程序中,我使用 osmdroid 处理地图。地图图块已下载并保存在 /storage/osmdroid 中。该应用程序需要 WRITE_EXTERNAL_STORAGEREAD_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>