Expo SDK 42 Android端定位服务不可用报错 已开权限仍触发Promise拒斥
问题修复方案
- 检查
app.json的Android权限声明,managed workflow模式下需显式配置定位权限,找到expo.android.permissions字段,添加如下内容:
"permissions": [ "ACCESS_COARSE_LOCATION", "ACCESS_FINE_LOCATION" ]
修改配置后需要重新构建Expo开发客户端才可生效,直接热更新不会触发权限配置更新
- 优化定位调用逻辑,补充异常捕获与可用性校验
原代码未对getCurrentPositionAsync做异常捕获,同时默认高精度定位要求GPS模块启用,部分仅开启网络定位的Android设备会触发provider不可用错误,可参考如下代码调整:
useFocusEffect( React.useCallback(()=> { let isActive = true; async function getLocationAsync() { try { // 申请前台定位权限 let { status } = await Location.requestForegroundPermissionsAsync() if (status !== 'granted'){ setErrorMsg('Permission to access location was denied') return; } // 先校验定位服务状态 const providerStatus = await Location.getProviderStatusAsync({}); if (!providerStatus.locationServicesEnabled) { setErrorMsg('请开启设备定位服务') return } // 传入定位配置,降低精度要求、设置超时时间 let location = await Location.getCurrentPositionAsync({ accuracy: Location.Accuracy.Balanced, timeout: 15000 }); if (isActive) { setLocation(location); } } catch (e) { console.error('定位获取失败', e) // 降级逻辑:尝试获取最近一次缓存的定位 try { const lastLocation = await Location.getLastKnownPositionAsync({}) if (lastLocation && isActive) { setLocation(lastLocation) } else { setErrorMsg('定位获取失败,请检查定位服务设置') } } catch (lastErr) { setErrorMsg('定位获取失败,请检查定位服务设置') } } } getLocationAsync() return () =>{ isActive = false } },[]) )
- 若调整后仍出现报错,可清理Expo Go本地缓存后重试,SDK 42版本存在偶发的权限状态缓存异常问题。
内容的提问来源于stack exchange,提问作者MK_Pierce
相关产品推荐
相关产品推荐

