2012-06-30 6 views
11

Sto avendo lo stesso problema di questo post: Battery broadcast receiver doesn't work. Ma sembra che nessuno abbia risposto a questa domanda.Non riesco a ricevere la trasmissione sullo stato della batteria?

Ecco il mio 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(); 
     } 

E qui è il mio 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> 

Ho anche aggiunto questa linea per il manifesto:

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

Ma ancora nessun successo!

Sarei davvero grato se qualcuno potesse consigliarmi cosa sto facendo male.

risposta

19

da the documentation for ACTION_BATTERY_CHANGED:

non è possibile ricevere questo attraverso i componenti dichiarati nel manifesta, solo da esplicitamente la registrazione per questo con Context.registerReceiver(). Vedi ACTION_BATTERY_LOW, ACTION_BATTERY_OKAY, ACTION_POWER_CONNECTED e ACTION_POWER_DISCONNECTED per distinte trasmissioni relative alla batteria che vengono inviate e possono essere ricevute tramite ricevitori manifest.

Eccolo: è necessario registrarsi esplicitamente dal codice Java.

+0

grazie a Darshan, ma voglio eseguire un servizio solo quando la batteria è scarica o è collegata. Potresti dirlo come dovrei farlo? –

+2

Se questi sono gli unici due eventi che ti interessano, non hai affatto bisogno di "ACTION_BATTERY_CHANGED" e starai bene registrandoli nel manifest. La trasmissione per essere collegata è 'ACTION_POWER_CONNECTED'. Entrambe le azioni possono avere lo stesso 'intent-filter', non è necessario impostare una priorità e non è necessario il permesso' BATTERY_STATS'. –

2

Ho appena seguito la Guida per gli sviluppatori Android su Monitoring the Battery Level and Charging State e ho avuto un successo immediato. Se BatteryLevelReceiver è essa la propria classe, allora mi sento di raccomandare:

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

aggiunta

Sono disposto a indovinare che hai scritto BatteryLevelReceiver come una classe annidata in ReceversAndServices. Secondo Receiver as inner class in Android, non è possibile farlo con classi non statiche. Si potrebbe fare BatteryLevelReceiver una classe statica e registrare il ricevitore in onResume(), ma poi la vostra applicazione sarà necessario essere in esecuzione per catturare gli eventi ... Spostare il ricevitore a una classe separata e registrare questi intenti:

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

(non BATTERY_CHANGED come Darshan Computing rilevare.)

+3

Hai avuto successo immediato ricevere 'BATTERY_LOW', ma non sarai mai ricevere' BATTERY_CHANGED' in quel modo. –

+0

Grazie Sam, ma non appena aggiungo qualcosa di statico, ottengo l'errore :( –

+0

@Kevin_Dingo Sì, ho preso un'ipotesi su quello che stavi cercando di fare. Ho realizzato il mio errore e stavo scrivendo un aggiornamento. ottenendo errori, per favore aggiungi ulteriori dettagli alla tua domanda e gli errori di logcat. – Sam