2009-11-26 14 views
27

¿Hay alguna manera de obtener información de la batería del SDK de Android? Como la duración de la batería restante, etc. No puedo encontrarlo a través de los documentos.Batería Android en el SDK

Respuesta

67

Aquí hay un ejemplo rápido que le indicará la cantidad de batería utilizada, el voltaje de la batería y su temperatura.

Pegue el código siguiente en una actividad:

@Override 
public void onCreate() { 
    BroadcastReceiver batteryReceiver = new BroadcastReceiver() { 
     int scale = -1; 
     int level = -1; 
     int voltage = -1; 
     int temp = -1; 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
      scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
      temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1); 
      voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1); 
      Log.e("BatteryManager", "level is "+level+"/"+scale+", temp is "+temp+", voltage is "+voltage); 
     } 
    }; 
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    registerReceiver(batteryReceiver, filter); 
} 

En mi teléfono, esto tiene la siguiente salida cada 10 segundos:

ERROR/BatteryManager(795): level is 40/100 temp is 320, voltage is 3848

Así que esto significa que la batería es de 40% lleno, tiene una temperatura de 32.0 grados centígrados, y tiene un voltaje de 3.848 voltios.

+4

Este es un gran ejemplo, pero ¿por qué iniciar sesión en el nivel de "error"? – GetUsername

+1

@GetUsername No hay ninguna razón particular para el registro de nivel de error que no sea la preferencia personal. Para iniciar sesión de este modo que elimino antes de publicar mi aplicación, me gusta iniciar sesión en el nivel de error para que sea fácil ver el registro en el mar de la salida de Logcat. – plowman

0

Necesitaba tener un monitor en la batería y verificar el nivel y el estado. Estoy desarrollando en MonoForAndroid, así que esto es lo que se me ocurrió. Lo estoy poniendo aquí en caso de que alguien tenga un requisito similar. (He probado esto y funciona bien).

try 
{ 
    var ifilter = new IntentFilter(Intent.ActionBatteryChanged); 
    Intent batteryStatusIntent = Application.Context.RegisterReceiver(null, ifilter); 
    var batteryChangedArgs = new AndroidBatteryStateEventArgs(batteryStatusIntent); 
    _Battery.Level = batteryChangedArgs.Level; 
    _Battery.Status = batteryChangedArgs.BatteryStatus; 
} 
catch (Exception exception) 
{ 
    ExceptionHandler.HandleException(exception, "BatteryState.Update"); 
    throw new BatteryUpdateException(); 
} 

namespace Leopard.Mobile.Hal.Battery 
{ 
    public class AndroidBatteryStateEventArgs : EventArgs 
    { 
     public AndroidBatteryStateEventArgs(Intent intent) 
     { 
     Level = intent.GetIntExtra(BatteryManager.ExtraLevel, 0); 
     Scale = intent.GetIntExtra(BatteryManager.ExtraScale, -1); 
     var status = intent.GetIntExtra(BatteryManager.ExtraStatus, -1); 
     BatteryStatus = GetBatteryStatus(status); 
    } 

    public int Level { get; set; } 
    public int Scale { get; set; } 
    public BatteryStatus BatteryStatus { get; set; } 

    private BatteryStatus GetBatteryStatus(int status) 
    { 
     var result = BatteryStatus.Unknown; 
     if (Enum.IsDefined(typeof(BatteryStatus), status)) 
     { 
      result = (BatteryStatus)status; 
     } 
     return result; 
    } 
} 
} 


#region Internals 
public class AndroidBattery 
{ 
    public AndroidBattery(int level, BatteryStatus status) 
    { 
     Level = level; 
     Status = status; 
    } 

    public int Level { get; set; } 
    public BatteryStatus Status { get; set; } 
} 

public class BatteryUpdateException : Exception 
{ 
} 
#endregion 
2
public static String batteryLevel(Context context) 
    { 
     Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
     int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 
     int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100); 
     int percent = (level*100)/scale; 
     return String.valueOf(percent) + "%"; 
    } 
Cuestiones relacionadas