Android 10在线模式下OsmDroid地图无法加载如何解决
问题诱发原因
该异常是Android系统明文网络流量拦截机制触发的:
从Android 9.0(API 等级28)开始,系统默认禁止应用发起未经过TLS加密的HTTP明文请求,所有未被明确放行的HTTP请求都会被系统直接拦截,抛出java.io.IOException: Cleartext HTTP traffic to xxx not permitted异常。
出现Android 11环境正常、Android 10环境报错的典型场景有两类:
- 所用osmdroid版本的高版本系统适配逻辑存在分支:在Android 11及以上系统运行时自动将瓦片请求地址切换为HTTPS协议,在Android 10系统运行时仍使用默认的HTTP协议瓦片地址,触发系统拦截
- 应用内配置的网络安全规则仅对Android 11及以上版本生效,Android 10系统下未匹配到明文流量放行规则,请求被拦截
修复方案
按优先级从高到低排列:
- 最优方案:强制osmdroid使用HTTPS协议的瓦片源
该方案不需要放宽系统安全限制,符合Android平台网络安全规范,只需要在osmdroid初始化阶段替换默认瓦片源为HTTPS地址即可,核心代码示例:// osmdroid初始化逻辑中添加配置 Configuration.getInstance().setTileFileSystemCacheMaxBytes(100 * 1024 * 1024); // 定义HTTPS协议的OSM瓦片源 IOnlineTileSource osmHttpsSource = new XYTileSource( "Mapnik", 0, 19, 256, ".png", new String[]{ "https://a.tile.openstreetmap.org/", "https://b.tile.openstreetmap.org/", "https://c.tile.openstreetmap.org/" } ); // 给MapView设置该瓦片源 mapView.setTileSource(osmHttpsSource); - 次选方案:通过网络安全配置单独放行瓦片域名的明文流量
如果暂时无法切换HTTPS源,可针对瓦片服务域名单独配置明文放行权限,无需全局放开所有HTTP请求,安全性影响较小:- 在项目
res/xml目录下新建network_security_config.xml文件,写入如下配置:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <!-- 放行OSM瓦片域名下的所有子域名明文请求 --> <domain includeSubdomains="true">tile.openstreetmap.org</domain> </domain-config> </network-security-config>- 在
AndroidManifest.xml的application标签下添加配置引用:
<application android:networkSecurityConfig="@xml/network_security_config" <!-- 其余原有配置保持不变 --> > <!-- 其余组件声明保持不变 --> </application> - 在项目
- 临时调试方案:全局放开明文流量
直接在AndroidManifest.xml的application标签下添加android:usesCleartextTraffic="true"属性,即可全局允许应用发起所有HTTP明文请求。该配置会降低应用通信安全性,仅建议临时调试时使用,正式发布版本不推荐采用。
内容的提问来源于stack exchange,提问作者android tech
相关产品推荐
相关产品推荐

