Ver Mensaje Individual
  #5  
Antiguo 17-12-2024
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 560
Reputación: 18
jhonalone Va por buen camino
Hola, Dani.
Millones de gracias por tu ofrecimiento. Acabo de llegar a casa y he visto tu respuesta.

Intentaré explicar el problema lo más posible sin extenderme mucho.(Si es posible)

El objeto de la App consiste en registrar unos eventos futuros (Reuniones, Citas Médicas, Visitas, Cumpleaños... etc), con el fin de que el celular te los recuerde con una notificación local.

Cuando tenía la app muy avanzada, se me ocurrió que podría generar unos avisos previos, con la antelación seleccionada por el usuario, y también unas repeticiones de los avisos (a elección voluntaria).

Cuando tenía ambas cosas implementadas, quise darle al usuario la opción de no escuchar todos los preavisos ni todas las repeticiones. Así que implementé una opción para truncar los avisos en cualquier momento.

Si el usuario trunca los avisos, anulamos las notificaciones pendientes para que no se disparen.

El código está correcto. Anulamos una a una, por su identificador, las alarmas que no se han disparado.

¡¡SORPRESA!! A pesar de estar anuladas, se siguen disparando a su hora correspondiente.

Empiezo a repasar código, a imvestigar, a hacer montones de pruebas... y llego a la siguiente conclusión:

CUANDO HAY VARIAS ALARMAS EN LA MISMA FECHA, SI SE DISPARA LA PRIMERA, YA NO ES POSIBLE ANULAR POR CÓDIGO EL RESTO, SE SIGUEN DISPARANDO, AUNQUE LAS HAYAS BORRADO.

Curiosamente, cuando las borras todas, (por código), la MAS TARDÍA, la última que debía dispararse, es LA UNICA que se borra.

Después de las observaciones publicadas en mis dos mensajes anteriores, he llegado a la conclusión de que Aandroid las tiene registradas en la carpeta de datos interna, donde guarda toda la información y los permisos de la aplicación y no las borra.

SI BORRAS LAS NOTIFICACIONES ANTES DE QUE SE HAYA DISPARADO LA PRIMERA DEL DÍA, SE BORRAN TODAS CORRECTAMENTE.

Mi última idea es acceder a ésa carpeta INTERNA desde la aplicación y ver si se pueden borrar alli.

Código de generación de la notificación:
Código Delphi [-]
procedure TForm1.Crear_Notificacion(Sujeto, Ir_A, Motivo , Dia, Hora, Notif_ID : String);
var
   vNotification : TNotification;
   Fecha : TdateTime;

begin
      try

       // Borra_Notifi(Notif_ID,Dia+' '+Hora); No es necesario si no cambia vNotification.Name
        vNotification := NotificationC.CreateNotification;

        vNotification.Title := Sujeto;
        vNotification.AlertBody := Motivo+Ir_A;
        vNotification.EnableSound := true;
        vNotification.Name := Notif_ID;
        Fecha := strToDateTime(Dia+' '+Hora);

        vNotification.FireDate:= Fecha;

        NotificationC.ScheduleNotification(vNotification);

      finally
       vNotification.Free;
      end;

end;

Código de anulación:
Código Delphi [-]
procedure TForm1.Borra_Notifi(Id : String; FH : String);
    function DateTimeLocalToUnixMSecGMT(const ADateTime: TDateTime): Int64;
    begin
      Result := DateTimeToUnix(ADateTime) * MSecsPerSec - Round(TTimeZone.Local.UtcOffset.TotalMilliseconds);
    end;

begin
    if  DateTimeLocalToUnixMSecGMT(Now) > DateTimeLocalToUnixMSecGMT(StrToDateTime(FH))
    then Exit; // Si la notificación es anterior no hace nada
   // ShowMessage('Borramos...'+Id+'=='+FH); para controlar que se ha borrado
    NotificationC.RequestPermission;
    NotificationC.CancelNotification(ID);
end;

Quizás me extendí demasiado, espero que se entienda el problema. Si queda alguna duda, hámelo saber.

En cualquier caso, MUCHAS GRACIAS POR TU INTERÉS.

Un saludo muy cordial.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10)
"...si no tengo caridad, nada soy..." (1 Cor 13,1-13)
Responder Con Cita