使用颤振的设备定期位置报告

Periodic location report of device using flutter

我需要使用 flutter 应用报告设备的当前位置。即使应用程序关闭,我也需要继续这样做。 我目前使用 background_fetch 实现它,它大约每 15 分钟执行一次。 它在应用程序打开或最小化时运行良好。但是当应用程序关闭时,它会在 Headless 模式下运行并且不起作用。例外是:

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

似乎在 Headless 模式下,并不是所有的应用程序都加载到内存中。我不知道如何解决它。

我也尝试过使用隔离,但我遇到了一个新的异常:

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

有人知道如何解决这些问题或有任何新的位置跟踪想法吗?

另一种选择是使用包 https://github.com/Lyokone/flutterlocation https://github.com/Lyokone/flutterlocation/wiki/Background-Location-Updates
支持即使您的应用程序已关闭也能获取位置更新,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 无头 Mod https://github.com/transistorsoft/flutter_background_geolocation/wiki/Android-Headless-Mode

代码片段

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);
}