Как получить уровень заряда батареи в реальном времени на iOS с 1% гранулярностью
Я использую эту функцию для получения текущего уровня заряда аккумулятора устройства:
[[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
UIDevice *myDevice = [UIDevice currentDevice];
[myDevice setBatteryMonitoringEnabled:YES];
double batLeft = (float)[myDevice batteryLevel];
NSLog(@"%f",batLeft);
но результат имеет 5% гранулярности. Пример: когда аккумулятор телефона составляет 88%, он регистрирует только 0,85. batteryLevel
возвращает только значения с шагом 0,05. Например: 0,85, 0,9, 0,95 и никогда не возвращает значения, такие как 0,82 или 0,83.
Есть ли какое-либо решение для получения процента с более высокой точностью?
Ответы
Ответ 1
ознакомьтесь с этим сайтом:
Программный уровень чтения аккумулятора
но, осторожно используйте. все API-интерфейсы, используемые здесь, не документированы на iPhone и, вероятно, приведут к отказу, если вы отправите это приложение в App Store. Хотя состояние заряда батареи не совсем точно, я бы рекомендовал использовать методы мониторинга батареи UIDevice.
Ответ 2
Существует четыре разных способа считывания уровня заряда батареи, и все четыре способа могут возвращать разные значения.
Вот диаграмма этих значений во времени.
Значения были записаны в этом проекте iOS: https://github.com/nst/BatteryChart
Пожалуйста, ознакомьтесь с кодом для справки.
![iPhone 5 Battery]()
Ответ 3
[[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
UIDevice *myDevice = [UIDevice currentDevice];
[myDevice setBatteryMonitoringEnabled:YES];
double batLeft = (float)[myDevice batteryLevel] * 100;
NSLog(@"%.f",batLeft);
NSString * levelLabel = [NSString stringWithFormat:@"%.f%%", batLeft];
lblLevel.text = levelLabel;
Ответ 4
Ответы выше, очень хорошие, но все они в Obj-C, я использовал их с другими примерами для выполнения той же задачи на MonoTouch
, поэтому я помещаю свой код здесь, если кому-то это понадобится:
try
{
UIDevice.CurrentDevice.BatteryMonitoringEnabled = true;
_Battery.Level = (int)(UIDevice.CurrentDevice.BatteryLevel * IOSBatteryLevelScalingFactor);
_Battery.State = UIDevice.CurrentDevice.BatteryState;
}
catch (Exception e)
{
ExceptionHandler.HandleException(e, "BatteryState.Update");
throw new BatteryUpdateException();
}
finally
{
UIDevice.CurrentDevice.BatteryMonitoringEnabled = false;
}
У меня также есть полная запись в моем блоге, чтобы предоставить все подробности в здесь