Bonjour,

Je débute en programmation Android et pour m’entraîner je souhaite créer un widget simple qui affiche le niveau de batterie sous forme décimale dans un TextView. Je décris rapidement mon raisonnement (Corrigez moi si je me trompe), et je mets mon code à la fin.

- onUpdate() ne se mets à jour que toutes les 30 minutes minimum, hors j'aimerais une mise à jour plus régulière. Je me suis donc tourné vers onReceive() avec un IntentFilter(Intent.ACTION_BATTERY_CHANGED). J'ai mis le temps de rafraîchissement à 0 pour que l'AppWidget ne soit pas màj avec onUpdate(), et j'ai déclaré mon AppWidget comme receiver dans la méthode onUpdate() qui n'est appelée qu'à la création de l'AppWidget.

Maintenant, les problèmes : dans onUpdate j'utilise this.registerReceiver, qui demande un BroadcastReceiver. Or je ne vois pas comment en obtenir un. De plus j'aimerais pouvoir récupérer le niveau de batterie à la création de l'AppWidget afin qu'il affiche immédiatement la bonne valeur. Or il me faut un Intent, et encore une fois je ne vois pas comment en obtenir un dans onUpdate(). A moins que onReceive() reçoive automatiquement une valeur lorsqu'on enregistre l'AppWidget comme receiver et initialise donc la valeur?

Ça fait maintenant plusieurs jours que je retourne le problème dans tous les sens mais je n'arrive à rien. J'ai d'autres problèmes ensuite, mais je m'intéresse surtout à la mise à jour de la valeur pour le moment. Est ce que je m'y prend mal peut être?

Merci pour votre aide.



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.IsiTech.WidgetBattery;
 
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.widget.RemoteViews;
import android.widget.TextView;
 
public class WidgetBatteryActivity extends AppWidgetProvider {
	static short batteryLevel = 50;
 
	//Uniquement à la création de l'AppWidget
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
	{
		 this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
 
		//On mets à jour le niveau de la batterie
		updateBattery();	//Besoin d'un Intent
 
		//On mets à jour les widgets
		updateAppWidgets(context, appWidgetManager, appWidgetIds);
	}
 
	//Lorsque l'AppWidget reçoit une notification
   	@Override
   	public void onReceive(Context context, Intent intent) {
   		updateBattery(intent);
 
   		batteryLevelTextView.setText(batteryLevel);
   	}
 
	/**
         * Mets à jour les AppWidgets
         * @param context
         * @param appWidgetManager
         * @param appWidgetIds
         */
	private static void updateAppWidgets(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
		final int N = appWidgetIds.length;
 
		// Pour chaque AppWidget
		for (int i = 0; i < N; i++) 
		{
			int appWidgetId = appWidgetIds[i];
			updateAppWidget(context, appWidgetManager, appWidgetId);
		}
	}
 
	/**
         * Mets à jour un AppWidget
         * @param context
         * @param appWidgetManager
         * @param appWidgetId
         */
	private static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) 
	{	
		// On récupère les Views de notre layout
		RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_battery);
 
		// Mise à jour du TextView
		String str = String.valueOf(batteryLevel);
		views.setTextViewText(R.id.battery_level, str);
 
		// Mise à jour de l'affichage
		appWidgetManager.updateAppWidget(appWidgetId, views);
	}
 
	/**
         * Récupère le niveau de la batterie et mets à jour l'objet
         * @param intent
         */
        private static void updateBattery(Intent intent) {
    	batteryLevel = (short) intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
    }
}