Expo Location.getCurrentPositionAsync在Android构建版本无法工作求助
Expo构建包Android端无法获取位置的问题
我使用expo-location获取用户当前位置,该功能在Expo Go中Android和iOS平台均能正常运行,但生成应用商店上架的构建包后,iOS端可正常获取位置,Android端却一直处于加载状态。
位置获取核心代码
const [loading, setLoading] = useState(false); const [location, setLocation] = useState(null); const getLocationAsync = async () => { setLoading(true); let { status, canAskAgain } = await Location.requestForegroundPermissionsAsync(); if (!canAskAgain || status === "denied") { Alert.alert("位置权限", "", [{ text: '去设置', onPress: () => { Linking.openSettings(); navigation.goBack(); } }], { cancelable: false }) setLoading(false); return; } else if (status !== 'granted') { await Location.requestForegroundPermissionsAsync(); } let location = await Location.getCurrentPositionAsync({}); const oneDegreeOfLongitudeInMeters = 111.32 * 1000; const circumference = (40075 / 360) * 1000; setLocation(prevState => { return { latitude: location.coords.latitude, longitude: location.coords.longitude, latitudeDelta: 200 * (1 / (Math.cos(location.coords.latitude) * circumference)), longitudeDelta: (200 / oneDegreeOfLongitudeInMeters) } }) setLoading(false); } useEffect(() => { getLocationAsync(); }, [])
app.config.js配置文件
export default { "expo": { "name": "App Name", "owner": "App Owner", "scheme": "App Scheme", "plugins": [ [ "expo-build-properties", { "android": { "compileSdkVersion": 33, "targetSdkVersion": 33, "buildToolsVersion": "31.0.0" }, "ios": { "deploymentTarget": "13.0", "useFrameworks": "static" } } ], [ "expo-location", { "locationAlwaysAndWhenInUsePermission": "Allow App to use your location" } ] ], "slug": "App slug", "version": "1.0.0", "orientation": "portrait", "icon": "App icon", "userInterfaceStyle": "light", "splash": { "image": "App Splash", "resizeMode": "cover", "backgroundColor": "#0a0a0a" }, "assetBundlePatterns": [ "**/*" ], "ios": { "bundleIdentifier": "App bundle identifier", "buildNumber": "1.0.14", "googleServicesFile": process.env.GOOGLE_SERVICE_INFO_PLIST, "config": {"googleMapsApiKey": process.env.IOS_GOOGLE_MAPS_API_KEY} }, "android": { "package": "App bundle identifier", "versionCode": 14, "googleServicesFile": process.env.GOOGLE_SERVICES_JSON, "config": {"googleMaps": {"apiKey": process.env.STORE_ANDROID_GOOGLE_MAPS_API_KEY}}, "permissions": ["ACCESS_COARSE_LOCATION", "ACCESS_FINE_LOCATION", "FOREGROUND_SERVICE"] }, "web": { "favicon": "./assets/favicon.png", "config": {"firebase": {"apiKey": process.env.FIREBASE_API_KEY,"authDomain": process.env.FIREBASE_AUTH_DOMAIN,"projectId": process.env.FIREBASE_PROJECT_ID,"storageBucket": process.env.FIREBASE_STORAGE_BUCKET,"messagingSenderId": process.env.FIREBASE_MESSAGING_SENDER_ID,"appId": process.env.FIREBASE_APP_ID,"measurementId": process.env.FIREBASE_MEASUREMENT_ID}} }, "extra": { firebaseApiKey: process.env.FIREBASE_API_KEY, firebaseAuthDomain: process.env.FIREBASE_AUTH_DOMAIN, firebaseProjectId: process.env.FIREBASE_PROJECT_ID, firebaseStorageBucket: process.env.FIREBASE_STORAGE_BUCKET, firebaseMessagingSenderId: process.env.FIREBASE_MESSAGING_SENDER_ID, firebaseAppId: process.env.FIREBASE_APP_ID, firebaseMeasurementId: process.env.FIREBASE_MEASUREMENT_ID, "eas": {"projectId": "EAS project ID"} } } }
排查与解决方法
1. 补全Android权限配置
当前expo-location插件仅配置了locationAlwaysAndWhenInUsePermission,Android平台需要单独配置前台权限描述,否则构建包可能无法正确申请权限。修改插件配置:
[ "expo-location", { "locationWhenInUsePermission": "允许App在使用时获取你的位置", "locationAlwaysAndWhenInUsePermission": "允许App随时获取你的位置" } ]
2. 修复权限申请逻辑漏洞
如果第一次权限申请未通过,代码再次调用申请但未处理返回结果,可能导致后续定位时权限仍未授予。修改权限申请部分:
else if (status !== 'granted') { const secondRequest = await Location.requestForegroundPermissionsAsync(); if (secondRequest.status !== 'granted') { Alert.alert("位置权限", "需要位置权限才能继续", [{ text: '去设置', onPress: () => { Linking.openSettings(); navigation.goBack(); } }], { cancelable: false }) setLoading(false); return; } }
3. 给定位请求添加超时与错误处理
Android设备可能因信号差、系统限制导致定位请求挂起,添加超时和错误捕获避免loading一直处于true:
try { let location = await Location.getCurrentPositionAsync({ timeout: 10000, // 10秒超时 maximumAge: 0, accuracy: Location.Accuracy.High }); // 原设置location逻辑不变 } catch (error) { console.error("获取位置失败:", error); Alert.alert("获取位置失败", "无法获取当前位置,请检查定位设置后重试"); setLoading(false); return; }
4. 检查构建配置与设备设置
- 确认EAS构建时targetSdkVersion与配置的33一致,避免权限行为差异
- 测试时手动开启Android设备的高精度定位模式,避免仅依赖网络定位导致延迟
- 确保构建过程中
expo-location插件权限未被其他插件覆盖
5. 验证版本兼容性
更新expo与expo-location到最新稳定版,避免已知的构建包权限或定位问题。
内容的提问来源于stack exchange,提问作者kd12345
相关产品推荐
相关产品推荐

