Osmdroid无法创建指定文件夹且读取本地地图失败,权限已配置求解决
解决方案
动态申请存储权限
Android 6.0(API 23)及以上仅在Manifest声明权限无效,必须在代码中动态申请READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限。示例代码:if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 100); }务必在
onRequestPermissionsResult中处理权限申请结果,仅当权限通过后再执行地图相关操作。适配Android 10+分区存储
Android 10(API 29)引入分区存储机制,WRITE_EXTERNAL_STORAGE权限不再生效,可通过两种方式处理:- 在Manifest的
<application>标签中添加android:requestLegacyExternalStorage="true",暂时兼容旧存储模式; - 改用应用专属外部存储路径,比如
getExternalFilesDir(null),同时指定Osmdroid的存储目录:
这种方式无需额外存储权限。Configuration.getInstance().setOsmdroidBasePath(getExternalFilesDir(null)); Configuration.getInstance().setOsmdroidTileCache(new File(getExternalFilesDir(null), "tiles"));
- 在Manifest的
手动初始化Osmdroid存储目录
在Application的onCreate方法中提前创建所需文件夹,避免Osmdroid自动创建失败:File osmdroidDir = new File(Environment.getExternalStorageDirectory(), "Osmdroid"); File cacheDir = new File(osmdroidDir, "Cache"); if (!osmdroidDir.exists()) { osmdroidDir.mkdirs(); } if (!cacheDir.exists()) { cacheDir.mkdirs(); } // 指定Osmdroid使用该目录 Configuration.getInstance().setOsmdroidBasePath(osmdroidDir); Configuration.getInstance().setOsmdroidTileCache(cacheDir);执行这段代码前需确保已获取存储权限。
检查模拟器存储状态
部分模拟器可能存在外部存储未正确挂载的情况,可通过adb shell命令验证:adb shell ls /sdcard adb shell touch /sdcard/test.txt若无法写入,需在模拟器设置中启用外部存储或更换模拟器镜像。
排查异常日志
在创建文件夹或读取地图时捕获IOException,打印具体异常信息定位问题:try { // 创建文件夹或读取地图的代码 } catch (IOException e) { e.printStackTrace(); }通过Logcat查看日志,确认是权限问题、路径不存在还是其他系统限制。
内容的提问来源于stack exchange,提问作者Lev Yukelson
相关产品推荐
相关产品推荐

