Геолокация React Native HeadlessJS не работает

#java #android #react-native #geolocation #background-process

Вопрос:

Я установил службу геолокации react-native и заставил ее работать, но моя безголовая версия не регистрирует никаких сообщений.

 //LocationService.java
package com.myApp.service;
import android.content.Intent;
import android.os.Bundle;
import com.facebook.react.HeadlessJsTaskService;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.jstasks.HeadlessJsTaskConfig;
import javax.annotation.Nullable;
//creating the service class
public class LocationService extends HeadlessJsTaskService {
    @Override
    protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null){
            return new HeadlessJsTaskConfig(
                "LocationService", //JS function to call
                Arguments.fromBundle(extras),
                5000, // timeout for the task
                true
            );
        }
        return null;
    }
}
 
 //MainApplication.java
...
import android.location.LocationManager;
import android.location.LocationListener;
import android.location.Location;
import com.myApp.service.LocationService;
import android.content.Context;
import android.os.Bundle;
import android.content.Intent;
import com.facebook.react.HeadlessJsTaskService;
...
private final LocationListener listener = new LocationListener() {
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras){
    }
        
    @Override
    public void onProviderEnabled(String provider){
    }
        
    @Override
    public void onProviderDisabled(String provider){
    }
        
    @Override
    public void onLocationChanged(Location location){
        Intent myIntent = new Intent(getApplicationContext(), LocationService.class);
        getApplicationContext().startService(myIntent);
            
        HeadlessJsTaskService.acquireWakeLockNow(getApplicationContext());
    }
};

@Override
  public void onCreate() {
    super.onCreate();
        
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, listener); // Start requesting for location
        
    SoLoader.init(this, /* native exopackage */ false);
    initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
  }
 

Насколько я понимаю, requestLocationUpdates(..., 2000, 0, ...) будет запрашивать обновление каждые 2 секунды, независимо от изменения расстояния.

 //AndroidManifest.xml
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<application
...
<service android:name="com.myApp.service.LocationService" />
...
/application>
 
 //LocationService.js
import Geolocation from 'react-native-geolocation-service';

module.exports = async (data) => {
    Geolocation.getCurrentPosition(
        (position) => {
            console.log(position.coords);
        },
        (error) => {
            console.log(error.code, error.message);
        },
        { enableHighAccuracy: true, timeout: 5000, maximumAge: 10000, forceRequestLocation: true }
    );
}
 
 //index.js
import LocationService from './src/services/LocationService';
AppRegistry.registerHeadlessTask('LocationService', () => LocationService);
AppRegistry.registerComponent(appName, () => App);
 

Извините за стену текста, но я не могу найти, где я ошибаюсь в этой безголовой задаче. Я могу вручную запросить свое местоположение по телефону Geolocation.getCurrentPosition(...) , но он должен автоматически регистрировать местоположение каждые 2 секунды, насколько я понимаю.

Комментарии:

1. github.com/transistorsoft/react-native-background-geolocation Используйте Эту Библиотеку

2. В Каком Устройстве Вы Пытаетесь Протестировать? dontkillmyapp.com Пожалуйста, Проверьте Это Также. Headlesstask не будет работать особенно для Служб Определения Местоположения В Убитом Состоянии. Поскольку Устройства Теперь Предпочитают Оптимизацию Теста. ОС Убивает Ту Службу, Которая Разряжает Батарею.

3. Я Пробовал То Же Самое В Течение 3 Часов С Интервалом. Но не все устройства поддерживаются. После ОС Android 8/9 Предпочтение Оптимизации Батареи Больше. Я тестировал в Xiaomi 6 Pro, 9 и Samusng. Вы можете столкнуться с проблемой при сборке, а не во время тестирования, потому что устройство подключено к зарядному устройству.

4. Существует 90% шансов, что обслуживание будет остановлено после того, как Процент заряда батареи устройства опустится ниже 60%