targetSDKVersion从27升级至29后Map Fragment导致Activity崩溃是什么原因?
MapFragment 升级targetSDK到29后崩溃原因
你当前布局中使用的配置:
<fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.MapFragment" />
触发崩溃的核心原因是API 29(Android 10)的系统规则变更和旧版地图SDK适配不到位,具体如下:
- Google Maps SDK未适配新版本系统:你项目中依赖的Google Play Services Maps SDK版本没有对API 29做兼容适配。API 29对应用的渲染机制、进程沙箱限制、系统服务调用逻辑都做了大幅调整,旧版SDK调用系统能力时触发异常后没有兼容逻辑,直接崩溃。targetSDK 27时不会触发这些新的系统限制,因此运行正常。
- 分区存储规则不兼容:API 29默认开启分区存储机制,旧版Maps SDK缓存地图瓦片时会直接读写公共存储目录,不符合分区存储的权限要求,触发IO异常导致崩溃。targetSDK 27时分区存储还未上线,不会触发该限制。
- 权限校验逻辑升级:API 29对位置权限的校验更加严格,旧版MapFragment没有做权限未获取的异常捕获,当应用未申请到位置权限、或者权限声明不符合API 29要求时,会直接触发崩溃。
修复方案
- 升级Google Play Services Maps SDK到适配API 29及以上的官方最新版本,同时将布局中的
com.google.android.gms.maps.MapFragment替换为com.google.android.gms.maps.SupportMapFragment,如果项目已经迁移到AndroidX,使用AndroidX版本的对应地图Fragment实现。 - 若暂时无法升级地图SDK,可在
AndroidManifest.xml的<application>节点添加android:requestLegacyExternalStorage="true",临时关闭分区存储限制,兼容旧版SDK的存储需求,该配置仅对targetSDK 29、30生效,升级到更高targetSDK时需要完成分区存储适配。 - 完善位置权限的动态申请逻辑,确保在初始化MapFragment之前已经获取到所需的位置权限,避免权限问题引发的崩溃。
内容的提问来源于stack exchange,提问作者Matti243
相关产品推荐
相关产品推荐

