2012-07-22 8 views
5
@Override 
public void onReceive(Context context, Intent intent) { 
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, 
    BatteryManager.BATTERY_STATUS_UNKNOWN); 

    if (status == BatteryManager.BATTERY_STATUS_CHARGING 
     || status == BatteryManager.BATTERY_STATUS_FULL) 
     Toast.makeText(context, "Charging!", Toast.LENGTH_SHORT).show(); 
    else 
     Toast.makeText(context, "Not Charging!", Toast.LENGTH_SHORT).show(); 
} 

manifesto:stato della batteria non è sempre carica

<receiver android:name=".receiver.BatteryReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> 
     <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> 
     <action android:name="android.intent.action.BATTERY_CHANGED" /> 
    </intent-filter> 
</receiver> 

In questo codice, il Toast mostra sempre "Not Charging!". L'ho provato su un dispositivo reale e quando lo collego all'alimentazione CA o USB, viene comunque visualizzato "Non caricare!" Crostini.

+0

C'è qualcosa che non va con il tuo intent.getIntExtra, controllare dove questo metodo viene chiamato da e assicurati di impostare l'intento con i parametri corretti – John

+0

Qual è lo stato che ricevi? – zmbq

+0

@John Lo sto usando nel mio manifest. –

risposta

6

Non è possibile registrarsi per ACTION_BATTERY_CHANGED tramite il manifest, quindi non si ricevono tali trasmissioni. Stai cercando di ottenere BatteryManager extra da Intents che non hanno questi extra (ad esempio, ACTION_POWER_CONNECTED). Di conseguenza, si ottiene il valore predefinito di BATTERY_STATUS_UNKNOWN.

+0

Quindi, come posso registrarlo a livello di programmazione? –

+0

@MohitDeshpande: chiama 'registerReceiver()', nello stesso modo in cui si registrerebbe qualsiasi altro 'BroadcastReceiver' a livello di codice. Vedi: https://github.com/commonsguy/cw-omnibus/tree/master/SystemEvents/OnBattery – CommonsWare

2

provare quanto segue:

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
Intent batteryStatus = context.registerReceiver(null, ifilter); 
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
'status'

sarà ora un valore compreso tra 1 e 5:

1 = Unknown 
2 = Charging 
3 = Discharging 
4 = Not Charging 
5 = Full 

tuo codice:

if (status == BatteryManager.BATTERY_STATUS_CHARGING 
    || status == BatteryManager.BATTERY_STATUS_FULL) ... 

si può scrivere:

if (status == 2 || status == 5) ... 

Entrambi sono identici perché BatteryManager.BATTERY_STATUS_CHARGING è una costante che sempre uguale a 2, e BatteryManager.BATTERY_STATUS_FULL è una costante che sempre uguale a 5.

+0

Buona risposta, ma per favore non usare numeri magici nel codice: http://stackoverflow.com/questions/47882/what -is-a-magic-numero-e-perché-è-it-bad – kellogs

Problemi correlati