升级SDK到31后Android13设备授予定位权限时Flutter应用崩溃
问题解决方案
核心原因
你的问题本质是旧版本依赖与Android 13(SDK 31)权限模型不兼容,再加上Flutter版本过老,对Android 13的适配支持缺失导致崩溃:
- Android 13新增了
POST_NOTIFICATIONS权限要求,后台定位必须依赖该权限;同时后台定位权限(ACCESS_BACKGROUND_LOCATION)的申请逻辑变更,必须先获取前台定位权限才能申请。 - 你使用的
background_locator: ^1.3.0+1和geolocator: ^6.2.1都是多年前的版本,完全没有适配Android 13的权限规则;Flutter 1.22.6更是2020年的旧版本,对Android 13的系统API兼容性极差。
具体修复步骤
强制升级核心依赖版本
旧版本的定位相关库已停止维护,必须升级到支持Android 13的版本:- 将
geolocator升级到^10.0.0及以上版本(该版本完全适配Android 13权限) - 替换
background_locator为geolocator自带的后台定位功能(background_locator已多年未更新,无Android 13适配),或者使用维护活跃的flutter_background_geolocation库 - 升级Flutter到
3.x稳定版,确保对Android 13的系统API支持
- 将
适配Android 13权限声明
在android/app/src/main/AndroidManifest.xml中添加必要的权限:
<!-- 前台定位权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 后台定位权限 --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <!-- Android 13通知权限(后台定位必须依赖) --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
- 修正权限申请流程
Android 13不允许直接请求后台定位权限,必须遵循「前台权限→后台权限」的顺序:
// 1. 先请求前台定位权限 var status = await Geolocator.checkPermission(); if (status == LocationPermission.denied) { status = await Geolocator.requestPermission(); if (status != LocationPermission.whileInUse && status != LocationPermission.always) { // 权限申请失败处理 return; } } // 2. 再请求后台定位权限(始终允许) if (status == LocationPermission.whileInUse) { status = await Geolocator.requestPermission(); } // 3. 权限通过后再注册后台定位 if (status == LocationPermission.always) { // 这里替换为新库的后台定位注册逻辑 }
- 清理冲突的WorkManager依赖
旧版background_locator内置的WorkManager版本与你手动添加的androidx.work:work-runtime可能存在版本冲突,升级依赖后无需手动添加该依赖,直接删除app/build.gradle中的相关配置即可。
临时替代方案(不推荐)
如果暂时无法大规模升级,可临时将compileSdkVersion和targetSdkVersion回退到30,但这会导致应用无法适配Android 13设备的新特性,仅作为过渡方案。
内容的提问来源于stack exchange,提问作者Sanath nath
相关产品推荐
相关产品推荐

