在不获取外部存储访问权限的情况下使用osmdroid

6

在我的应用中,我使用osmdroid来处理地图。地图瓦片被下载并保存在/storage/osmdroid目录下。该应用程序需要WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE权限。如果我拒绝存储访问权限,地图将无法显示。是否有不需要访问手机内存即可显示地图的方法?


/storage/osmdroid。是谁决定了这个存储位置? - greenapps
3个回答

14

为了解决这个问题,我只需将下一行代码添加到我的应用程序类中:

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


通过上述解决方案,我仍然需要外部存储权限。 - M D
当我从Android 8升级到9时,我需要这个修复。 - quilkin
这段代码需要在每次创建地图活动时运行吗?还是只需要运行一次?或者在启动活动中运行? - seekingStillness
1
@seekingStillness 曾经说过 - "...我刚刚添加到我的应用程序类中..." - Dima Kozhevin

7

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


7
你的问题的确切答案是不行的。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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接