Convenience library to receive user location updates and geofence events with minimal effort.
- supports Android 14
- receive updates on background
- receive updates if app got killed
- geofence updates (dwell, enter, exit)
- location updates
- configurable update intervals
-
Location permissions in AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
-
Google maps api key
<string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">YOUR_KEY</string>
- Create Receiver
class NotificationWorker : GeoFenceUpdateModule() {
override fun onGeofence(geofence: Geofence) {
Timber.v(, "onGeofence $geofence")
}
}
val geofence = Geofence(
id = UUID.randomUUID().toString(),
latitude = 51.0899232,
longitude = 5.968358,
radius = 30.0,
title = "Germany",
message = "Entered Germany",
transitionType = GEOFENCE_TRANSITION_ENTER
)
Geofencer(this).addGeofenceWorker(geofence, NotificationWorker::class.java) { /* successfully added geofence */ }
TODO: replace with worker
- Create Receiver
class LocationTrackerWorker : LocationTrackerUpdateModule() {
override fun onLocationResult(locationResult: LocationResult) {
Log.v(GeoFenceIntentService::class.java.simpleName, "onLocationResult $location")
}
}
LocationTracker.requestLocationUpdates(this, LocationTrackerWorker::class.java)
- Stop tracking
LocationTracker.removeLocationUpdates(requireContext())
- Create Receiver
public class NotificationWorker extends GeoFenceUpdateModule {
@Override
public void onGeofence(@NotNull Geofence geofence) {
Timber.d("onGeofence " + geofence);
}
}
Geofence geofence = new Geofence(
UUID.randomUUID().toString(),
51.0899232,
5.968358,
30.0,
"Germany",
"Entered Germany",
GEOFENCE_TRANSITION_ENTER);
Geofencer geofencer = new Geofencer(this);
geofencer.addGeofenceWorker(geofence, NotificationWorker.class,
() -> /* successfully added geofence */ Unit.INSTANCE);
- Create Receiver
public class LocationTrackerWorker extends LocationTrackerUpdateModule {
@Override
public void onLocationResult(@NotNull LocationResult location) {
Log.v(GeoFenceIntentService.class.getSimpleName(), "onLocationResult " + location); );
}
}
LocationTracker.INSTANCE.requestLocationUpdates(this, LocationTrackerWorker.class);
- Stop tracking
LocationTracker.INSTANCE.removeLocationUpdates(this);
implementation 'com.sprotte:Geolocator:latest'
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.exozet:Geolocator:latest'
implementation 'com.google.android.gms:play-services-location:17.0.0'
}
Default Location tracking update intervals can be overriden, by adding following parameter into your app/res/ - folder, e.g. app/res/config.xml
<!-- Location Tracker -->
<integer name="location_update_interval_in_millis">0</integer>
<integer name="location_fastest_update_interval_in_millis">0</integer>
<integer name="location_max_wait_time_interval_in_millis">0</integer>
<integer name="location_min_distance_for_updates_in_meters">0</integer>
<!-- Geofencer -->
<integer name="loitering_delay">1</integer>
<integer name="notification_responsiveness">1</integer>
<integer name="expiration_duration">-1</integer> // -1 == NEVER_EXPIRE
You can also set this values at runtime in some step before call method requestLocationUpdates
int interval = 1000;
int fastestInterval = 2000;
int priority = LocationRequest.PRIORITY_HIGH_ACCURACY;
int maxWaitTime = 10000;
int smallestDisplacement = 20;
LocationTrackerParams locationTrackerParams = new LocationTrackerParams(
interval, fastestInterval, priority, maxWaitTime, smallestDisplacement);
LocationTracker.INSTANCE.requestLocationUpdates(this, LocationTrackerService.class, locationTrackerParams);
LocationTrackerParams is a open class for kotlin or a not final class for java, so if you don't need to setup all params you can extend it.
- does not work when in doze mode #2
[AgnaldoNP] (https://github.com/AgnaldoNP)