我一直在一个团队工作,在 Flutter 中开发一个应用程序。我们需要使用 GPS 跟踪行进的距离,但挑战在于 Flutter 不再允许前景和背景位置跟踪(即使准确度很差)。
根据对最新 Google 指南的审查,似乎 Google 应该允许我们的应用在后台跟踪设备,但事实并非如此。事实上,一两个月前,打开前台和后台位置服务似乎开始起作用了。我们已经尝试了 location
和 geolocation
软件包,但都无济于事。当应用程序在后台时,它们中的任何一个都会立即停止跟踪,当应用程序返回到前台时,我们的位置会发生很大的跳跃。
...
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
...
...
serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!serviceEnabled) {
return Future.error('Location services are disabled.');
}
permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied) {
return Future.error('Location permissions are denied');
}
}
//Permission returns denied Location
//this is due to the background permission in the android manifest
//turn off background permission and the permission is allowed
if (permission == LocationPermission.deniedForever)
return Future.error(
'Location permissions are permanently denied, we cannot request permissions.');
}
...
_serviceEnabled = await location.serviceEnabled();
if (!_serviceEnabled) {
_serviceEnabled = await location.requestService();
if (!_serviceEnabled) {
print('Service could not be enabled');
return false;
}
// This code throws and exception even if I respond to the
// Google prompts and I select allow location service and all the time access
try {
await location.enableBackgroundMode(enable: true);
} catch(error) {
print("Can't set background mode");
}
任何有关如何实现这一目标的指导将不胜感激。
答案 0 :(得分:0)
Flutter 本身仍然不支持后台本地化。
我看过一些 Android 特有的表单,但没有任何效果。
但积极寻找,我发现了这个库:
https://pub.dev/packages/flutter_background_geolocation
这是一个付费库,用于生产(对于 android 密钥。iOS 是免费的)。而且效果很好。
尽管有成本(这是独一无二的,终生的),但成本效益非常好。
强烈推荐。
注意:他们的文档和支持很棒。
答案 1 :(得分:0)
目前,我正在使用 background_fetch 因为每个人都负担不起 flutter_background_geolocation 定价 顺便说一句,这个插件也来自同一家公司
background_fetch: ^0.7.2
到目前为止,它在 Android 中运行良好,在 ios 中运行良好,但在 ios 中,苹果的后台进程算法需要一段时间才能使用,然后在苹果中也可以正常运行。
这是链接-: https://pub.dev/packages/background_fetch
设置
int status = await BackgroundFetch.configure(
BackgroundFetchConfig(
minimumFetchInterval: 30,
stopOnTerminate: true,
enableHeadless: false,
startOnBoot: false,
requiresBatteryNotLow: false,
requiresCharging: false,
requiresStorageNotLow: false,
requiresDeviceIdle: false,
requiredNetworkType: NetworkType.NONE),
(taskId){
// This is the fetch-event callback.
},
(taskId){
// This task has exceeded its allowed running time.
// You must stop what you're doing and immediately finish(taskId)
});
print('[BackgroundFetch] configure success: $status');