2012-06-30 11 views
11

Estoy teniendo exactamente el mismo problema que esta publicación: Battery broadcast receiver doesn't work. Pero parece que nadie ha respondido esa pregunta.No puedo recibir la transmisión en el cambio de estado de la batería?

Aquí es mi 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(); 
     } 

Y aquí es mi 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> 

También he añadido esta línea al manifiesto:

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

Pero todavía ¡sin éxito!

Realmente apreciaría si alguien pudiera aconsejarme qué estoy haciendo mal.

Respuesta

19

de the documentation for ACTION_BATTERY_CHANGED:

no puede recibir esto a través de los componentes declarados en los manifiestos, solamente mediante el registro de manera explícita con Context.registerReceiver(). Consulte ACTION_BATTERY_LOW, ACTION_BATTERY_OKAY, ACTION_POWER_CONNECTED y ACTION_POWER_DISCONNECTED para distintas transmisiones relacionadas con la batería que se envían y se pueden recibir a través de los receptores de manifiesto.

Aquí lo tienes: debes registrarte explícitamente desde tu código Java.

+0

gracias Darshan, pero quiero ejecutar un servicio solo cuando la batería está baja o está enchufada. Podría decir por favor ¿Cómo debería hacer eso? –

+2

Si esos son los únicos dos eventos que te importan, entonces no necesitas 'ACTION_BATTERY_CHANGED' en absoluto, y estarás bien registrándote en el manifiesto. La transmisión para enchufar es 'ACTION_POWER_CONNECTED'. Ambas acciones pueden estar bajo el mismo 'filtro de intención', no es necesario establecer una prioridad, y no necesita el permiso' BATTERY_STATS'. –

2

Acabo de seguir la Guía del desarrollador de Android en Monitoring the Battery Level and Charging State y tuve éxito inmediato. Si BatteryLevelReceiver es su propia clase, entonces yo recomendaría:

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

adición

estoy dispuesto a adivinar que usted escribió BatteryLevelReceiver como una clase anidada en ReceversAndServices. De acuerdo con Receiver as inner class in Android, no puede hacer eso con clases no estáticas. Se podría hacer BatteryLevelReceiver una clase estática y registrar el receptor en onResume(), pero entonces tendrá que estar ejecutando su aplicación para capturar los eventos ... Mueva su receptor a una clase separada y registrar estos Propósitos:

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

(no BATTERY_CHANGED como Darshan Computing señaló.)

+3

Tenías éxito inmediato recibir 'BATTERY_LOW', pero nunca se recibirá' BATTERY_CHANGED' de esa manera. –

+0

Gracias Sam, pero tan pronto como agrego algo estático, obtengo el error :( –

+0

@Kevin_Dingo Sí, me di cuenta de lo que estabas tratando de hacer. Me di cuenta de mi error y estaba escribiendo una actualización. Si todavía estás Obteniendo errores, por favor agregue más detalles a su pregunta y los errores de logcat. – Sam

Cuestiones relacionadas