【问题标题】:Background location tracking not working - Expo - Android后台位置跟踪不起作用 - Expo - Android
【发布时间】:2021-09-14 08:03:24
【问题描述】:

我正在做一些事情,如果应用程序处于后台并且设备处于睡眠状态,我需要跟踪后台位置。我目前让它在后台为应用程序工作,但是当设备处于睡眠状态时它会停止跟踪。我正在为应用程序使用 Expo,并在 Expo Location 旁边使用 Expo Task Manager 在后台获取位置。 任何人都知道如何在应用程序处于后台且设备处于睡眠模式时获取位置?

这是代码

import { StatusBar } from 'expo-status-bar';
import React, { useState, useEffect } from 'react';
import { StyleSheet, Text, View } from 'react-native';
import * as Location from 'expo-location';
import * as TaskManager from 'expo-task-manager';

const App = () => {
  useEffect(() => {
    (async () => await _askForLocationPermission())();
  });

  this.backgroundLocationFetch = async () => {
    const { status } = await Location.requestBackgroundPermissionsAsync();
    if (status === 'granted') {
      console.log('cmon dance with me!')
      await Location.startLocationUpdatesAsync('FetchLocationInBackground', {
        accuracy: Location.Accuracy.Balanced,
        timeInterval: 3000,
        distanceInterval: 1,
        foregroundService: {
          notificationTitle: 'Live Tracker',
          notificationBody: 'Live Tracker is on.'
        }
      });
    }
  }



  const _askForLocationPermission = async () => {
    (async () => {
      let { status } = await Location.requestBackgroundPermissionsAsync();
      if (status !== 'granted') {
        setgpsErrorMsg('Permission to access location was denied');
      }
    })();
  };


  return(
    <View>
      <Text></Text>
    </View>
  )
};

TaskManager.defineTask('FetchLocationInBackground', ({ data, error }) => {
  if (error) {
    console.log("Error bg", error)
    return;
  }
  if (data) {
    const { locations } = data;
    console.log("BGGGG->", locations[0].coords.latitude, locations[0].coords.longitude);
  }
});




export default App;

【问题讨论】:

  • 你能添加你的代码吗?
  • @FrancescoClementi 我添加了代码
  • 您使用的是什么 SDK 版本的 expo?我认为在 40 岁以上这对于请求权限将不再有效?

标签: android react-native geolocation location expo


【解决方案1】:

我遇到了完全相同的问题,并通过使用 EventEmitter 将位置更新分派到 UI 组件来解决这个问题。

文件顶部:

import EventEmitter from 'EventEmitter'

const locationEmitter = new EventEmitter();

didMount:

locationEmitter.on(LOCATION_UPDATE, (locationData) => {
    console.log('locationEmitter locationUpdate fired! locationData: ', locationData);
    let coordinatesAmount = locationData.newRouteCoordinates.length - 1;
    this.setState({
        latitude: locationData.newRouteCoordinates[coordinatesAmount - 1].latitude,
        longitude: locationData.newRouteCoordinates[coordinatesAmount - 1].longitude,
        routeCoordinates: this.state.routeCoordinates.concat(locationData.newRouteCoordinates)
    })
})

componentWillUnmount:

locationEmitter.off(LOCATION_UPDATE);

内部后台任务定义:

locationEmitter.emit(LOCATION_UPDATE, locationData)

这成功从后台任务发送位置数据,但我仍然卡在如何使后台任务更频繁地发送位置更新批次的问题。我的相关帖子是here

【讨论】:

  • 您使用的是什么 EventEmitter 库?我看到很多人使用 fbemitter。在 SDK40 中,我必须在 react-native 中创建一个继承自 NativeEventEmitter 的自定义发射器。这似乎工作正常。
  • 我使用命令“npm install EventEmitter”安装了 EventEmitter 库,并按照上面的代码 sn-p 将其导入。这似乎是几个库的某种父名称,因为在我的 node_modules 文件夹中,我可以找到“event-emitter”、“eventemitter3”和“EventEmitter”。无论如何,它完成了它的工作,这是最重要的! :-)
猜你喜欢
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2017-11-24
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
相关资源
最近更新 更多