studio programacion herramientas fundamentos con avanzado aplicaciones android batterymanager

android - programacion - Verifica si el dispositivo está enchufado



manual de android en pdf (9)

Mi aplicación tiene un receptor de transmisión para escuchar los cambios a ACTION_POWER_CONNECTED , y a su vez ACTION_POWER_CONNECTED la pantalla para permanecer encendido.

Lo que me falta es la capacidad de la aplicación para verificar el estado de carga cuando se ejecuta por primera vez. ¿Puede alguien ayudarme con el código para verificar manualmente el estado de carga?


¡Tu respuesta está en la http://developer.android.com/training/monitoring-device-state/battery-monitoring.html !

Aquí está el código de ejemplo:

// 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 == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;


Call registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)) . Esto devolverá un Intent que tiene extras definidos en BatteryManager para avisarle si está conectado o no.

Esto funciona porque Intent.ACTION_BATTERY_CHANGED es una emisión adhesiva.


En Android M + puede usar el servicio BatteryManager través de getSystemService(BATTERY_SERVICE) . En los dispositivos que ejecutan pre-M, puede usar una transmisión fija como lo mencionaron los demás. Ejemplo:

public static boolean isCharging(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { BatteryManager batteryManager = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE); return batteryManager.isCharging(); } else { IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent intent = context.registerReceiver(null, filter); int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); if (status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL) { return true; } } return false; }


Es una intención pegajosa, no es necesario registrar un BroadcastReceiver, simplemente llamando a registerReceiver pasando null como el receptor como se muestra en el siguiente fragmento, se devuelve el estado actual del estado de la batería. Podría pasar un objeto de BroadcastReceiver real aquí, pero manejaremos las actualizaciones en una sección posterior, por lo que no es necesario.

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

Puede extraer tanto el estado de carga actual como, si el dispositivo se está cargando, si se está cargando mediante un cargador USB o de CA:

// 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 == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

BatteryManager transmite una acción cada vez que el dispositivo está conectado o desconectado de la alimentación. Es importante recibir estos eventos incluso cuando su aplicación no se está ejecutando, especialmente porque estos eventos deberían afectar la frecuencia con la que inicia su aplicación para iniciar una actualización de fondo, por lo que debe registrar un BroadcastReceiver en su manifiesto para escuchar ambos eventos por definiendo ACTION_POWER_CONNECTED y ACTION_POWER_DISCONNECTED dentro de un filtro de intención.

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

Dentro de la implementación de BroadcastReceiver asociada, puede extraer el estado y el método de carga actuales como se describe en el paso anterior.

public class PowerConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; } }


Gracias a CommonsWare aquí está el código que escribí.

public class Power { public static boolean isConnected(Context context) { Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS; } } if (Power.isConnected(context)) { ... }

o la versión de Kotlin

object Power { fun isConnected(context: Context): Boolean { val intent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED)) val plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS } }

Nota BatteryManager.BATTERY_PLUGGED_WIRELESS requiere API Nivel 17 (Jelly Bean MR1). Para compatibilidad con versiones anteriores, cambie la última línea a:

return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS)

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


La forma más fácil es usar un filtro de intención ACTION_BATTERY_CHANGED

public void checkBatteryState(View sender) { IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = registerReceiver(null, filter); int chargeState = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); String strState; switch (chargeState) { case BatteryManager.BATTERY_STATUS_CHARGING: case BatteryManager.BATTERY_STATUS_FULL: strState = "charging"; break; default: strState = "not charging"; } TextView tv = (TextView) findViewById(R.id.textView); tv.setText(strState); }


prueba esto:

public class PowerConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter); int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; if (batteryStatus != null) { int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float) scale; } }//end onReceive }//end PowerConnectionReceiver


BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if(action.equalsIgnoreCase(ACTION_POWER_CONNECTED)) { if(chargerConnected != null ) { chargerConnected.setText("Cable Connected"); } if(chargerImage != null ) { chargerImage.setImageDrawable(getResources().getDrawable(R.drawable.usb)); } }else if(action.equalsIgnoreCase(ACTION_POWER_DISCONNECTED)) { if(chargerConnected != null ) { chargerConnected.setText("NOT CHARGE"); } if(chargerImage != null ) { chargerImage.setImageDrawable(getResources().getDrawable(R.drawable.battery_icon)); } try { Toast.makeText(context, "Power Cable Disconnected", Toast.LENGTH_SHORT).show(); }catch (Exception e){e.printStackTrace();} } } };


public static boolean isPlugged(Context context) { boolean isPlugged= false; Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); isPlugged = plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB; if (VERSION.SDK_INT > VERSION_CODES.JELLY_BEAN) { isPlugged = isPlugged || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS; } return isPlugged; }

Una actualización menor para admitir la carga inalámbrica.