Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-12-2024
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 571
Poder: 19
jhonalone Va por buen camino
Hola.
Actualizo información:

Buscando, buscando... he encontrado esta página.
Estoy intentando acceder al directorio de los archivos persistentes de la App, (donde sospecho que están grabadas las notificaciones pendientes). Aunque mucho me temo que no voy a ser capaz. Os comunicaré si lo logro.
Agradecería un poquito de ayuda, si alguien sabe cómo listar los archios del directorio.

Un saludo.
__________________
"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
  #2  
Antiguo 17-12-2024
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 78
Poder: 8
dani36652 Va camino a la fama
Hola tendrás un ejemplo en código que me puedas compartir explicando el problema y lo que buscas que haga o no la app ?
Sobre eso me baso y ya te ayudo te parece?
Responder Con Cita
  #3  
Antiguo 17-12-2024
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 571
Poder: 19
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
  #4  
Antiguo 18-12-2024
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 78
Poder: 8
dani36652 Va camino a la fama
Lo reviso

Última edición por dani36652 fecha: 18-12-2024 a las 00:53:02. Razón: Respuesta errónea
Responder Con Cita
  #5  
Antiguo 18-12-2024
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 78
Poder: 8
dani36652 Va camino a la fama
Hola qué tal? Ayer llegué a tu casa tarde y no me dió tiempo de analizarlo hasta hoy en la oficina...
Intenta esto, espero que te funcione:
Código Delphi [-]
uses
  {$IFDEF ANDROID}
  Androidapi.JNI.Webkit, FMX.VirtualKeyboard,
  Androidapi.JNI.Print, Androidapi.JNI.Util,
  fmx.Platform.Android, System.Android.Notification,
  Androidapi.jni,fmx.helpers.android, Androidapi.Jni.app,
  Androidapi.Jni.GraphicsContentViewText, Androidapi.JniBridge,
  Androidapi.JNI.Os, Androidapi.Jni.Telephony,
  Androidapi.JNI.JavaTypes,Androidapi.Helpers,
  Androidapi.JNI.Widget,System.Permissions, Androidapi.Jni.Embarcadero,
  FMX.DialogService,Androidapi.Jni.Provider,Androidapi.Jni.Net,
  fmx.TextLayout,AndroidAPI.JNI.Support,
 {$ENDIF}

procedure Borra_Notifi(Id : String; FH : String); // Este procedimiento ya lo tienes
function ExtractName(const AStr: string): string; // Se crea esta nueva funcion

Código Delphi [-]
procedure TForm1.Borra_Notifi(Id, FH: String); //Tu procedimiento quedaría así:

  function DateTimeLocalToUnixMSecGMT(const ADateTime: TDateTime): Int64;
  begin
    Result := DateTimeToUnix(ADateTime) * MSecsPerSec - Round(TTimeZone.Local.UtcOffset.TotalMilliseconds);
  end;
var
  NotificationsList: TStringList;
  Notifications: JString;
  I: Integer;
  Found: Boolean;
  PreferenceEditor: JSharedPreferences_Editor;
  FPreference: JSharedPreferences;
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;

    (*
      Elimina la notificación mediante el nombre a nivel nativo
    *)
    FPreference := TAndroidHelper.Context.getSharedPreferences(TJNotificationAlarm.JavaClass.NOTIFICATION_CENTER, TJContext.JavaClass.MODE_PRIVATE);
    NotificationsList := TStringList.Create;
    try
      Notifications := FPreference.getString(TJNotificationAlarm.JavaClass.SETTINGS_NOTIFICATION_IDS, nil);
      NotificationsList.Text := JStringToString(Notifications);
      I := 0;
      Found := False;
      while not Found and (I < NotificationsList.Count) do
        if ExtractName(NotificationsList[i]) = Id then
          Found := True
        else
          Inc(I);

      if Found then
      begin
        PreferenceEditor := FPreference.edit;
        try
          NotificationsList.Delete(I);
          PreferenceEditor.putString(TJNotificationAlarm.JavaClass.SETTINGS_NOTIFICATION_IDS, StringToJString(NotificationsList.Text));
        finally
          PreferenceEditor.commit;
        end;
      end;
    finally
      NotificationsList.Free;
    end;

    //Cancela la notificación mediante el TNotificationCenter
    NotificationC.CancelNotification(Id);
