Expo SDK v51升级后定位前台服务权限未同步至Android Manifest问题
Expo SDK v51升级后ExpoLocation前台服务权限问题解决方法
问题重现
升级Expo SDK至v51后,调用ExpoLocation.startLocationUpdatesAsync触发错误:
[Error: Call to function 'ExpoLocation.startLocationUpdatesAsync' has been rejected.
→ Caused by: Couldn't start the foreground service. Foreground service permissions were not found in the manifest]
已完成用户权限申请并获得授权,但问题在Expo Go和开发构建环境中均存在。当前app.json的Android配置片段:
"android": { "adaptiveIcon": { "foregroundImage": "./assets/app-icon512.png", "backgroundColor": "#ffffff" }, "permissions": [ "FOREGROUND_SERVICE_LOCATION", "FOREGROUND_LOCATION", "ACCESS_BACKGROUND_LOCATION", "ACCESS_COARSE_LOCATION", "ACCESS_FINE_LOCATION", "CAMERA", "READ_EXTERNAL_STORAGE", "WRITE_EXTERNAL_STORAGE" ], },
解决方法
1. 显式声明前台服务组件
在app.json的android字段下添加androidManifest配置,明确注册位置服务的前台服务类型:
"android": { "adaptiveIcon": { "foregroundImage": "./assets/app-icon512.png", "backgroundColor": "#ffffff" }, "permissions": [ "FOREGROUND_SERVICE_LOCATION", "ACCESS_BACKGROUND_LOCATION", "ACCESS_COARSE_LOCATION", "ACCESS_FINE_LOCATION", "CAMERA", "READ_EXTERNAL_STORAGE", "WRITE_EXTERNAL_STORAGE" ], "androidManifest": { "application": { "service": [ { "name": "expo.modules.location.LocationService", "foregroundServiceType": "location", "permission": "android.permission.FOREGROUND_SERVICE_LOCATION" } ] } } }
2. 精简权限列表
移除冗余的FOREGROUND_LOCATION权限——Expo SDK v51中该权限已被整合到前台服务的权限逻辑中,无需单独声明。
3. 清理缓存并重建
- Expo Go环境:执行以下命令清除缓存后重启项目:
npx expo start --clear
- 开发构建环境:重新生成开发构建包,确保Manifest的变更被正确注入到APK中。
4. 确认权限请求逻辑
调用位置更新前,必须确保已成功获取前台位置权限:
import { Location, PermissionStatus, requestForegroundPermissionsAsync } from 'expo-location'; // 先请求前台位置权限 const permissionResult = await requestForegroundPermissionsAsync(); if (permissionResult.status !== PermissionStatus.GRANTED) { console.error("前台位置权限未授权"); return; } // 启动位置更新 await Location.startLocationUpdatesAsync(YOUR_TASK_NAME, { // 你的位置配置参数 });
内容的提问来源于stack exchange,提问作者Petr Holoubek
相关产品推荐
相关产品推荐

