Я знаю, что таких вопросов много, но мне нужен конкретный ответ, возможно это или нет.
Я хочу получить текущий доступный заряд батареи в мАч для любого телефона Android. Это важно для моего проекта. Я попробовал BatteryManager.
batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER);
Это именно та информация, которая мне нужна, но только для некоторых устройств.
Я также пытался использовать PowerProfile через Java Reflection.
public void getBatteryCapacity() {
Object mPowerProfile_ = null;
final String POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile";
try {
mPowerProfile_ = Class.forName(POWER_PROFILE_CLASS)
.getConstructor(Context.class).newInstance(this);
} catch (Exception e) {
e.printStackTrace();
}
try {
double batteryCapacity = (Double) Class
.forName(POWER_PROFILE_CLASS)
.getMethod("getAveragePower", java.lang.String.class)
.invoke(mPowerProfile_, "battery.capacity");
Toast.makeText(OffloadeeActivity.this, batteryCapacity + " mAh",
Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
}
Но это обеспечивает общую емкость батареи. Что мне нужно, это текущий оставшийся заряд батареи. Есть ли универсальный способ получить это для каждого устройства? Любая библиотека тоже подойдет.
Это может быть достигнуто путем получения полной емкости батареи в миллиампер-часах, затем определения процента уровня заряда батареи и, наконец, умножения их вместе, чтобы получить текущее время автономной работы в миллиамперах часов. Следующий блок кода является функцией для получения полной емкости батареи в миллиамперах часов:
public double getBatteryCapacity(Context context) {
Object mPowerProfile;
double batteryCapacity = 0;
final String POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile";
try {
mPowerProfile = Class.forName(POWER_PROFILE_CLASS)
.getConstructor(Context.class)
.newInstance(context);
batteryCapacity = (double) Class
.forName(POWER_PROFILE_CLASS)
.getMethod("getBatteryCapacity")
.invoke(mPowerProfile);
} catch (Exception e) {
e.printStackTrace();
}
return batteryCapacity;
}
Теперь, когда у вас есть емкость аккумулятора, вы можете найти текущий процент времени автономной работы, а затем умножить его на общую емкость, чтобы получить заряд в миллиамперах часов:
BatteryManager bm = (BatteryManager)getSystemService(BATTERY_SERVICE);
int batLevel = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
Если вы хотите вернуть процент заряда батареи в виде числа с плавающей запятой (пример 89,92%), вы можете использовать следующий код:
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batLevel = (float) level / (float) scale;
Теперь вы можете сделать следующее, чтобы получить время автономной работы в миллиамперах:
int batteryInMilliamps = getBatteryCapacity(getApplicationContext()) * batLevel;
Если вы получили какие-либо вопросы или у вас есть какие-либо вопросы, просто прокомментируйте ниже.
Попробуйте это, это поможет вам
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);
}