Determinar la entrada específica del cargador

Estoy intentando actualmente hacer una manera confiable de determinar un tipo específico del cargador, en mi caso un muelle de la música como esto . El problema es que este muelle, por desgracia, no envía un evento muelle cuando está acoplado.

Desde que estoy haciendo una aplicación depender de ser capaz de determinar cuando el dispositivo ha sido acoplado o desacoplado. Por lo tanto, necesito una manera de filtrar y separar estos eventos:

  • El dispositivo se está cargando a través del conector USB (sin cargador separado)
  • El dispositivo no está conectado a un ordenador
  • Una cierta manera de separar el muelle de carga lento de un cargador estándar

He notado que mi dispositivo (LG optimus 4x HD) logra reaccionar de forma diferente para cada una de estas acciones. Cuando está conectado a un cargador estándar no da ningún mensaje de la notificación, cuando está conectado a una computadora que me dice que el modo del USB se ha activado, y cuando está conectado con la base me da una advertencia lenta del cargador.

Necesito hacer un sistema con la misma capacidad de separar estas acciones y reaccionar a ellas. Hasta ahora sólo he hecho un BroadcastReceiver simple que reacciona si el dispositivo está conectado o desconectado a un cargador. También he conseguido monitorear el estado de carga usando el código encontrado en la documentación .

¿Hay alguna manera de determinar esta entrada específica del cargador?

Siempre que el dispositivo esté acoplado o desacoplado, se emitirá la acción ACTION_DOCK_EVENT. Para supervisar los cambios en el estado de acoplamiento del dispositivo, simplemente registre un receptor de difusión en su manifiesto de aplicación como se muestra en el siguiente fragmento:

<action android:name="android.intent.action.ACTION_DOCK_EVENT"/> 

Si un dispositivo está acoplado, puede acoplarse en cualquiera de cuatro tipos diferentes de base:

  • Coche
  • Escritorio
  • Escritorio de bajo nivel (analógico)
  • Escritorio de gama alta (digital)

Los detalles del estado del muelle se incluyen como extra en una emisión pegajosa de la acción ACTION_DOCK_EVENT. Debido a que es pegajoso, no es necesario registrar un BroadcastReceiver. Puede simplemente llamar a registerReceiver () pasando en null como el receptor de difusión como se muestra en el siguiente fragmento.

 IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT); Intent dockStatus = context.registerReceiver(null, ifilter); 

Puede extraer el estado de acoplamiento actual del EXTRA_DOCK_STATE extra:

 int dockState = battery.getIntExtra(EXTRA_DOCK_STATE, -1); boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED; 

Puede encontrar el estado de

 boolean isCar = dockState == EXTRA_DOCK_STATE_CAR; boolean isDesk = dockState == EXTRA_DOCK_STATE_DESK || dockState == EXTRA_DOCK_STATE_LE_DESK || dockState == EXTRA_DOCK_STATE_HE_DESK; 

EDIT:

Si su aplicación aún no recibe la transmisión, pruebe este código para enviar la transmisión manual y compruebe el código:

 adb shell am broadcast -a android.intent.action.POWER_CONNECTED -n com.jm.monitoringbatterydemo/.PowerConnectionReceiver 

Cambie el nombre de la emisión y su receptor.

Lo que puede hacer para solucionar este problema es mirar el% de batería que queda en su teléfono. A continuación, puede determinar que el valor sube, lo que significa que está acoplado. El único problema con esto podría ser que si a veces lo cargan en un cargador normal en lugar de un muelle, todavía tendría que responder como si se tratara de uno.

Más información sobre la lectura nivel de la batería, etc: http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

¿Sería útil identificar la fuente de alimentación

  int BATTERY_PLUGGED_AC Power source is an AC charger. int BATTERY_PLUGGED_USB Power source is a USB port. int BATTERY_PLUGGED_WIRELESS Power source is wireless. 

De BatteryManager ?

Espero que este código ayude:

  IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = mContext.registerReceiver(null, ifilter); // Are we charging / charged? int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; // How are we charging? int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == 2; boolean acCharge = chargePlug == 1; int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)scale; 
  • Cómo ejecutar un servicio todos los días al mediodía, y en cada inicio
  • ¿Cómo registrar el intentfilter personalizado para transmitir el receptor en el archivo de manifiesto?
  • ¿Cómo enviar datos a través de PendingIntent a Broadcast?
  • ¿Cómo usar "goAsync" para broadcastReceiver?
  • Determinar si el dispositivo Android Wear está en línea
  • Android: escucha el mensaje de difusión instalado / actualizado de la aplicación
  • Cómo interceptar la intención de ACTION_MEDIA_MOUNTED en Android?
  • ¿Cómo utilizo la acción de intento USER_PRESENT?
  • BroadcastReceiver onReceive timeout
  • El servicio no se inició en BOOT COMPLETE
  • ¿Cómo recibe una llamada saliente en un receptor de difusión
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.