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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:44:52