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

targetSdk30时Android10下osmdroid崩溃及osmdroidTileCache初始化问题

Android 10环境osmdroid缓存崩溃修复(targetSdk30适用)

问题根因

应用targetSdk设为30时,触发Android10分区存储规则约束,osmdroid默认的外部公共存储缓存路径无权限访问,直接导致初始化崩溃。解决方向是强制将osmdroid缓存目录重定向到应用私有内部存储,绕开外部存储权限校验。

原参考代码的疏漏

你拿到的示例配置存在变量名笔误:代码中根本没有定义osmdroidTileCache变量,直接照搬会触发编译报错,这就是配置卡壳的核心原因。

可直接落地的完整配置

注意:这段代码必须在MapView实例化、所有osmdroid组件初始化之前执行,否则配置不会生效

// 初始化osmdroid全局配置
IConfigurationProvider configuration = Configuration.getInstance();
// 获取应用私有内部存储路径,无需申请任何外部存储权限
File internalPrivateDir = context.getFilesDir();

// 创建osmdroid根缓存目录
File osmdroidBasePath = new File(internalPrivateDir, "osmdroid");
if (!osmdroidBasePath.exists()) {
    osmdroidBasePath.mkdirs();
}

// 创建瓦片专用缓存目录
File osmdroidTilePath = new File(osmdroidBasePath, "tiles");
if (!osmdroidTilePath.exists()) {
    osmdroidTilePath.mkdirs();
}

// 将自定义缓存路径写入osmdroid配置,修正原示例的变量错配
configuration.setOsmdroidBasePath(osmdroidBasePath);
// 直接传入之前创建好的osmdroidTilePath即可,不需要额外初始化新的osmdroidTileCache变量
configuration.setOsmdroidTileCache(osmdroidTilePath);

配置注意事项

  • 路径选择context.getFilesDir()的私有目录,完全不需要在Manifest中申请存储相关权限,也不需要开启requestLegacyExternalStorage的兼容配置
  • 目录创建加存在性判断,避免定制系统上私有目录访问异常导致的空指针崩溃
  • 这套配置逻辑对后续targetSdk升级(33及以上版本)同样兼容,不会因为分区存储规则迭代出现二次崩溃

内容的提问来源于stack exchange,提问作者Towsif Ahamed Labib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 20:15:05