La obtención de un cable USB conectado al evento IN / OUT utilizando EXTRA_PLUGGED no funciona

Mi intención es haber guardado en el estado actual de Preferencias del dispositivo usb / cable de alimentación del dispositivo Android: conectado / desconectado. Desde el sitio del desarrollador veo que hay dos intenciones para obtener ese estado: ACTION_POWER_CONNECTED / DISCONNECTED. Así que usé el mismo código publicado en Developers:

Http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

En la sección Supervisar cambios en el estado de carga.

Manifiesto

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

Código Java

 public class PowerConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; Toast.makeText(context, "pvr = " + usbCharge + ", " + acCharge + "," + isCharging, Toast.LENGTH_SHORT).show(); } } 

Cuando enchufo el cable USB ENTRADA / SALIDA que la difusión es siempre correctamente enviada y atrapada en PowerConnectionReceiver pero siempre con el mismo resultado (= cable enchufado).

Lo probé con Galaxy Nexus 4.1.1 / 4.2.1 – Siempre estoy recibiendo 2xFALSE en Toast (chargePlug = FALSE, usbCharge = FALSE).

¿Por qué intent.getIntExtra (BatteryManager.EXTRA_PLUGGED, -1) siempre devuelve el valor predeterminado "-1"?

Gracias.

PD. Todo funciona bien si registro receptor en Java

 Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

… en Servicio o en Actividad. Sin embargo, según el sitio de desarrolladores de Android no es prerrequisito para que el código anterior devuelva el valor correcto;

3 Solutions collect form web for “La obtención de un cable USB conectado al evento IN / OUT utilizando EXTRA_PLUGGED no funciona”

Yo estaba lidiando con el mismo problema, cruzando su puesto. Creo que el problema es que el código, en la página de formación de Android a la que proporcionó un enlace, es incorrecto.

ACTION_POWER_CONNECTED y ACTION_POWER_DISCONNECTED no están "llevando" los datos que está consultando desde la intención en su código. No pude conseguir que las mismas cosas funcionen en mis dispositivos (Gen 1 de Gen Nexus 7 con Android 4.3 y Nexus One con Android 2.3.6) y, porque parece que no funciona en ningún lado, llego al "código incorrecto" conclusión.

Lo arreglé con el siguiente código. En realidad, está muy cerca de lo que has proporcionado como una solución, excepto que va a mi BroadcastReceiver directamente y no en una actividad. En el código anterior, el fragmento aquí iría justo antes de la línea que comienza "int chargePlug". Después de eso, cambie "intención" en esa misma línea (su línea), comenzando "int chargePlug", a "mIntent".

 final Intent mIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

Tenga en cuenta que su BroadcastReceiver ahora tendrá dos intenciones. Uno pasó a él, que será la intención que contiene la acción ACTION_POWER_CONNECTED (o ACTION_POWER_DISCONNECTED), y el otro creado dentro de la BroadcastReceiver expresamente para extraer la información de la batería.

El fragmento de código que he proporcionado no funcionaría si lo colocó en una actividad (no se conectaría a su BroadcastReceiver) debido al nulo en la lista de parámetros. En realidad no estás registrando un BroadcastReceiver con ese nulo. Cambiar el nulo a su BroadcastReceiver tampoco sería ideal ya que la notificación ACTION_BATTERY_CHANGED puede activar un LOT. Estoy bastante seguro de que ACTION_BATTERY_CHANGED no estaba destinado a ser utilizado como un disparador para un BroadcastReceiver. En su lugar, creo que está destinado a ser utilizado en tiempo real para obtener la última "pegajosa" difusión con información sobre un cambio en la información de la batería (buscar "pegajosa emisión" en la documentación de Android).

Tenga en cuenta también que el fragmento que he incluido incluye "getApplicationContext ()" en la cadena de llamadas. Sácalo y los dispositivos de Gingerbread se bloquearán (gracias a CommonsWare).

No estoy seguro de por qué tienes problemas, pero lo que funcionó para mí fue registrar las acciones ACTION_POWER_CONNECTED y ACTION_POWER_DISCONNECTED:

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

Y la implementación del receptor de radiodifusión así:

 public class PowerReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction() == Intent.ACTION_POWER_CONNECTED) { //Handle power connected } else if(intent.getAction() == Intent.ACTION_POWER_DISCONNECTED){ //Handle power disconnected } } } 
 public class PowerConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final Intent mIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int status = mIntent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; int chargePlug = mIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BATTERY_PLUGGED_AC; } } 
  • Aparato de almacenamiento masivo USB Android
  • Modo host Android y modo accesorio
  • Comunicación con el host USB de Android
  • Cómo subir un archivo en Android a PC a través de USB
  • Servicio de modo de host USB Android - Inicio basado en USB_DEVICE_ATTACHED
  • Cómo listar archivos en un dispositivo USB OTG
  • Problemas de conexión de Android 6 Nexus 5 USB
  • Android 3.1 USB-Host - BroadcastReceiver no recibe USB_DEVICE_ATTACHED
  • Transferir archivos de android a computadora vía usb programáticamente
  • Conexión de dos dispositivos Android a través de USB
  • NullPointerException de UsbManager
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.