2013-04-01 8 views
30

Ho cercato sul Web e non sono riuscito a trovare la risposta alla mia domanda. Il mio problema è di ottenere le informazioni sul livello della batteria solo una volta, ad es. chiamando la funzione getBatteryLevel(). Esistono solo soluzioni che vengono implementate utilizzando BroadcastReceiver, ma come so che verrà chiamato ogni volta a livello di cambiamento di batteria evento. Per favore, dimmi come posso ottenere quell'informazione solo una volta?Ottieni il livello della batteria solo una volta utilizzando l'SDK Android

+4

Utilizzare un 'BroadcastReceiver' e quindi una volta ottenuto il valore una volta basta rimuovere il ricevitore. – TronicZomB

risposta

96

La trasmissione Intent.ACTION_BATTERY_CHANGED è nota come "trasmissione appiccicosa". Poiché questo è appiccicoso, è possibile registrarsi per la trasmissione con un ricevitore Null che otterrà il livello di batteria una sola volta quando si chiama registerReceiver.

una funzione per ottenere il livello della batteria senza ricevere gli aggiornamenti sarebbe simile a questa:

public float getBatteryLevel() { 
    Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 

    // Error checking that probably isn't needed but I added just in case. 
    if(level == -1 || scale == -1) { 
     return 50.0f; 
    } 

    return ((float)level/(float)scale) * 100.0f; 
} 

Più dati possono essere estratti da questa trasmissione appiccicoso. Utilizzando il reso batteryIntent è possibile accedere ad altri extra come descritto nella classe BatteryManager.

+0

Questo metodo non può ora essere chiamato da withing a Receiver (ad esempio un Widget). Sei a conoscenza di un altro modo per ottenere il livello della batteria che può essere fatto all'interno del metodo onUpdate() di un Widget? –

+1

Se stai facendo questo da un widget, dovrai chiamare 'registerReceiver' in questo modo:' getApplicationContext(). RegisterReciever (...) 'perché funzioni. – MCeley

+0

Ho un contesto e posso chiamarlo, ma la chiamata non è consentita da un ricevitore, passando questo o null come primo parametro "ricevitore". Il messaggio di log è molto esplicito che non è possibile chiamare da un ricevitore. –