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

Posted

技术标签:

【中文标题】在不访问外部存储的情况下使用 osmdroid【英文标题】:Using osmdroid without getting access to external storage 【发布时间】:2016-12-25 11:20:12 【问题描述】:

在我的应用程序中,我使用 osmdroid 来处理地图。地图图块被下载并保存在 /storage/osmdroid 中。该应用程序需要 WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE 权限。如果我拒绝访问存储,则不会显示地图。有什么方法可以在不访问手机内存的情况下显示地图?

【问题讨论】:

/storage/osmdroid。谁在确定存储位置? 【参考方案1】:

为了解决这个问题,我刚刚在我的应用程序类中添加了下一个代码:

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

【讨论】:

通过上述解决方案,我仍然需要外部存储权限。 android 8 迁移到 9 时我需要此修复【参考方案2】:

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

新鲜出炉的 wiki 新闻。是的,您可以将位置更改为应用程序私有存储,在这种情况下它应该可以正常工作。专业提示:在加载任何地图视图之前设置这些。

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

更新: 较新版本的 osmdroid,从 5.6 及更高版本开始使用以下

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

【讨论】:

【参考方案3】:

您的问题的实际答案是否定的。 OSMDroid 需要缓存切片才能工作。

因此,您需要正确的权限,否则您必须按照 spy 和 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 Python 中的外部库的情况下解析 arff 文件

在不物理断开的情况下断开外部附件

如何在不使用外部库(例如 Numpy、Pandas)的情况下读取 CSV 文件?

应用程序在本机代码中进行外部存储的路径

如何在不注册身份的情况下从外部提供商获取用户登录信息

如何在不增加 http 请求的情况下包含多个外部 javascript 文件