flutter_background_geolocation 4.13.1 flutter_background_geolocation: ^4.13.1 copied to clipboard
The most sophisticated background location tracking & geofencing module with battery-conscious motion-detection intelligence for iOS and Android.
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_background_geolocation/flutter_background_geolocation.dart'
as bg;
import 'package:background_fetch/background_fetch.dart';
import 'package:flutter_background_geolocation_example/app.dart';
import 'advanced/app.dart';
import 'hello_world/app.dart';
import 'config/transistor_auth.dart';
import 'config/env.dart';
/// Receive events from BackgroundGeolocation in Headless state.
@pragma('vm:entry-point')
void backgroundGeolocationHeadlessTask(bg.HeadlessEvent headlessEvent) async {
print('📬 --> $headlessEvent');
switch (headlessEvent.name) {
case bg.Event.BOOT:
bg.State state = await bg.BackgroundGeolocation.state;
print("📬 didDeviceReboot: ${state.didDeviceReboot}");
break;
case bg.Event.TERMINATE:
bg.State state = await bg.BackgroundGeolocation.state;
if (state.stopOnTerminate!) {
// Don't request getCurrentPosition when stopOnTerminate: true
return;
}
try {
bg.Location location =
await bg.BackgroundGeolocation.getCurrentPosition(
samples: 1,
extras: {
"event": "terminate",
"headless": true
}
);
print("[getCurrentPosition] Headless: $location");
} catch (error) {
print("[getCurrentPosition] Headless ERROR: $error");
}
break;
case bg.Event.HEARTBEAT:
try {
bg.Location location = await bg.BackgroundGeolocation.getCurrentPosition(
samples: 2,
timeout: 10,
extras: {
"event": "heartbeat",
"headless": true
}
);
print('[getCurrentPosition] Headless: $location');
} catch (error) {
print('[getCurrentPosition] Headless ERROR: $error');
}
break;
case bg.Event.LOCATION:
bg.Location location = headlessEvent.event;
print(location);
break;
case bg.Event.MOTIONCHANGE:
bg.Location location = headlessEvent.event;
print(location);
break;
case bg.Event.GEOFENCE:
bg.GeofenceEvent geofenceEvent = headlessEvent.event;
print(geofenceEvent);
break;
case bg.Event.GEOFENCESCHANGE:
bg.GeofencesChangeEvent event = headlessEvent.event;
print(event);
break;
case bg.Event.SCHEDULE:
bg.State state = headlessEvent.event;
print(state);
break;
case bg.Event.ACTIVITYCHANGE:
bg.ActivityChangeEvent event = headlessEvent.event;
print(event);
break;
case bg.Event.HTTP:
bg.HttpEvent response = headlessEvent.event;
print(response);
break;
case bg.Event.POWERSAVECHANGE:
bool enabled = headlessEvent.event;
print(enabled);
break;
case bg.Event.CONNECTIVITYCHANGE:
bg.ConnectivityChangeEvent event = headlessEvent.event;
print(event);
break;
case bg.Event.ENABLEDCHANGE:
bool enabled = headlessEvent.event;
print(enabled);
break;
case bg.Event.AUTHORIZATION:
bg.AuthorizationEvent event = headlessEvent.event;
print(event);
bg.BackgroundGeolocation.setConfig(
bg.Config(url: "${ENV.TRACKER_HOST}/api/locations"));
break;
}
}
/// Receive events from BackgroundFetch in Headless state.
@pragma('vm:entry-point')
void backgroundFetchHeadlessTask(HeadlessTask task) async {
String taskId = task.taskId;
// Is this a background_fetch timeout event? If so, simply #finish and bail-out.
if (task.timeout) {
print("[BackgroundFetch] HeadlessTask TIMEOUT: $taskId");
BackgroundFetch.finish(taskId);
return;
}
print("[BackgroundFetch] HeadlessTask: $taskId");
try {
var location = await bg.BackgroundGeolocation.getCurrentPosition(
samples: 2,
extras: {
"event": "background-fetch",
"headless": true
}
);
print("[location] $location");
} catch(error) {
print("[location] ERROR: $error");
}
SharedPreferences prefs = await SharedPreferences.getInstance();
int count = 0;
if (prefs.get("fetch-count") != null) {
count = prefs.getInt("fetch-count")!;
}
prefs.setInt("fetch-count", ++count);
print('[BackgroundFetch] count: $count');
BackgroundFetch.finish(taskId);
}
void main() {
WidgetsFlutterBinding.ensureInitialized();
/// Application selection: Select the app to boot:
/// - AdvancedApp
/// - HelloWorldAp
/// - HomeApp
///
SharedPreferences.getInstance().then((SharedPreferences prefs) {
String? appName = prefs.getString("app");
// Sanitize old-style registration system that only required username.
// If we find a valid username but null orgname, reverse them.
String? orgname = prefs.getString("orgname");
String? username = prefs.getString("username");
if (orgname == null && username != null) {
prefs.setString("orgname", username);
prefs.remove("username");
}
switch (appName) {
case AdvancedApp.NAME:
runApp(new AdvancedApp());
break;
case HelloWorldApp.NAME:
runApp(new HelloWorldApp());
break;
default:
// Default app. Renders the application selector home page.
runApp(new HomeApp());
}
});
TransistorAuth.registerErrorHandler();
/// Register BackgroundGeolocation headless-task.
bg.BackgroundGeolocation.registerHeadlessTask(
backgroundGeolocationHeadlessTask);
/// Register BackgroundFetch headless-task.
BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask);
}