PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile (précédentes versions) → Recherche d'information sur mise en place en JAVA-Android  d'un Broadcast Receiver - AlarmManager
Recherche d'information sur mise en place en JAVA-Android d'un Broadcast Receiver - AlarmManager
Débuté par J.P. SILVESTRE, 29 avr. 2018 14:02 - Aucune réponse
Membre enregistré
8 messages
Posté le 29 avril 2018 - 14:02
Dans un de mes projets je cherche à mettre en place en JAVA un système d'alarmes basé sur AlarmManager ...
Mais mes connaissances en JAVA sont assez limitées ... J'ai une erreur au moment de la réception de l'alarme uniquement lorsque l'application Android est fermée. La procédure appelProcedureWL n'est pas retrouvée !
Mes recherches sur internet n'ont pas permis de trouve une solution simple : aucun exemple fonctionnel en Windev Mobile (!) mais une multitude d'exemples en JAVA très souvent incompréhensibles pour un débutant en JAVA. Je suis donc "bloqué" !

Voici quelques éléments que j'ai mis en place :

J'ai ajouté dans le manifeste le receiver ainsi :
receiver
android:name = cm.shella.alarm.wdgen.GWDCPCOL_AlarmCalendar$AlarmReceiver
android:enabled = true
android:exported = true

Dans les classes et procédures JAVA, j'ai utilisé (entre autres choses) :

// les imports sont dans la procédure initialisation JAVA et classes diverses

// Déclencher une action quand un alarme est reçue par le BroadCast : 
public static class AlarmReceiver extends BroadcastReceiver {
public static final String ACTION_ALARM = "cm.shella.alarm.ACTION_ALARM";
@Override
public void onReceive(Context context, Intent intent) {
// lire les infos EXTRA
Bundle aInfos = intent.getExtras();
String messageN = aInfos.getString("Numero");
Context aContext = getApplicationContext();
try {
// vérifier l'origine de l'appel 
if (ACTION_ALARM.equals(intent.getAction())) {

// peut appeler la procédure pour ouvrir la fenêtre WINDEV
appelProcedureWL("COL_AlarmCalendar.AfficheAlarme",messageN);

// !§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§
// ERREUR ICI UNIQUEMENT LORSQUE L'APPLICATION EST FERMÉE
// JE N'ARRIVE PAS A CORRIGER CETTE  ERREUR D'UNE MANIERE SIMPLE
// !§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§


}
catch(Exception e) {
// Il y a ce message d'erreur quand l'application est fermée (ou non affichée) !!!
// Si l'application est ouverte il n'y a pas d'erreur ...

// pour récupèrer le message d'erreur
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String UneErreur = sw.toString().toUpperCase(); 
// pour être enregistrée dans un fichier ...
// procedure non mise ici...
// Ce message semble dire qu'il ne trouve pas appelProcedureWL

// signale une erreur
Context tmpContext = getApplicationContext();
Toast.makeText(tmpContext, "Erreur détectée", Toast.LENGTH_SHORT).show();

// !§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§
// JE N'ARRIVE PAS A CORRIGER CETTE  ERREUR D'UNE MANIERE SIMPLE
// !§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§!§

}
}
}


// Enregistrer une alarme : Une autre procédure appelle celle-ci 
// par exemple EnregistreAlarme(2, 1, 30000, 60000)
// 2 = Numéro de l'alarme, 1 = Type de l'alarme, 30000 = Démarre au bout de 30s,  90000 = Se répète toute les minutes

public String _JEnregistreAlarme(int IdAlarme, int UnType, int LeDepart, int UnIntervalle)
{ Context tmpContext = getApplicationContext();
try {
AlarmManager alarm;
Calendar cal;
PendingIntent aIntent;
Activity tmpActivity = getCurrentActivity();
cal = Calendar.getInstance();
alarm = (AlarmManager)tmpContext.getSystemService(tmpContext.ALARM_SERVICE);
Intent myIntent = new Intent(tmpContext,AlarmReceiver.class);
myIntent.setAction(ACTION_ALARM); // définie dans le Receiver
aIntent = PendingIntent.getBroadcast(tmpContext, IdAlarme, myIntent, 0);

// passer des infos pour reconnaître l'alarme
Bundle aInfos = new Bundle();
aInfos.putString("Numero", String.valueOf(IdAlarme));
myIntent.putExtras(aInfos);
aIntent = PendingIntent.getBroadcast(tmpContext, IdAlarme, myIntent, PendingIntent.FLAG_CANCEL_CURRENT);

// la ligne suivante change selon le paramètre UnType
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + LeDepart, UnIntervalle, aIntent);
 
// chaine renvoyée à Windev pour information à afficher
String LeRetour = String.valueOf(IdAlarme);  // non utilisé:  +" : "+aIntent.toString();
return LeRetour ;
}
catch(Exception e) {
Toast.makeText(tmpContext, "ERREUR dans enregistrement de l'Alarme "+String.valueOf(IdAlarme), Toast.LENGTH_LONG).show();
return "Erreur enregistrement Alarme "+String.valueOf(IdAlarme);
}
}


Je travaille actuellement en Windev Mobile 21...

J'aimerai bien savoir à quoi est due cette erreur et bien sûr comment la corriger le plus simplement.
J'ai bien trouvée une "solution" mais elle me parait vraiment complexe (et je ne suis pas sûr du fonctionnement sur tous les appareils android).

Merci à tous ceux qui ont pu mettre en place un tel système et qui me donneront les informations essentielles que je cherche.

--
J.P. Silvestre
Paris
Message modifié, 29 avril 2018 - 14:04