You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:27:05