end;
Responder Con Cita
  #6  
Antiguo 18-12-2024
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 571
Poder: 19
jhonalone Va por buen camino
Hola Dani. Muchas gracias por la generosidad con que me regalas tu tiempo, tu esfuerzo y tus conocimientos.
No puedo probar tu código.
Creo que se te ha olvidado copiar la declaración de la función ExtractName();
Quizá así no sea necesaria esta función:
Código Delphi [-]
procedure TForm1.Borra_Notifi(Id, FH: String); //Tu procedimiento quedaría así:

  function DateTimeLocalToUnixMSecGMT(const ADateTime: TDateTime): Int64;
  begin
    Result := DateTimeToUnix(ADateTime) * MSecsPerSec - Round(TTimeZone.Local.UtcOffset.TotalMilliseconds);
  end;
var
  NotificationsList: TStringList;
  Notifications: JString;
  I: Integer;
  Found: Boolean;
  PreferenceEditor: JSharedPreferences_Editor;
  FPreference: JSharedPreferences;
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;

    (*
      Elimina la notificación mediante el nombre a nivel nativo
    *)
    FPreference := TAndroidHelper.Context.getSharedPreferences(TJNotificationAlarm.JavaClass.NOTIFICATION_CENTER, TJContext.JavaClass.MODE_PRIVATE);
    NotificationsList := TStringList.Create;
    try
      Notifications := FPreference.getString(TJNotificationAlarm.JavaClass.SETTINGS_NOTIFICATION_IDS, nil);
      NotificationsList.Add(JStringToString(Notifications));
      I := 0;
      Found := False;
      while not Found and (I < NotificationsList.Count) do
        if NotificationsList[i] = Id then
          Found := True
        else
          Inc(I);

      if Found then
      begin
        PreferenceEditor := FPreference.edit;
        try
          NotificationsList.Delete(I);
          PreferenceEditor.putString(TJNotificationAlarm.JavaClass.SETTINGS_NOTIFICATION_IDS, StringToJString(NotificationsList.Text));
        finally
          PreferenceEditor.commit;
        end;
      end;
    finally
      NotificationsList.Free;
    end;

    //Cancela la notificación mediante el TNotificationCenter
    NotificationC.CancelNotification(Id);
end;
Un cordial saludo.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10)
"...si no tengo caridad, nada soy..." (1 Cor 13,1-13)

Última edición por jhonalone fecha: 18-12-2024 a las 18:50:51.
Responder Con Cita
  #7  
Antiguo 18-12-2024
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 571
Poder: 19
jhonalone Va por buen camino
Hola, Dani.
Lamento comunicarte que la aplicación se sigue comportando igual con el cambio que has realizado en en la cancelación de las notificaciones a nivel nativo.

Sigo pensando que quedan registradas en la memoria interna del terminal, en algún sitio que no sabemos. No es en la caché pues se disparan despues de borrarla.

Gracias, de nuevo por tu esfuerzo.
Un saludo.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10)
"...si no tengo caridad, nada soy..." (1 Cor 13,1-13)

Última edición por jhonalone fecha: 18-12-2024 a las 20:25:14.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Notificaciones en Android Ricardo2010 Desarrollo en Delphi para Android 1 25-03-2021 08:21:02
poner un acceso directo en la barra de notificaciones de android? farute Desarrollo en Delphi para Android 2 16-01-2018 09:27:32
Notificaciones aplicacion android aposi Desarrollo en Delphi para Android 1 10-03-2016 17:58:53
Aplicación por debajo de la barra de notificaciones? Android 5.5'' wolfran_hack Desarrollo en Delphi para Android 6 08-03-2016 19:59:32
envio de Notificaciones "Push" a un dispositivo iOS/Android kaiserilich Desarrollo en Delphi para iOS/OSX 6 01-10-2015 10:15:58


La franja horaria es GMT +2. Ahora son las 22:15:07.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi