flutter_background_geolocation 1.3.2 flutter_background_geolocation: ^1.3.2 copied to clipboard
The most sophisticated background location-tracking & geofencing module with battery-conscious motion-detection intelligence for iOS and Android.
CHANGELOG #
1.3.2 - 2019-10-24 #
- [Fixed] Resolve Dart analysis warnings related to
@deprecated
.
1.3.1 - 2019-10-23 #
- [Fixed] Android NPE
Caused by: java.lang.NullPointerException:
at com.transistorsoft.locationmanager.service.TrackingService.b (TrackingService.java:172)
at com.transistorsoft.locationmanager.service.TrackingService.onStartCommand (TrackingService.java:135)
- [Added] new
uploadLog
feature for uploading logs directly to a server. This is an alternative toemailLog
. - [Changed] Migrated logging methods
getLog
,destroyLog
,emailLog
to newLogger
module. See docs for more information. Existing log methods onBackgroundGeolocation
are now@deprecated
. - [Changed] All logging methods (
getLog
,emailLog
anduploadLog
) now accept an optionalSQLQuery
. Eg:
SQLQuery query = new SQLQuery(
start: DateTime.parse('2019-10-23 09:00'),
end: DateTime.parse('2019-10-23 19:00'),
limit: 1000,
order: SQLQuery.ORDER_ASC
);
String log = await Logger.getLog(query)
Logger.emailLog('foo@bar.com', query);
Logger.uploadLoad('http://your.server.com/logs', query);
1.3.0 - 2019-10-17 #
- [Fixed] Android: Fixed issue executing
#changePace
immediately after#start
. - [Fixed] Android: Add guard against NPR in
calculateMedianAccuracy
- [Added] Add new Geofencing methods:
#getGeofence(identifier)
and#geofenceExists(identifier)
. - [Fixed] iOS issue using
disableMotionActivityUpdates: false
withuseSignificantChangesOnly: true
andreset: true
. Plugin will accidentally ask for Motion Permission. - [Fixed] Resolved a number of Android issues exposed by booting the app in StrictMode. This should definitely help alleviate ANR issues related to
Context.startForegroundService
. - [Added] Android now supports
disableMotionActivityUpdates
for Android 10 which now requires run-time permission for "Physical Activity". Setting totrue
will not ask user for this permission. The plugin will fallback to using the "stationary geofence" triggering, like iOS. - [Changed] Android: Ensure all code that accesses the database is performed in background-threads, including all logging (addresses
Context.startForegroundService
ANR issue). - [Changed] Android: Ensure all geofence event-handling is performed in background-threads (addresses
Context.startForegroundService
ANR issue). - [Added] Android: implement logic to handle operation without Motion API on Android 10. v3 has always used a "stationary geofence" like iOS as a fail-safe, but this is now crucial for Android 10 which now requires run-time permission for "Physical Activity". For those users who [Deny] this permission, Android will trigger tracking in a manner similar to iOS (ie: requiring movement of about 200 meters). This also requires handling to detect when the device has become stationary.
[1.2.4] - 2019-09-20 #
- [Fixed] flutter@1.9.1 deprecated a method
FlutterMain.findBundleAppPath(Context)
, replacing with a new signature the receives noContext
. Changing to the new signature breaks people using < flutter 1.9.1. Will use old signature for now. - [Fixed] Custom layouts were not working properly for older OS version < O. Custom layout will use setBigContentLayout now. The user will be able to expand the notification to reveal the custom layout.
[1.2.3] - 2019-09-16 #
- [Changed] Bump background_fetch version to 0.3.0
- [Changed] Android: move more location-handling code into background-threads to help mitigate against ANR referencing
Context.startForegroundService
- [Changed] Android: If BackgroundGeolocation adapter is instantiated headless and is enabled, force ActivityRecognitionService to start.
- [Added] Add
mock
tolocationTemplate
data. - [Added] Android now adds 2 extra setup steps. (1) The plugin now hosts its own
proguard-rules.pro
which must be manually added toapp/build.gradle
. (2) The plugin now hosts its own custom gradle file which must also be manuallyapply from
in yourapp/build.gradle
. This extra gradle file contains a simple method to strip the SDK's debug sound-effects from your release build (1.5M):
android/app/build.gradle
📂 android/app/build.gradle
:
// flutter_background_geolocation
+Project background_geolocation = project(':flutter_background_geolocation')
// 1. Extra gradle file
+apply from: "${background_geolocation.projectDir}/background_geolocation.gradle"
android {
.
.
.
buildTypes {
release {
.
.
.
minifyEnabled true
// 2. background_geolocation requires custom Proguard Rules when used with minifyEnabled
+ proguardFiles "${background_geolocation.projectDir}/proguard-rules.pro"
}
}
}
[1.2.2] - 2019-09-05 #
- [Changed] Rebuild iOS
TSLocationManager.framework
with XCode 10 (previous build used XCode 11-beta6). Replace@available
macro withSYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO
. - [Fixed] iOS 13 preventSuspend was not working with iOS 13. iOS has once again decreased the max time for UIApplication beginBackgroundTask from 180s down to 30s.
- [Fixed] Android
Geofences.extras
not being provided to#onGeofencesChange
event (issue #110). - [Fixed] iOS 10 provides
bool
attributes asint
inState
. CheckruntimeType == int
. Issue #111. - [Changed] Upgrade
android-logback
dependency to2.0.0
- [Changed] Android: move some plugin initialization into background-threads (eg:
performLogCleanup
) to help mitigate against ANR "Context.startForegroundService
did not then callService.startForeground
".
[1.2.1] - 2019-08-22 #
- [Fixed] Android Initial headless events can be missed when app booted due to motion transition event.
- [Fixed] Android crash with EventBus
Subscriber already registered error
. - [Fixed] iOS
Crash: [TSHttpService postBatch:error:] + 6335064 (TSHttpService.m:253)
[1.2.0] - 2019-08-17 #
- [Added] iOS 13 support.
[1.1.0] - 2019-08-07 #
- [Fixed] Android Geofence
DWELL
transition (notifyOnDwell: true
) not firing. - [Fixed] iOS
logMaxDays
was hard-coded to7
; Config option not being respected. - [Added] Android
Q
support (API 29) with new location permission modelWhen In Use
. Android now supports the config optionlocationAuthorizationRequest
which was traditionally iOS-only. Also, Android Q now requires runtime permission from user forACTIVITY_RECOGNITION
. - [Changed] Another Android tweak to mitigate against error
Context.startForegroundService() did not then call Service.startForeground()
. - [Changed] Add new Android gradle config parameter
appCompatVersion
to replacesupportLibVersion
for better AndroidX compatibility. IfappCompatVersion
is not found, the plugin's gradle file falls back to oldsupportLibVersion
.
[1.0.12] - 2019-07-23 #
- [Fixed] Found a few more cases where Android callbacks are being executed in background-thread. References issue #70.
[1.0.11] - 2019-07-10 #
- [Fixed] Android issue running enabledchange event in background-thread with flutter 1.7
[1.0.10] - 2019-06-25 #
- [Fixed] iOS / Android issues with odometer and
getCurrentPosition
when used withmaximumAge
constraint. Incorrect, old location was being returned instead of latest available. - [Fixed] Some Android methods were executing the callback in background-thread, exposed when using flutter dev channel (
#insertLocation
,#getLocations
,#getGeofences
,#sync
). - [Fixed] Add
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
toDeviceSettings
request for Android 9 compatibility. - [Changed] Tweaks to Android services code to help guard against error
Context.startForegroundService() did not then call Service.startForeground()
. - [Fixed] iOS manual
sync
crash in simulator while executing callback when error response is returned from server.
[1.0.9] - 2019-06-17 #
- [Fixed] Android bug with
getCurrentPosition
andmaximumAge
, Fixes #80. - [Fixed] Odometer issues: clear odometer reference location on
#stop
,#startGeofences
. - [Fixed] Odometer issues: Android must persist its odometer reference location since the foreground-service is no longer long-lived and the app may be terminated between motionchange events.
- [Fixed] Return
Service.START_REDELIVER_INTENT
fromHeartbeatService
. Fixes #79 to preventnull
Intent being delivered toHeartbeatService
. - [Added] Implement Android LocationSettingsRequest. Determines if device settings is currently configured according to the plugin's desired-settings (eg: gps enabled, location-services enabled). If the device settings differs, an automatic dialog will perform the required settings changes automatically when user clicks [OK].
- [Fixed] Android
triggerActivities
was not implemented refactor of1.x
.
[1.0.8] - 2019-06-04 #
- [Fixed] Android
destroyLocations
callback was being executed in background-thread. - [Fixed] When Android geofence API receives a
GEOFENCE_NOT_AVAILABLE
error (can occur is Wifi is disabled), geofences must be re-registered. - [Fixed] Android
Config.disableStopDetection
was not implemented.
[1.0.7] - 2019-05-13 #
- [Fixed] Android issue with Firebase Adapter support not working when app is terminated.
[1.0.6] - 2019-05-12 #
- [Added] New Android config
Config.scheduleUseAlarmManager
to force Android scheduler to use more preciseAlarmManager
instead ofJobScheduler
. - [Added] Support for background_geolocation_firebase adapter.
[1.0.5] - 2019-05-10 #
- [Changed] Rollback
android-permissions
version back to0.1.8
. It relies onsupport-annotations@28
. This isn't a problem if one simply upgrades theirtargetSdkVersion
but the support calls aren't worth the hassle, since the latest version doesn't offer anything the plugin needs.
[1.0.4] - 2019-05-09 #
- [Changed] Update docs.
[1.0.3] - 2019-05-08 #
- [Fixed] Dart analysis warnings, re: initializing null values in new Notification class.
[1.0.2] - 2019-05-08 #
- [Fixed] iOS: changing
pauseslocationUpdatesAutomatically
was not being applied. - [Changed]
reset
parameter provided to#ready
has now been default totrue
. This causes too many support issues for people using the plugin the first time. - [Fixed] Android threading issue where 2 distinct
SingleLocationRequest
were issued the same id. This could result in the foreground service quickly starting/stopping untillocationTimeout
expired. - [Fixed] Android issue where geofences could fail to query for new geofences-in-proximity after a restart.
- [Fixed] Android issues re-booting device with location-services disabled or location-authorization revoked.
- [Added] Implement support for Custom Android Notification Layouts.
- [Fixed] Android bug where Service repeatedly stops / starts after rebooting device with plugin in moving state.
- [Fixed] Android scheduler bug. When app is terminated & restarted during a scheduled ON period, tracking-service does not restart.
- [Fixed] Android headless
heartbeat
events were failing (incorrectContext
was supplied to the event).
[1.0.1] - 2019-04-09 #
- [Fixed] iOS: Incorrect return type BOOL from native method stopBackgroundTask. Should have been int.
- [Changed] Add Geofence test panel in example Settings screen. Allows to add a series of test-geofences along the iOS simulator Freeway Drive route.
[1.0.0] - 2019-04-05 #
- [RELEASE] Release 1.0.0
[1.0.0-rc.4] - 2019-03-31 #
- [Fixed] Android: Another
NullPointerException
withBundle#getExtras
.
[1.0.0-rc.3] - 2019-03-29 #
- [Fixed] Android
NullPointerException
withBundle#getExtras
(#674). - [Fixed] Android not persisting
providerchange
location when location-services re-enabled.
[1.0.0-rc.2] - 2019-03-27 #
- [Fixed] An Android foreground-service is launched on first install and fails to stop.
[1.0.0-rc.1] - 2019-03-25 #
Breaking Changes #
- [Changed] The license format has changed. New
1.0.0
licenses are now available for customers in the product dashboard.
Fixes #
- [Fixed] iOS missing native
destroyLog
implementation (thanks to @joserocha3) - [Fixed] Missing Dart implementation for
requestPermission
method (thanks to @joserocha3) - [Fixed] Logic bugs in MotionActivity triggering between stationary / moving states.
- [Fixed] List.map Bug in Dart api
addGeofences
.
New Features #
- [Added] Android implementation for
useSignificantChangesOnly
Config option. Will request Android locations without the persistent foreground service. You will receive location updates only a few times per hour:useSignificantChangesOnly: true
:
useSignificantChangesOnly: false
:
-
[Added] Android now implements a "stationary geofence", just like iOS. It currently acts as a secondary triggering mechanism along with the current motion-activity API. You will hear the "zap" sound effect when it triggers. This also has the fortunate consequence of allowing mock-location apps (eg: Lockito) of being able to trigger tracking automatically.
-
[Added] The SDK detects mock locations and skips trigging the
stopTimeout
system, improving location simulation workflow. -
[Added] Android-only Config option
geofenceModeHighAccuracy
for more control over geofence triggering responsiveness. Runs a foreground-service during geofences-only mode (#startGeofences
). This will, of course, consume more power.
await BackgroundGeolocation.ready(Config
geofenceModeHighAccuracy: true,
desiredAccuracy: Config.DESIRED_ACCURACY_MEDIUM,
locationUpdateInterval: 5000,
distanceFilter: 50
));
BackgroundGeolocation.startGeofences();
- [Added] Android implementation of
startBackgroundTask
/stopBackgroundTask
. This implementation uses a foreground-service. I've tried using Android'sJobService
but these tasks are queued by the OS and run only periodically.
// an Android foreground-service has just launched (in addition to its persistent notification).
int taskId = await BackgroundGeolocation.startBackgroundTask();
// Do any work you like -- it's guaranteed to run, regardless of background/terminated.
// Your task has exactly 30s to do work before the service auto-stops itself.
// Execute an HTTP request to test an async operation.
String url = "http://tracker.transistorsoft.com/devices?company_token=$_username";
String result = await http.read(url).then((String result) {
print("[http test] success: $result");
// Terminate the foreground-service.
BackgroundGeolocation.stopBackgroundTask(taskId);
}).catchError((dynamic error) {
print("[http test] failed: $error");
// Always be sure to stop your tasks, just like iOS.
BackgroundGeolocation.stopBackgroundTask(taskId);
});
Logging for background-tasks looks like this (when you see an hourglass, a foreground-service is active)
[BackgroundTaskManager onStartJob] ⏳ startBackgroundTask: 6
.
.
.
[BackgroundTaskManager$Task stop] ⏳ stopBackgroundTask: 6
- [Added] New custom Android debug sound FX. More documentation will be added to the docs but here's a basic description from the code:
public static final String LOCATION_RECORDED = OOOOIII;
public static final String LOCATION_SAMPLE = CLICK_TAP_DONE;
public static final String LOCATION_ERROR = DIGI_WARN;
public static final String MOTIONCHANGE_FALSE = MARIMBA_DROP;
public static final String MOTIONCHANGE_TRUE = CHIME_SHORT_CHORD_UP;
public static final String STATIONARY_GEOFENCE_EXIT = ZAP_FAST;
public static final String STOP_TIMER_ON = CHIME_BELL_CONFIRM;
public static final String STOP_TIMER_OFF = BELL_DING_POP;
public static final String HEARTBEAT = PEEP_NOTE;
public static final String GEOFENCE_ENTER = BEEP_TRIP_UP_DRY;
public static final String GEOFENCE_DWELL = BEEP_TRIP_UP_ECHO;
public static final String GEOFENCE_EXIT = BEEP_TRIP_DRY;
public static final String WARNING = DIGI_WARN;
public static final String ERROR = MUSIC_TIMPANI_ERROR;
⚠️ These debug sound FX consume about 1.4MB in the plugin's tslocationmanager.aar
. These assets can easily be stripped in your release
builds by adding the following gradle task to your app/build.gradle
(I'm working on an automated solution within the context of the plugin's build.gradle
; so far, no luck). Big thanks to @mikehardy.
/**
* Purge flutter_background_geolocation debug sounds from release build.
*/
def purgeBackgroundGeolocationDebugResources(applicationVariants) {
applicationVariants.all { variant ->
if (variant.buildType.name == 'release') {
variant.mergeResources.doLast {
delete(fileTree(dir: variant.mergeResources.outputDir, includes: ['raw_tslocationmanager*']))
}
}
}
}
android {
//Remove debug sounds from background_geolocation plugin
purgeBackgroundGeolocationDebugResources(applicationVariants)
compileSdkVersion rootProject.ext.compileSdkVersion
.
.
.
}
Removed #
- [Changed] Removed Android config option
activityRecognitionInterval
. The Android SDK now uses the more modern ActivityTransistionClient API which is a higher level wrapper for the traditional ActivityReconitionClient.AcitvityTransitionClient
does not accept a pollinginterval
, thusactiivtyRecognitionInterval
is now unused. Also,ActivityTransitionClient
emits similaron_foot
,in_vehicle
events but no longer provides aconfidence
, thusconfidence
is now reported always as100
. If you've been implementing your own custom triggering logic based uponconfidence
, it's now pointless. TheActivityTransitionClient
will open doors for new features based upon transitions between activity states.
╔═════════════════════════════════════════════
║ Motion Transition Result
╠═════════════════════════════════════════════
╟─ 🔴 EXIT: walking
╟─ 🎾 ENTER: still
╚═════════════════════════════════════════════
Maintenance #
- [Changed] Update
android-permissions
dependency to0.1.8
.