C'è un modo per ottenere informazioni sulla batteria dall'SDK di Android? Come la durata della batteria rimanente e così via? Non riesco a trovarlo attraverso i documenti.Batteria Android nell'SDK
risposta
È possibile registrare un destinatario di Intent per ricevere la trasmissione per ACTION_BATTERY_CHANGED: http://developer.android.com/reference/android/content/Intent.html#ACTION_BATTERY_CHANGED. I documenti dicono che la trasmissione è appiccicosa, quindi sarai in grado di afferrarla anche dopo il momento in cui si verifica il cambio di stato della batteria.
Ecco un breve esempio che ti fornirà la quantità di batteria utilizzata, la tensione della batteria e la sua temperatura.
incollare il seguente codice in un'attività:
@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);
}
sul mio cellulare, questo ha il seguente output ogni 10 secondi:
ERROR/BatteryManager(795): level is 40/100 temp is 320, voltage is 3848
Quindi questo significa che la batteria è del 40% pieno, ha una temperatura di 32,0 gradi Celsius e ha una tensione di 3,848 Volt.
Questo è un ottimo esempio, ma perché lo si registra su "errore" livello? – GetUsername
@GetUsername Non esiste una ragione particolare per la registrazione a livello di errore diversa dalle preferenze personali. Per la registrazione come questa che rimuovo prima di pubblicare la mia app, mi piace accedere al livello di errore in modo che sia facile vedere la registrazione nel mare dell'output di logcat. – plowman
Avevo bisogno di avere un monitor sulla batteria e controllare il livello e lo stato. Sto sviluppando su MonoForAndroid, quindi ecco cosa mi è venuto in mente. Lo sto mettendo qui nel caso qualcuno abbia un requisito simile. (Ho provato questo e funziona bene).
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
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) + "%";
}
potete inserire alcuni esempi di codice per questo. Non sono sicuro di come ricevere un intento di trasmissione. –