CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: Varioflex con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: 9mm con ben 14 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 35 Thanks ricevuti nell'ultimo mese

Pagina 1 di 2 12 ultimoultimo
Ultima pagina
Visualizzazione dei risultati da 1 a 10 su 18
Discussione:

[Help] Widget Batteria

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Senior Droid L'avatar di monossido


    Registrato dal
    Jul 2009
    Località
    Padova
    Messaggi
    332

    Ringraziamenti
    11
    Ringraziato 17 volte in 14 Posts
    Predefinito

    [Help] Widget Batteria

    Ciao a tutti, ancora questo forum non è stato usato per aiuti tecnici sulla realizzazione di programmi, spero quindi che non sia il posto sbagliato.

    Sto cercando di iniziare a programmare qualcosina in java per android, sono abbastanza agli inizi sia con java che con la programmazione per android, fino a ieri avevo programmato solo in C

    Volevo intanto realizzare un semplice widget che mi faccia vedere la carica attuale della batteria per poi modificarlo con un'idea mia. Ho cercato qualche esempio e uno dei più semplici è stato questo. Posto il codice del file .java


    package lol.peoplepaidforthis.widget;

    import android.app.Service;
    import android.appwidget.AppWidgetManager;
    import android.appwidget.AppWidgetProvider;
    import android.content.BroadcastReceiver;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.IBinder;
    import android.widget.RemoteViews;

    public class BatteryMonitorWidget extends AppWidgetProvider
    {
    public void onUpdate( Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds )
    {
    // widgets cant register receivers, so make a service do it
    Intent asd = new Intent(context, BatteryMonitorReceiver.class);
    context.startService(asd);
    }

    public static class BatteryMonitorReceiver extends Service
    {
    public int currentBatteryLevel = 0;

    private BroadcastReceiver batteryReceiver = new BroadcastReceiver()
    {
    @Override
    public void onReceive( Context context, Intent intent )
    {
    currentBatteryLevel = intent.getIntExtra( "level", 0 );
    }
    };

    @Override
    public void onStart( Intent intent, int startId )
    {
    registerReceiver( batteryReceiver, new IntentFilter( Intent.ACTION_BATTERY_CHANGED ) );
    RemoteViews updateViews = new RemoteViews( getPackageName(), R.layout.main );
    // should fix the font size here
    updateViews.setTextViewText( R.id.condition, currentBatteryLevel +"%" );
    // change image here (if anyone ever sends me images) to denote different % filled
    //updateViews.setImageViewResource( R.id.ImageView01, R.drawable.battery_condition );

    ComponentName thisWidget = new ComponentName( this, BatteryMonitorWidget.class );
    AppWidgetManager manager = AppWidgetManager.getInstance( this );
    manager.updateAppWidget( thisWidget, updateViews );
    }

    @Override
    public IBinder onBind( Intent intent )
    {
    // TODO Auto-generated method stub
    return null;
    }

    }

    }


    Ecco il tutto sono riuscito a farlo funzionare ma semplicemente il widget non viene aggiornato!
    Da quello che ho capito in un file xml ho impostato i millisecondi di aggiornamento del widget e ad ogni update viene eseguito il codice che è dentro a onUpdate(...)
    lo sviluppatore originale dentro a onUpdate ha messo un ulteriore chiamata ad un altra classe come servizio (startService)

    il mio dubbio è che onUpdate venga considerato ma poi quando il sistema incontra startService dopo la prima volta il servizio non venga realmente avviato o riavviato perchè è già attivo
    infatti se cambio il livello di carica dell'emulatore e aggiungo un ulteriore widget la carica si aggiorna altrimenti no..

    D'altra parte da quello che ho capito non si può ricavare il livello di carica direttamente dalla classe principale del widget

    grazie
    Ultima modifica di Andrea; 02-02-10 alle 01:03
    www.lorenzobraghetto.com <-blog
    monossido at lorenzobraghetto.com <- jabber/mail
    http://twitter.com/monossido <-twitter

  2.  
  3. #2
    Androidiano


    Registrato dal
    Nov 2009
    Località
    Sondrio
    Messaggi
    232

    Ringraziamenti
    24
    Ringraziato 9 volte in 8 Posts
    Predefinito

    devi utilizzare un Alarm impostandolo per fare l'upload del widget: crei ovviamente un Intent e lo passi all'AlarmManager

  4. #3
    Androidiano


    Registrato dal
    Nov 2009
    Località
    Sondrio
    Messaggi
    232

    Ringraziamenti
    24
    Ringraziato 9 volte in 8 Posts
    Predefinito

    Esempio di codice per fare questo:

    Intent widgetUpdate = new Intent();
    widgetUpdate.setAction(AppWidgetManager.ACTION_APP WIDGET_UPDATE);
    widgetUpdate.setData(Uri.parse(ALARM_URI));
    PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Ultima modifica di Andrea; 02-02-10 alle 01:04

  5. #4
    Senior Droid L'avatar di monossido


    Registrato dal
    Jul 2009
    Località
    Padova
    Messaggi
    332

    Ringraziamenti
    11
    Ringraziato 17 volte in 14 Posts
    Predefinito

    ciao grazie della risposta, ma ho qualche problema ovviamente

    allora io ho provato a fare così dentro al onUpdate

    Intent widgetUpdate = new Intent(context, BatteryMonitorReceiver.class);
    widgetUpdate.setAction(AppWidgetManager.ACTION_APP WIDGET_UPDATE);
    PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarms.set(AlarmManager.RTC_WAKEUP , 1000 , newPending);

    context.startService(widgetUpdate);


    nell'intent widgetUpdate che hai messo anche te indico di aprire la classe BatteryMonitorReceiver.class
    setAction l'ho lasciato inalterato
    setData l'ho eliminato non credo mi serva no?
    newPending inalterato
    alarms inalterato
    poi credo manchi alarms.set no? il secondo valore di alarms.set da quello che ho capito è il tempo di refresh ma non ho ben capito in che formato passarglielo...millisecondi?

    poi ho fatto partire il servizio

    risultato uguale a prima senza nessun refresh

    altra cosa...in questo widget per la batteria molto più complesso non vedo nessun AlarmManager
    BatteryWidget.java - batterywidget - Project Hosting on Google Code

    spero di non aver detto un sacco di cavolate ma non trovo niente di preciso riguardo Alarm
    Ultima modifica di Andrea; 02-02-10 alle 01:04
    www.lorenzobraghetto.com <-blog
    monossido at lorenzobraghetto.com <- jabber/mail
    http://twitter.com/monossido <-twitter

  6. #5
    Administrator L'avatar di Andrea


    Registrato dal
    Nov 2008
    Messaggi
    3,368
    Smartphone
    Nexus S, myTouch Slide 4g

    Ringraziamenti
    143
    Ringraziato 880 volte in 323 Posts
    Predefinito

    Ciao a tutti, allora intanto vi comunico che ho installato un nuovo bbcode che permette il syntax highlight di java.. Basta scrivere
    [highlight=java]codice Java[/highlight]
    e tutto quello al suo interno viene interpretato come java.

    Per l'xml è simile :P

    A riguardo del thread invece posso dire che io uso l'xml per farlo ed ecco qui come:

    Ecco parte del manifest utile per definire due o tre cose:

    <receiver android:name=".VodafoneWidgetProvider" >
    <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_U PDATE" />
    <action android:name="android.intent.action.BOOT_COMPLETED " />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget" />
    </receiver>


    Come potete vedere sono in lista per ricevere android.appwidget.action.APPWIDGET_UPDATE ( mi servirà quindi che la classe VodafoneWidgetProvider faccia tutto cio che è necessario e che implementi i metodi corretti.

    Inoltre la riga con 6 definisce la configurazione del widget lato xml ( in questo caso il file è dentro res/xml/widget.xml )

    Ecco il file widget.xml

    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="140dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="1800000"
    android:initialLayout="@layout/booting"
    android:configure="it.itentropy.vodafone.VodafoneW idgetConfigure" >
    </appwidget-provider>


    Come potete vedere a linea 5 definiamo il valore di android:updatePeriodMillis. Con una breve ricerca vedrete che automaticamente ogni 1800 secondi ( mezz'ora ) android si preoccupa di chiamare VodafoneWidgetProvider ( perchè dal manifest gli abbiamo dato che riceve l'intent per l'update dei widgets )

    Twitter @veke87

  7. #6
    Androidiano


    Registrato dal
    Nov 2009
    Località
    Sondrio
    Messaggi
    232

    Ringraziamenti
    24
    Ringraziato 9 volte in 8 Posts
    Predefinito

    Andrea innanzitutto ottimo per l'highlight di codice java!
    In merito al refresh: certo, mettendolo nel file xml funziona ma a quanto ne so ha le seguenti limitazioni:
    - da android 1.6 in poi non puoi mettere valori sotto la mezzora
    - non puoi farlo cambiare all'utente a runtime

    ( Widget update frequency « Android And Me Forums )

  8. #7
    Androidiano


    Registrato dal
    Nov 2009
    Località
    Sondrio
    Messaggi
    232

    Ringraziamenti
    24
    Ringraziato 9 volte in 8 Posts
    Predefinito

    Quote Originariamente inviato da monossido Visualizza il messaggio
    ciao grazie della risposta, ma ho qualche problema ovviamente

    allora io ho provato a fare così dentro al onUpdate

    Intent widgetUpdate = new Intent(context, BatteryMonitorReceiver.class);
    widgetUpdate.setAction(AppWidgetManager.ACTION_APP WIDGET_UPDATE);
    PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarms.set(AlarmManager.RTC_WAKEUP , 1000 , newPending);

    context.startService(widgetUpdate);


    nell'intent widgetUpdate che hai messo anche te indico di aprire la classe BatteryMonitorReceiver.class
    setAction l'ho lasciato inalterato
    setData l'ho eliminato non credo mi serva no?
    newPending inalterato
    alarms inalterato
    poi credo manchi alarms.set no? il secondo valore di alarms.set da quello che ho capito è il tempo di refresh ma non ho ben capito in che formato passarglielo...millisecondi?

    poi ho fatto partire il servizio

    risultato uguale a prima senza nessun refresh

    altra cosa...in questo widget per la batteria molto più complesso non vedo nessun AlarmManager
    BatteryWidget.java - batterywidget - Project Hosting on Google Code

    spero di non aver detto un sacco di cavolate ma non trovo niente di preciso riguardo Alarm
    ah si certo... mancava una riga

    alarms.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), updatemillisecs, newPending);

    la parte data ti serve poi per distinguere (nell'onReceive) se la chiamata arriva dall'alarm o meno

    Se però vuoi solo fare qualcosa quando cambia lo stato della batteria non ti serve nulla di tutto ciò, in quanto android lancia un messaggio di stato batteria cambiato che puoi prendere associando l'evento nell'xml

  9. #8
    Administrator L'avatar di Andrea


    Registrato dal
    Nov 2008
    Messaggi
    3,368
    Smartphone
    Nexus S, myTouch Slide 4g

    Ringraziamenti
    143
    Ringraziato 880 volte in 323 Posts
    Predefinito

    Veramente ci sono dei trucchetti che permettono di far scegliere all'utente..

    Basta che fai scegliere all'utente dei tempi multipli della mezzora :P e poi controlli

    Twitter @veke87

  10. #9
    Senior Droid L'avatar di monossido


    Registrato dal
    Jul 2009
    Località
    Padova
    Messaggi
    332

    Ringraziamenti
    11
    Ringraziato 17 volte in 14 Posts
    Predefinito

    grazie ragazzi del supporto, ho voluto insistere con gli alarm e andando ad intuito un pò in modo empirico ce l'ho fatta! (so che è da evitare...meglio studiarsi per bene le cose ma il tempo è quello che è)

    qualche indicazione che può essere utile ha qualcuno
    partendo dal codice sopra ho dovuto creare 3 classi,
    quella principale per il widget dove imposto l'allarme e faccio partire il servizio
    quella che estende "service" dove in onStart registro il receiver
    e una che stende broadcastreceiver dove in onReceive prendo il livello della batteria e scrivo il widget

    ora si prosegue
    www.lorenzobraghetto.com <-blog
    monossido at lorenzobraghetto.com <- jabber/mail
    http://twitter.com/monossido <-twitter

  11. #10
    Androidiano


    Registrato dal
    Nov 2009
    Località
    Sondrio
    Messaggi
    232

    Ringraziamenti
    24
    Ringraziato 9 volte in 8 Posts
    Predefinito

    Quote Originariamente inviato da monossido Visualizza il messaggio
    grazie ragazzi del supporto, ho voluto insistere con gli alarm e andando ad intuito un pò in modo empirico ce l'ho fatta! (so che è da evitare...meglio studiarsi per bene le cose ma il tempo è quello che è)

    qualche indicazione che può essere utile ha qualcuno
    partendo dal codice sopra ho dovuto creare 3 classi,
    quella principale per il widget dove imposto l'allarme e faccio partire il servizio
    quella che estende "service" dove in onStart registro il receiver
    e una che stende broadcastreceiver dove in onReceive prendo il livello della batteria e scrivo il widget

    ora si prosegue
    Ottimo! Solo una considerazione come ottimizzazione... in realtà AppWidgetProvider estende BroadcastReceiver quindi le classi necessarie sarebbero solo 2: quella che estende AppWidgetProvider e quella che estende Service

Pagina 1 di 2 12 ultimoultimo
Ultima pagina

Discussioni simili

  1. widget batteria
    Da armandopoli nel forum Motorola Milestone
    Risposte: 2
    Ultimo messaggio: 28-01-10, 14:09
  2. Widget Weather Forecast, ottimo set di widget per il meteo APK
    Da androidworldpress nel forum Le Applicazioni per Android
    Risposte: 5
    Ultimo messaggio: 27-01-10, 08:49
  3. 3 Widget
    Da Fra87 nel forum Acer Serie Liquid Z
    Risposte: 0
    Ultimo messaggio: 15-12-09, 07:31
  4. widget
    Da wickerman93 nel forum HTC Dream / Tmobile G1
    Risposte: 2
    Ultimo messaggio: 27-11-09, 19:46
  5. Htc Widget
    Da OneMan nel forum HTC Magic
    Risposte: 5
    Ultimo messaggio: 04-06-09, 21:45

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy