You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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权限不再生效,可通过两种方式处理:

    1. 在Manifest的<application>标签中添加android:requestLegacyExternalStorage="true",暂时兼容旧存储模式;
    2. 改用应用专属外部存储路径,比如getExternalFilesDir(null),同时指定Osmdroid的存储目录:
      Configuration.getInstance().setOsmdroidBasePath(getExternalFilesDir(null));
      Configuration.getInstance().setOsmdroidTileCache(new File(getExternalFilesDir(null), "tiles"));
      
      这种方式无需额外存储权限。
  • 手动初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:57:50