使用osmdroid无需访问外部存储

est*_*que 6 storage android osmdroid android-permissions

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

Ale*_*cha 6

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

因此,您需要正确的权限,否则您必须更改路径,正如 spy 和 Dima 所建议的那样。

另外,如果你有一个正在运行的系统并更新到 Android 10,你可能会遇到一个异常Unable to start the sqlite tile writer. Check external storage availability.原因可以是范围外部存储

最简单的解决方法是回退到旧文件访问:

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting
       Android 10 or higher. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)


spy*_*spy 5

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

刚从Wiki新闻发布。是的,您可以将位置更改为应用程序专用存储,在这种情况下,它应该可以正常工作。专家提示:在加载任何地图视图之前进行设置。

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

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

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


Dim*_*vin 5

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

        @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);
            ...
        }
Run Code Online (Sandbox Code Playgroud)