Kokiyas25 Posté(e) 24 janvier 2011 Share Posté(e) 24 janvier 2011 Bonjour à tous, Je souhaiterais que mon application teste périodiquement le niveau de ma batterie et envoie un SMS en dessous d'un certain seuil. Le test du niveau de batterie fonctionne, l'nevoie de SMS aussi mais le problème c'est que je n'arrive pas à tester périodiquement la batterie. J'utilise pourtant scheduleAtFixedRate dans laquelle je passe en paramétre une tâche préalablement créée "TimerTask task = new TimerTask(){" mais rien ne se passe. Ci dessous mon code (j'ai glissé des toast un peu partout histoir de voir si tel ou tel morceau de code était bien utilisé). Si quelqu'un peut m'aider merci beaucoup package android.telephony.gsm; import java.util.Timer; import java.util.TimerTask; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class sms extends Service { //private Timer timer; public void onCreate(){ //Création du toast// Context context = getApplicationContext(); int duration = Toast.LENGTH_LONG; String msg="Battery ALerting activated"; Toast toast=Toast.makeText(context, msg, duration); toast.show(); } public void onStart(final Intent intent, int startId){ super.onStart(intent, startId); Log.d(this.getClass().getName(), "onStart"); //initialisation des variables pour calcul de la charge de la batterie// int level = intent.getIntExtra("level",-1); int maxValue= intent.getIntExtra ("scale",-1); int chargedPct = (level * 100)/maxValue; //création du toast pour afficher la charge Context context = getApplicationContext(); int duration = Toast.LENGTH_LONG; String msgcharge="Charge =" + chargedPct ; Toast toast2=Toast.makeText(context, msgcharge, duration); toast2.show(); Timer timer = new Timer(); String Stimer="timer =" + timer ; Toast toast3=Toast.makeText(context, Stimer, duration); toast3.show(); // Création de la tâche qui sera lancée périodiquement //class launchsms extends TimerTask{ TimerTask task = new TimerTask(){ public void run () { //initialisation des variables pour calcul de la charge de la batterie// int level = intent.getIntExtra("level",-1); int maxValue= intent.getIntExtra ("scale",-1); int chargedPct = (level * 100)/maxValue; //création du toast pour afficher la charge Context context = getApplicationContext(); int duration = Toast.LENGTH_LONG; String msgcharge="Charge2 =" + chargedPct ; Toast toast2=Toast.makeText(context, msgcharge, duration); toast2.show(); //envoie des SMS sur condition// if (chargedPct >= 50 ) { final android.telephony.SmsManager sms = android.telephony.SmsManager.getDefault(); sms.sendTextMessage ("numéro de tel",null,"Charge de la batterie supérieur à 50%",null,null); } if (chargedPct < 50 ) { final android.telephony.SmsManager sms = android.telephony.SmsManager.getDefault(); sms.sendTextMessage ("numéro de tel",null,"Charge de la batterie inférieur à 50%, vous devriez recharger",null,null); } } }; //lancement période que la tâche timer.scheduleAtFixedRate(task,1000,6000); timer.cancel(); String S2timer="timer =" + timer; Toast toast4=Toast.makeText(context, S2timer, duration); toast4.show(); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Naskel Posté(e) 25 janvier 2011 Share Posté(e) 25 janvier 2011 Salut, timer.scheduleAtFixedRate(task,1000,6000); timer.cancel(); le timer.cancel me parait bizarre Lien vers le commentaire Partager sur d’autres sites More sharing options...
jokamax Posté(e) 25 janvier 2011 Share Posté(e) 25 janvier 2011 +1 Naskel API : void cancel() Terminates this timer, discarding any currently scheduled tasks. Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 25 janvier 2011 Share Posté(e) 25 janvier 2011 Il n'y a pas que le cancel() qui est bizarre: - le nom du package dans lequel se situe ta classse (android.telephony.gsm), qui est un package Android: pas une bonne idée de réutiliser le nom d'un package existant - la façon dont tu récupères l'état de la batterie; si on fait abstraction du cancel(), au mieux, ton timer va récupérer l'état de la batterie en "scannant" régulièrement le même Intent (celui qui a servi à lancer le service). Or, la doc Android indique que l'intent d'état de la batterie (ACTION_BATTERY_CHANGED) ne peut être récupéré que en s'enregistrement explicitement en tant que brodcastReceiver (ce qui voudrait dire que l'on est alors notifié en temps réel du changement d'état de la batterie, et qu'un timer n'est même pas nécessaire) Lien vers le commentaire Partager sur d’autres sites More sharing options...
ichpa Posté(e) 25 janvier 2011 Share Posté(e) 25 janvier 2011 Bonjour, Comme le dit chpil, dans tous les cas, l'utilisation d'un java.util.Timer n'est pas adaptée dans ton cas. Tu risques de vider la batterie et en plus Android peut décider de tuer ton Service. java.util.Timer est utile pour les petites tâches récursives de mise à jour (un chronomètre dans l'interface graphique typiquement). Pour les vérifications périodiques en tâche de fond, il faut privilégier l'utilisation de android.app.AlarmManager (prévu pour et moins énergivore). Dans ton cas, il y'a encore mieux, il faut que tu instancie dans ton service un broadcast receiver qui intercepte les événements ACTION_BATTERY_CHANGED. Comme ça ton traitement ne se lance que lorsque l'état de la battery est modifié. Bon courage, ichpa Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.