在 flutter 后台从 android 中获取位置
Fetch location from android in background in flutter
我正在使用以下代码来跟踪用户的位置。
当我的应用程序在前台时,这可以正常工作。但是当我的应用程序移到后台时它停止工作并且我无法获得任何位置。
import 'dart:async';
import 'package:permission_handler/permission_handler.dart';
import 'package:geolocator/geolocator.dart';
class FetchLocation {
var geolocator = Geolocator();
var locationOptions = LocationOptions(accuracy: LocationAccuracy.high, distanceFilter: 10,forceAndroidLocationManager: true,timeInterval: 1);
void trackGeoLocation()async{
final PermissionStatus permission = await PermissionHandler()
.checkPermissionStatus(PermissionGroup.location);
if(permission == PermissionStatus.granted){
fetchLocation();
}else{
askPermission();
}
}
void askPermission() {
PermissionHandler().requestPermissions([PermissionGroup.locationAlways]).then(__onStatusRequested);
}
void __onStatusRequested(Map<PermissionGroup, PermissionStatus> statuses){
final status = statuses[PermissionGroup.locationWhenInUse];
print(status);
if(status == PermissionStatus.restricted || status == PermissionStatus.neverAskAgain){
} else if(status == PermissionStatus.denied){
askPermission();
}else{
fetchLocation();
}
}
void fetchLocation(){
StreamSubscription<Position> positionStream = geolocator.getPositionStream(locationOptions).listen(
(Position position) {
print(position == null ? 'Unknown' : position.latitude.toString() + ', ' + position.longitude.toString());
});
}
}
您可能受到了 Android 8 (API 26) 带来的限制的阻碍,这些限制限制了后台应用程序检索当前位置的频率。
引入此功能是为了节省电量,但这意味着您需要有一个可见的通知,以便 Android 将应用程序视为在前台。否则它只会在应用程序处于后台时每小时检索几次位置。
https://developer.android.com/about/versions/oreo/background-location-limits 为您提供了更多背景信息(请原谅双关语)。
我正在使用以下代码来跟踪用户的位置。 当我的应用程序在前台时,这可以正常工作。但是当我的应用程序移到后台时它停止工作并且我无法获得任何位置。
import 'dart:async';
import 'package:permission_handler/permission_handler.dart';
import 'package:geolocator/geolocator.dart';
class FetchLocation {
var geolocator = Geolocator();
var locationOptions = LocationOptions(accuracy: LocationAccuracy.high, distanceFilter: 10,forceAndroidLocationManager: true,timeInterval: 1);
void trackGeoLocation()async{
final PermissionStatus permission = await PermissionHandler()
.checkPermissionStatus(PermissionGroup.location);
if(permission == PermissionStatus.granted){
fetchLocation();
}else{
askPermission();
}
}
void askPermission() {
PermissionHandler().requestPermissions([PermissionGroup.locationAlways]).then(__onStatusRequested);
}
void __onStatusRequested(Map<PermissionGroup, PermissionStatus> statuses){
final status = statuses[PermissionGroup.locationWhenInUse];
print(status);
if(status == PermissionStatus.restricted || status == PermissionStatus.neverAskAgain){
} else if(status == PermissionStatus.denied){
askPermission();
}else{
fetchLocation();
}
}
void fetchLocation(){
StreamSubscription<Position> positionStream = geolocator.getPositionStream(locationOptions).listen(
(Position position) {
print(position == null ? 'Unknown' : position.latitude.toString() + ', ' + position.longitude.toString());
});
}
}
您可能受到了 Android 8 (API 26) 带来的限制的阻碍,这些限制限制了后台应用程序检索当前位置的频率。
引入此功能是为了节省电量,但这意味着您需要有一个可见的通知,以便 Android 将应用程序视为在前台。否则它只会在应用程序处于后台时每小时检索几次位置。
https://developer.android.com/about/versions/oreo/background-location-limits 为您提供了更多背景信息(请原谅双关语)。