Alarma de proximidad disparando dos veces después de retirar y volver a agregar

Tengo un problema con la alerta de proximidad. Tengo ajustes en mi aplicación androide donde los usuarios pueden desactivar / activar la alerta de proximidad de algunas ubicaciones. Cuando desactivan la alerta de proximidad todo funciona bien y no se les notificará, pero si desactivan y vuelven a habilitar la alerta de proximidad, se agrega de nuevo y obtendrán una notificación dos veces cuando lleguen a una ubicación y así sucesivamente. Así que básicamente cada vez que lo vuelven a habilitar, crea una nueva alerta de proximidad.

Este es el código que utilizo para eliminar la alerta de proximidad:

private void removeProximityAlert(int id) { final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE ); Intent intent = new Intent(PROX_ALERT_INTENT + id); PendingIntent proximityIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_CANCEL_CURRENT); manager.removeProximityAlert(proximityIntent); } 

Y este es el código que utilizo para agregar una alerta de proximidad:

 private void addProximityAlert(double latitude, double longitude, int id, int radius, String title) { final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE ); Intent intent = new Intent(PROX_ALERT_INTENT + id); PendingIntent proximityIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_CANCEL_CURRENT); manager.addProximityAlert( latitude, longitude, radius, -1, proximityIntent ); IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT + id); registerReceiver(new ProximityIntentReceiver(id, title), filter); } 

Mi comprensión de FLAG_CANCEL_CURRENT es que le dice al sistema que la antigua intención pendiente ya no es válida y que debería cancelarla y luego crear una nueva. Corrígeme si estoy equivocado. Esto, creo, es la razón por la que está duplicando las alertas de proximidad con cada cancelación y creación.

Resolución:

En su removeProximityAlert cambiaría la línea siguiente

 PendingIntent proximityIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

a:

 PendingIntent proximityIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT).cancel(); 

FLAG_UPDATE_CURRENT devuelve el existente creado, si lo hay. cancel() debe hacerse cargo del resto para usted.


Editar

Si rompo el cancel() en una línea separada yo no consigo ningún error. Prueba esto:

 PendingIntent proximityIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT); proximityIntent.cancel(); 

El problema es que estás registrando el receptor cada vez que agregas la alarma. Deberá registrarlo sólo una vez.

  • ¿Por qué locationmanager devuelve viejas correcciones de ubicación con new gettime-timestamp?
  • ¿Cómo funciona getAltitude () de Android GPS Location Works
  • Cómo utilizar Android LocationManager y Listener
  • Ubicación de Android getBearing () devuelve siempre 0
  • Cómo obtener una referencia a LocationManager dentro de un fragmento
  • Inicio de LocationManager como servicio Android
  • LocationManager.isProviderEnabled (LocationManager.NETWORK_PROVIDER) no es fiable, ¿por qué?
  • Forzar la alerta de proximidad para usar Proveedor de red
  • Permiso de comprobación de Android para LocationManager
  • Android: envía los datos de la ubicación en segundo plano periódicamente (cada 30 segundos) y solicita al servidor nuevos datos
  • Android GPS Localización Velocidad no fiable
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.