2012-07-22 16 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(); 
} 

manifeście:Stan baterii nie zawsze jest ładowanie

<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> 

W tym kodzie Toast zawsze pokazuje „brak ładowania”. Przetestowałem to na prawdziwym urządzeniu, a kiedy podłączę go do zasilania AC lub USB, nadal wyświetla się komunikat "Not Charging!" Toast.

+0

tam coś złego z intent.getIntExtra sprawdzić gdzie ta metoda jest wywoływany i upewnij się, że ustawiasz intencje z poprawnymi parametrami. – John

+0

Jaki jest status, który otrzymujesz? – zmbq

+0

@John Używam go w moim manifeście. –

Odpowiedz

6

Nie można zarejestrować się na ACTION_BATTERY_CHANGED za pośrednictwem manifestu, więc nie są odbierane te transmisje. Próbujesz uzyskać BatteryManager dodatki z Intents, które nie mają tych dodatków (np. ACTION_POWER_CONNECTED). W rezultacie otrzymujesz domyślną wartość BATTERY_STATUS_UNKNOWN.

+0

W jaki sposób mogę go zarejestrować programowo? –

+0

@MohitDeshpande: Wywołanie 'registerReceiver()', w taki sam sposób, jak programowo zarejestrować dowolne inne program 'BroadcastReceiver'. Zobacz: https://github.com/commonsguy/cw-omnibus/tree/master/SystemEvents/OnBattery – CommonsWare

2

Spróbuj wykonać następujące czynności:

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

będzie teraz wartość między 1 i 5:

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

Kod:

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

można zapisać:

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

Oba są identyczne, ponieważ BatteryManager.BATTERY_STATUS_CHARGING jest stała zawsze równa 2, a BatteryManager.BATTERY_STATUS_FULL jest stała zawsze równa 5.

+0

Dobra odpowiedź, ale proszę nie używać magicznych cyfr w kodzie: http://stackoverflow.com/questions/47882/what -jest-magiczną-liczbą-i-dlaczego-jest-to-złe – kellogs