2012-06-30 11 views
11

Mam dokładnie ten sam problem, co ten wpis: Battery broadcast receiver doesn't work. Ale wydaje się, że nikt nie odpowiedział na to pytanie.Nie mogę odbierać transmisji po zmianie stanu baterii?

Oto moja BroadcastReceiver:

public class BatteryLevelReceiver extends BroadcastReceiver{ 


    @Override 
    public void onReceive(Context context, Intent intent) { 
    Log.v("plugg", "plug change fired"); 
    Toast.makeText(context, " plug change fired", Toast.LENGTH_LONG).show(); 
     } 

I tu jest moje AndroidManifest.xml:

<receiver android:name=".ReceversAndServices.BatteryLevelReceiver"> 
       <intent-filter android:priority="900"> 
       <action android:name="android.intent.action.BATTERY_LOW" /> 

       </intent-filter> 
      </receiver> 

      <receiver android:name=".ReceversAndServices.BatteryLevelReceiver"> 
       <intent-filter android:priority="900"> 
       <action android:name="android.intent.action.BATTERY_CHANGED" /> 
       </intent-filter> 
      </receiver> 

Dodałem również linię do manifestu:

<uses-permission android:name="android.permission.BATTERY_STATS"/> 

ale nadal bez powodzenia!

Byłbym bardzo wdzięczny, gdyby ktoś mógł mi doradzić, co robię źle.

Odpowiedz

19

Od the documentation for ACTION_BATTERY_CHANGED:

nie można odbierać to poprzez komponenty deklarowanych w manifestach, tylko wyraźnie rejestracji za to Context.registerReceiver(). Zobacz ACTION_BATTERY_LOW, ACTION_BATTERY_OKAY, ACTION_POWER_CONNECTED i ACTION_POWER_DISCONNECTED dla różnych transmisji związanych z baterią, które są wysyłane i mogą być odbierane za pośrednictwem odbiorników manifestu.

Masz to: musisz zarejestrować się do niego bezpośrednio z kodu Java.

+0

dziękuję Darshanowi, ale chcę uruchomić usługę tylko wtedy, gdy bateria jest niska lub jest podłączona. Czy mógłbyś powiedzieć jak mam to zrobić? –

+2

Jeśli są to jedyne dwa wydarzenia, na których Ci zależy, to wcale nie potrzebujesz "ACTION_BATTERY_CHANGED", a będziesz w porządku rejestrować je w manifeście. Transmisja do podłączenia to "ACTION_POWER_CONNECTED". Obie akcje mogą znajdować się pod tym samym 'filtrem intencji ', nie musisz ustawiać priorytetu i nie potrzebujesz uprawnienia" BATTERY_STATS ". –

2

Po prostu podążyłem za przewodnikiem dla programistów Androida pod numerem Monitoring the Battery Level and Charging State i od razu odniosłem sukces. Jeśli BatteryLevelReceiver jest jego własna klasa to polecam:

<receiver android:name=".BatteryLevelReceiver"> 
    <intent-filter android:priority="900"> 
     <action android:name="android.intent.action.BATTERY_LOW" /> 
     <action android:name="android.intent.action.BATTERY_CHANGED" /> 
    </intent-filter> 
</receiver> 

Dodawanie

jestem skłonny się domyślić, że napisałeś BatteryLevelReceiver jako zagnieżdżone klasy w ReceversAndServices. Według Receiver as inner class in Android nie można tego zrobić w przypadku klas niestatycznych. Można zrobić BatteryLevelReceiver klasę statyczną i zarejestrować odbiornik w onResume(), ale wtedy Twoja aplikacja musi być uruchomiony do połowu zdarzeń ... Przenieś swój odbiornik do osobnej klasy i zarejestrować te intencjami:

<receiver android:name=".BatteryLevelReceiver"> 
    <intent-filter android:priority="900"> 
     <action android:name="android.intent.action.BATTERY_LOW" /> 
     <action android:name="android.intent.action.BATTERY_OKAY" /> 
     <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> 
    </intent-filter> 
</receiver> 

(nie BATTERY_CHANGED jak Darshan Computing zauważył.)

+3

Miałeś natychmiastowy sukces odbierający 'BATTERY_LOW', ale nigdy nie będziesz otrzymywać' BATTERY_CHANGED' ten sposób. –

+0

Dzięki Sam, ale jak tylko dodaję do niej statyczne, dostaję błąd :( –

+0

@Kevin_Dingo Tak, zgaduję, co próbujesz zrobić. Zrozumiałem swój błąd i pisałem aktualizację. otrzymywanie błędów, proszę dodać więcej szczegółów do pytania i błędów logcat – Sam