Как я могу получить уровень заряда батареи и состояние (подключен, разряжен, заряжен и т.д.)? Я исследовал документы разработчика, и я нашел класс BatteryManager. Но он не содержит никаких методов, просто констант. Как его использовать?
Уровень заряда батареи и состояние в Android
Ответ 1
Вот пример кода, который объясняет, как получить информацию об аккумуляторе.
Чтобы подвести итог, широковещательный приемник для намерения ACTION_BATTERY_CHANGED
устанавливается динамически, потому что он не может быть получен через компоненты, объявленные в манифестах, только путем явной регистрации для него с Context.registerReceiver()
.
public class Main extends Activity {
private TextView batteryTxt;
private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context ctxt, Intent intent) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
batteryTxt.setText(String.valueOf(level) + "%");
}
};
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.main);
batteryTxt = (TextView) this.findViewById(R.id.batteryTxt);
this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
}
Ответ 2
Поскольку API 21 можно было использовать для получения текущего уровня заряда батареи в процентах:
BatteryManager bm = (BatteryManager)getSystemService(BATTERY_SERVICE);
int batLevel = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
Ответ 3
На основе официальных андроидных документов вы можете использовать этот метод в классе Helper или Util для получения текущего процентного содержания батареи:
public static int getBatteryPercentage(Context context) {
IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, iFilter);
int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1;
int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;
float batteryPct = level / (float) scale;
return (int) (batteryPct * 100);
}
Ответ 4
Вам не нужно регистрировать фактический BroadcastReceiver, поскольку Android BatteryManager использует липкое намерение:
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = registerReceiver(null, ifilter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float)scale;
return (int)(batteryPct*100);
Это из официальных документов на https://developer.android.com/training/monitoring-device-state/battery-monitoring.html.
Ответ 5
Вы можете использовать это, чтобы получить оставшуюся сумму в процентах.
private void batteryLevel() {
BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
context.unregisterReceiver(this);
int rawlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
int level = -1;
if (rawlevel >= 0 && scale > 0) {
level = (rawlevel * 100) / scale;
}
batterLevel.setText("Battery Level Remaining: " + level + "%");
}
};
IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryLevelReceiver, batteryLevelFilter);
}
Ответ 6
попробуйте эту функцию без необходимости разрешения или любого получателя
void getBattery_percentage()
{
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = getApplicationContext().registerReceiver(null, ifilter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float)scale;
float p = batteryPct * 100;
Log.d("Battery percentage",String.valueOf(Math.round(p)));
}
Ответ 7
После некоторого БОЛЬШЕ исследования я нашел BatteryManager.EXTRA_LEVEL.
Ответ 8
private void batteryLevel() {
BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
context.unregisterReceiver(this);
int rawlevel = intent.getIntExtra("level", -1);
int scale = intent.getIntExtra("scale", -1);
int level = -1;
if (rawlevel >= 0 && scale > 0) {
level = (rawlevel * 100) / scale;
}
mBtn.setText("Battery Level Remaining: " + level + "%");
}
};
IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryLevelReceiver, batteryLevelFilter);
}
Ответ 9
одна ошибка в официальных документах, вы должны использовать double вместо float. Потому что 0.53F * 100F = 52F
int level = batteryStatus != null ?
batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1; int scale =
batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;
double batteryPct = (double) level / (double) scale; int percent = (int) (batteryPct * 100D);
Ответ 10
Для проверки процента заряда батареи мы используем BatteryManager, следующий метод вернет процент заряда батареи.
Ссылка на источник
public static float getBatteryLevel(Context context, Intent intent) {
Intent batteryStatus = context.registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int batteryLevel = -1;
int batteryScale = 1;
if (batteryStatus != null) {
batteryLevel = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, batteryLevel);
batteryScale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, batteryScale);
}
return batteryLevel / (float) batteryScale * 100;
}