使用颤振的设备定期位置报告
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);
}
我需要使用 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);
}