jimmy Posté(e) 8 août 2010 Share Posté(e) 8 août 2010 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 More sharing options...
LauCass Posté(e) 10 août 2010 Share Posté(e) 10 août 2010 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 More sharing options...
jimmy Posté(e) 11 août 2010 Auteur Share Posté(e) 11 août 2010 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 More sharing options...
jimmy Posté(e) 12 août 2010 Auteur Share Posté(e) 12 août 2010 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 More sharing options...
LauCass Posté(e) 12 août 2010 Share Posté(e) 12 août 2010 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 More sharing options...
jimmy Posté(e) 12 août 2010 Auteur Share Posté(e) 12 août 2010 Merci beaucoup LauCass! Je vais me pencher un peu plus dans la doc pour comprendre un peu mieux les concepts d'android. Lien vers le commentaire Partager sur d’autres sites More sharing options...
jimmy Posté(e) 14 août 2010 Auteur Share Posté(e) 14 août 2010 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 More sharing options...
jimmy Posté(e) 16 août 2010 Auteur Share Posté(e) 16 août 2010 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 More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.