Я использовал Geofence для отслеживания местоположения пользователя вместо услуг. Местоположение пользователя обновляется, когда приложение находится в фоновом режиме или на переднем плане. Местоположение не обновляется, когда приложение удаляется из фона (состояние отмены).
Я тестировал на устройстве -
а) LG K10 - ОС 8
b) MI - OS 7 (разрешение на автозапуск включено)
Я перешел по ссылке, указанной ниже, для обновления местоположения с использованием Geofence.
1. https://github.com/googlesamples/android-play-location/tree/master/Geofencing
2. https://codelabs.developers.google.com/codelabs/background-location-updates-android-o/index.html?index=..%2F..index#0
Добавить геозону
@SuppressLint("MissingPermission")
fun addOrUpdateGeofence() {
try {
val sessionMgmt = SessionMgmt(context)
if (sessionMgmt.lat == "") return
removeGeofence()
val geofence = Geofence.Builder()
// Set the request ID of the geofence. This is a string to identify this geofence.
.setRequestId(geofenceId)
// Set the circular region of this geofence.
.setCircularRegion(sessionMgmt.lat.toDouble(), sessionMgmt.lng.toDouble(), GEOFENCE_RADIUS_IN_METERS)
// Set the expiration duration of the geofence. This geofence gets automatically
// removed after this period of time.
.setExpirationDuration(Geofence.NEVER_EXPIRE)
// Set the transition types of interest. Alerts are only generated for these
// transition. We track entry and exit transitions in this sample.
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT or Geofence.GEOFENCE_TRANSITION_DWELL)
// Create the geofence.
.setLoiteringDelay(GEOFENCE_LOITERING_DELAY)
.build()
val builder = GeofencingRequest.Builder()
// The INITIAL_TRIGGER_ENTER flag indicates that geofencing service should trigger a
// GEOFENCE_TRANSITION_ENTER notification when the geofence is added and if the device
// is already inside that geofence.
builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
// Add the geofences to be monitored by geofencing service.
builder.addGeofence(geofence)
// Return a GeofencingRequest.
// sendNotification("Adding Fence")
mGeofencingClient.addGeofences(builder.build(),
getGeofencePendingIntent()).addOnCompleteListener(this)
val location = Location("")
location.latitude = sessionMgmt.lat.toDouble()
location.longitude = sessionMgmt.lng.toDouble()
val updateLocation = UpdateLocation()
updateLocation.updateUserLocation(context, location)
updateLocation.updateUserLocationSpanish(context, location)
} catch (e: Exception) {
e.printStackTrace()
}
}
В ожидании намерения
private fun getGeofencePendingIntent(): PendingIntent? {
// Reuse the PendingIntent if we already have it.
if (mGeofencePendingIntent != null) {
return mGeofencePendingIntent as PendingIntent
}
val intent = Intent(context, GeofenceBroadcastReceiver::class.java)
// We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
// addGeofences() and removeGeofences().
mGeofencePendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
return mGeofencePendingIntent
}
Фактический результат
Геозона не вызывает триггер, когда приложение находится в отключенном состоянии.
Фактический результат
Запускается ли геозона, когда Appliaction находится в убитом состоянии. Если да, то почему Geofence не запускается