#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%