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
相关产品推荐
相关产品推荐

