Aller au contenu

Clock widget


jimmy

Recommended Posts

Bonjour,

Je suis nouveau dans le dev android et j'essai de réaliser un widget donnant l'heure digitale mais j'ai quelque souci...

Voici mon code:

public class JimClock extends AppWidgetProvider {
   Timer timer = null;
   MyTime test = null;
   @Override
   public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
       if(timer == null){
           test = new MyTime(context, appWidgetManager);
           timer = new Timer();
           timer.scheduleAtFixedRate(test , 1,1000);
       }

   }

   @Override
   public void onReceive(Context context, Intent intent) {
       // v1.5 fix that doesn't call onDelete Action
       final String action = intent.getAction();
       if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
           final int appWidgetId = intent.getExtras().getInt(
                   AppWidgetManager.EXTRA_APPWIDGET_ID,
                   AppWidgetManager.INVALID_APPWIDGET_ID);
           if (appWidgetId != appWidgetManager.INVALID_APPWIDGET_ID) {
               this.onDeleted(context, new int[] { appWidgetId });
           }
       } else {
           super.onReceive(context, intent);
       }
   }

   private class MyTime extends TimerTask {
       RemoteViews remoteViews;
       AppWidgetManager appWidgetManager;
       ComponentName thisWidget;
       DateFormat format = SimpleDateFormat.getTimeInstance(
               SimpleDateFormat.SHORT, Locale.getDefault());
       DateFormat formatDate = DateFormat.getDateInstance(
                    DateFormat.LONG, Locale.getDefault());

       public MyTime(Context context, AppWidgetManager appWidgetManager) {
           this.appWidgetManager = appWidgetManager;

           if(remoteViews==null){
               this.remoteViews = new RemoteViews(context.getPackageName(),
                       R.layout.main);
               this.thisWidget = new ComponentName(context, JimClock.class);
           }
       }

       @Override
       public void run() {
           Date date = new Date();
           this.remoteViews.setTextViewText(R.id.widget_heure, ""+ format.format(date));
           this.appWidgetManager.updateAppWidget(this.thisWidget, this.remoteViews);

           this.remoteViews.setTextViewText(R.id.widget_date, formatDate.format(date));
           this.appWidgetManager.updateAppWidget(this.thisWidget, this.remoteViews);
           date = null;
       }
   }

}

Mon widget donne bien l'heure mais mon téléphone devient lent et se bloque.

Je voudrais aussi lors d'un clique afficher les alarmes système mais je n'ai pas d'idée de comment faire, j'ai vu pour les activity mais pas pour lancer une appli système.

Merci j'espère que vous pourrez m'aider

Jim

Lien vers le commentaire
Partager sur d’autres sites

La "bonne solution" pour rafraichir ton widget sans monopoliser les resources c'est d'enregistrer l'intent ACTION_TIME_TICK (voir ici: http://developer.android.com/reference/android/content/Intent.html). Vu qu'un widget est un receiver la méthode onReceive() sera invoquée toutes les minutes et tu peux donc rafraichir ton affichage à ce moment là.

Attention, cet intent ne peut être enregistré en le déclarant dans le manifest, il faut utiliser la méthode Context.registerReceiver().

Lien vers le commentaire
Partager sur d’autres sites

Bonjour et merci beaucoup pour votre réponse

J'ai donc créé mon Broadcast comme ceci :

    
public class TimeReceiver extends BroadcastReceiver{
       // Display an alert that we've received a message.    
       @Override 
       public void onReceive(Context context, Intent intent){

           time.setToNow();

       remoteViews.setTextViewText(R.id.widget_heure, ""+ time.hour+":"+time.minute);

       remoteViews.setTextViewText(R.id.widget_date, time.monthDay+"/"+(time.month+1)+"/"+time.year);
       manager.updateAppWidget(thisWidget, remoteViews);


      }
   }   

Qui sera appelé grâce au code ci-dessous dans le onReceive de mon widget :

TimeReceiver alarmReceiver = new TimeReceiver();

IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK);

context.registerReceiver(alarmReceiver , filter);

Le souci est que j'ai "force closed" je ne vois pas ou appeler ce code a part dans onReceive ou onUpdate mais le résultat est le même :(

EDIT : erreur eclipse android.content.ReceiverCallNotAllowedException: IntentReceiver components are not allowed to register to receive intents

De plus j'ai placé Log.v("emulator-5554", "ONRECEIVE"); dans mon onReceive (du widget) et je vois qu'il n'est appelé qu'une fois. Il faut configurer quelque chose pour qu'il soit appelé toutes les minutes?

Encore merci pour votre aide.

Jim

Lien vers le commentaire
Partager sur d’autres sites

Après quelques recherche je ne peux écouter mon évènement et faire mon broadcastreceiver dans mon widget...

La solution est de créer un service qui lui écoutera l'évènement si j'ai bien compris...

Il n'y pas d'autre solution? Car créer un service pour un widget qui donnera juste l'heure c'est peut beaucoup non?

Merci

Lien vers le commentaire
Partager sur d’autres sites

Oui, c'est ça. Le widget étant le BroadcastReceiver, il n'est pas possible de déclarer l'intent directement dans le code du widget. Je passe donc aussi par un service pour la déclaration de l'Intent en indiquant mon widget qui reçoit donc les notifications dans son onReceive. Je crée initialement le service dans le onUpdate du widget.

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

Je suis de retour, j'ai fais quelques recherches et je suis confronté à quelques problèmes.

J'essai de faire en sorte de lancer la page "alarmes" d'android au click sur le widget mais je ne trouve pas le bon Intent :(

J'ai réussi a lancer un appel au click grâce a

Uri uri = Uri.parse("tel:**********");
Intent intent = new Intent(Intent.ACTION_CALL,uri);
PendingIntent pendingintent = PendingIntent.getActivity(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.TextView01, pendingintent);
appWidgetManager.updateAppWidget(appWidgetIds[0], views);

Comment je peut lancer la page d'alarmes?

Et ou je peut trouver les infos pour lancer autre chose que les alarmes?

Merci de votre aide.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Ma solution pour ouvrir la page des alarmes :

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName("com.android.deskclock","com.android.deskclock.AlarmClock");
PendingIntent pendingintent = PendingIntent.getActivity(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.TextView01, pendingintent);
appWidgetManager.updateAppWidget(appWidgetIds[0], views);

Pour trouver le nom de package et le nom de classe a fournir a setClassName j'ai regardé dans l'onglet logCat d'eclipse

qui montre toutes les process ouvert avec nom de package et de class. Une autre solution est de regarder la doc...

J'espère que cela aidera d'autre.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...