Периодический отчет о местоположении устройства с помощью флаттера

Мне нужно сообщить текущее местоположение устройства с помощью приложения Flutter. Мне нужно делать это постоянно, даже когда приложение закрыто. В настоящее время я реализовал это с помощью background_fetch, который выполняет свою работу примерно каждые 15 минут. Он хорошо работает, когда приложение открыто или свернуто. Но когда приложение закрыто, оно работает в режиме Headless и не работает. Исключение составляет:

MissingPluginException(No implementation found for method getLocation on channel lyokone/location)

Похоже, что в режиме Headless не все приложения загружаются в память. Я понятия не имею, как это решить.

Также я пробовал использовать Isolate, но столкнулся с новым исключением:

native function 'Window_sendPlatformMessage' (4 arguments) cannot be found.

Кто-нибудь знает, как решить эти проблемы, или есть новая идея для отслеживания местоположения?


person mehrdad seyrafi    schedule 08.09.2019    source источник


Ответы (1)


Другой вариант - использовать пакет https://github.com/Lyokone/flutterlocation https://github.com/Lyokone/flutterlocation/wiki/Background-Location-Updates < br> Поддержка Чтобы получать обновления местоположения, даже если ваше приложение закрыто, https://github.com/Lyokone/flutterlocation/wiki/Background-Location-Updates могут содержать ошибки

Также от Transistorsoft и предоставляет Android Headless Mod, но требуется лицензия
пакет transistorsoft https://github.com/transistorsoft/flutter_background_geolocation/wiki/Android-Headless-Mode
Android Headless Mod https://github.com/transistorsoft/flutter_background_geolocation/wiki/Android-Headless-Режим

фрагмент кода

import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg;

void headlessTask(bg.HeadlessEvent headlessEvent) async {
  print('[BackgroundGeolocation HeadlessTask]: $headlessEvent');
  // Implement a 'case' for only those events you're interested in.
  switch(headlessEvent.name) {
    case bg.Event.TERMINATE:
      bg.State state = headlessEvent.event;
      print('- State: $state');
      break;
    case bg.Event.HEARTBEAT:
      bg.HeartbeatEvent event = headlessEvent.event;
      print('- HeartbeatEvent: $event');
      break;
    case bg.Event.LOCATION:
      bg.Location location = headlessEvent.event;
      print('- Location: $location');
      break;
    case bg.Event.MOTIONCHANGE:
      bg.Location location = headlessEvent.event;
      print('- Location: $location');
      break;
    case bg.Event.GEOFENCE:
      bg.GeofenceEvent geofenceEvent = headlessEvent.event;
      print('- GeofenceEvent: $geofenceEvent');
      break;
    case bg.Event.GEOFENCESCHANGE:
      bg.GeofencesChangeEvent event = headlessEvent.event;
      print('- GeofencesChangeEvent: $event');
      break;
    case bg.Event.SCHEDULE:
      bg.State state = headlessEvent.event;
      print('- State: $state');
      break;
    case bg.Event.ACTIVITYCHANGE:
      bg.ActivityChangeEvent event = headlessEvent.event;
      print('ActivityChangeEvent: $event');
      break;
    case bg.Event.HTTP:
      bg.HttpEvent response = headlessEvent.event;
      print('HttpEvent: $response');
      break;
    case bg.Event.POWERSAVECHANGE:
      bool enabled = headlessEvent.event;
      print('ProviderChangeEvent: $enabled');
      break;
    case bg.Event.CONNECTIVITYCHANGE:
      bg.ConnectivityChangeEvent event = headlessEvent.event;
      print('ConnectivityChangeEvent: $event');
      break;
    case bg.Event.ENABLEDCHANGE:
      bool enabled = headlessEvent.event;
      print('EnabledChangeEvent: $enabled');
      break;
  }
}

void main() {
  runApp(HelloWorld());
  // Register your headlessTask:
  BackgroundGeolocation.registerHeadlessTask(headlessTask);
}
person chunhunghan    schedule 09.09.2019