Как получить уровень заряда батареи в реальном времени на 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;
}

У меня также есть полная запись в моем блоге, чтобы предоставить все подробности в здесь