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
risposta
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
.
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? –
Se stai facendo questo da un widget, dovrai chiamare 'registerReceiver' in questo modo:' getApplicationContext(). RegisterReciever (...) 'perché funzioni. – MCeley
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. –
Utilizzare un 'BroadcastReceiver' e quindi una volta ottenuto il valore una volta basta rimuovere il ricevitore. – TronicZomB