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

Location.watchPositionAsync无法在Android设备上周期性更新位置

问题

我在Android设备上使用expo-location获取位置更新,调用Location.watchPositionAsync(options, callback)方法并设置timeInterval: 500,期望每500毫秒记录一次位置信息,但当前代码只有在VSCode中按下Ctrl+S保存时,终端才会打印位置值,需要实现位置的自动定时更新。

我的代码
import React, { useState, useEffect } from 'react';
import { Platform, Text, View, StyleSheet } from 'react-native';
import * as Location from 'expo-location';

export default function App() {
  const [location, setLocation] = useState(null);
  const [errorMsg, setErrorMsg] = useState(null);

  useEffect(() => {
    (async () => {
      const locationSubscription = await Location.watchPositionAsync(
        {
          accuracy: Location.Accuracy.High,
          timeInterval: 500,
          // distanceInterval: 1,
        },
        (location) => {
          setLocation(location)
          console.log('New location update: ' + location.coords.latitude + ', ' + location.coords.longitude)
        }
      )
      return () => locationSubscription.remove()
    })()
  }, [])

  let text = 'Waiting..';
  if (errorMsg) {
    text = errorMsg;
  } else if (location) {
    text = JSON.stringify(location);
  }

  return (
    <View style={styles.container}>
      <Text style={styles.paragraph}>Hi</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
    padding: 20,
  },
  paragraph: {
    fontSize: 18,
    textAlign: 'center',
  },
});
解决方案

可以从以下几个方向修复问题:

  • 补全位置权限申请逻辑:Android设备需要明确授权才能获取位置信息,未授权时定位功能会静默失效。在调用watchPositionAsync前先请求权限:

    useEffect(() => {
      (async () => {
        // 请求前台位置权限
        let { status } = await Location.requestForegroundPermissionsAsync();
        if (status !== 'granted') {
          setErrorMsg('位置权限未授予');
          return;
        }
    
        const locationSubscription = await Location.watchPositionAsync(
          {
            accuracy: Location.Accuracy.High,
            timeInterval: 500,
            distanceInterval: 0,
          },
          (location) => {
            setLocation(location)
            console.log('New location update: ' + location.coords.latitude + ', ' + location.coords.longitude)
          }
        )
        return () => locationSubscription.remove()
      })()
    }, [])
    
  • 显式设置distanceInterval: 0:若未配置该参数,系统可能会忽略timeInterval设置,仅在位置变化超过默认距离阈值时才触发更新。设置distanceInterval: 0可强制系统按时间间隔推送位置,即使位置未发生变化。

  • 排查开发模式热重载影响:Expo开发模式的热重载可能导致订阅逻辑异常,可尝试关闭热重载(按r键全量刷新App),或使用生产模式测试(运行expo start --no-dev)。

  • 检查设备定位设置:确保Android设备的定位服务已开启,且设置为高精度模式(GPS+网络),低精度模式无法满足500毫秒的更新频率要求。


内容的提问来源于stack exchange,提问作者dqdq dqsss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:30:04