2012-06-19 7 views
3

Когда батарея разрядится, Android отправит намерение ACTION_BATTERY_LOW. Затем, когда все будет хорошо, он отправляет ACTION_BATTERY_OKAY.Опрос ACTION_BATTERY_LOW

К сожалению, если приложение запущено , а аккумулятор разряжен, тогда я не получаю сообщение о намерениях; он не липкий, поэтому я не могу определить, сохранилось ли предупреждение о батарее. ACTION_BATTERY_CHANGED - липкий, но он сообщает мне текущее состояние заряда аккумулятора, а не о том, объявила ли система о низком заряде батареи или нет.

Есть ли способ определить, является ли батарея низкой в ​​любой момент?

+0

Почему бы просто не проверить батарею при запуске приложения? – tyczj

+0

Потому что я не знаю, на каком уровне система заявляет о низком заряде батареи или нет. –

+0

15% - предупреждение о низком заряде батареи для системы. – tyczj

ответ

1

Обычно предупреждение о разряде батареи появляется на 15%, поэтому вы можете проверить, равен ли уровень батареи или меньше 15%.

+1

... если производитель не изменит ее, конечно. Я сделаю это, если понадобится, но надеюсь, что я не буду. Спасибо хоть. –

+1

Возможно, вы можете прочитать определение низкого уровня. проверить исходный код Android: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.7_r1/com/android/server/BatteryService.java#BatteryService.0mLowBatteryWarningLevel в частности, mLowBatteryWarningLevel = mContext.getResources(). getInteger ( 128 com.android.internal.R.integer.config_lowBatteryWarningLevel); – Ran

+1

Это, к сожалению, личное, поэтому у меня нет доступа к 'com.android.internal'. Но значение константы хорошо определено, поэтому я мог бы, взломав, извлечь его таким образом. Однако это зло. Кроме того, из исходного кода (спасибо за ссылку, BTW), предупреждения о низком заряде батареи не совсем соответствуют уровню заряда аккумулятора, который составляет менее 15%. –

1

Липкое намерение все еще имеет некоторую информацию. Вы должны все еще быть в состоянии получить уровень заряда батареи

int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 

float batteryPct = level/(float)scale; 

взяты из http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

+1

Да, но это было не то, что я спросил. Я не хочу знать, что такое уровень заряда батареи, я хочу знать, объявила ли система о низком заряде батареи. Это не одно и то же. –

+0

boolean isLowBattery (плавающий аккумуляторPct) {возврат аккумуляторPct <15? true: false; } –

+1

@FrankSposaro Я думаю, вы неправильно поняли его вопрос. '15' является жестко запрограммированным номером. –

2

Это очень сложно question.The код, связанный с Android Developer имеет ошибку.

В принципе, вы можете узнать, как обнаружить его по этой ссылке:

https://developer.android.com/training/monitoring-device-state/battery-monitoring.html

Вы можете обнаружить ли он заряжается или не заряжается и низкий заряд батареи или нет вещательного приемника, используя метод OnReceive (контекст контекст, намерение намерение) {}

Однако, есть ошибка в этой связи, для мониторинга существенных изменений. [Обратите внимание здесь, имя действия android.intent.action.ACTION_BATTERY_LOW]

[1]

Но посмотрим, как это описано в намерении.

ACTION_BATTERY_LOW

Добавлено в уровне API 1 Строка ACTION_BATTERY_LOW Broadcast Действие: Показывает низкое состояние батареи на устройстве. Эта трансляция соответствует диалоговому окну «Предупреждение о низком заряде батареи».

Это защищенный объект, который может быть отправлен системой.

Постоянное значение: «android.intent.action.BATTERY_LOW» Вы можете найти это в Android Developers Intent.

Иными словами, здесь случается ошибка. Следует action.BATTERY_LOW вместо action.ACTION_BATTERY_LOW.So ваш код в AndroidManifest должно быть:

<receiver android:name=".receiver.BatteryLevelReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BATTERY_LOW"/> 

      <!--instead of android.intent.action.ACTION_BATTERY_LOW--> 
     </intent-filter> 
    </receiver> 

Кроме того, убедитесь у вас есть приемник правильно.

public class BatteryLevelReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 

     Toast.makeText(context, "BAttery's dying!!", Toast.LENGTH_LONG).show(); 
     Log.e("", "BATTERY LOW!!"); 

} 

}

Это отлаживать вольно сложном или получить вход на вашем ноутбуке, использование Тост может помочь.

 Toast.makeText(context, "BAttery's dying!!", Toast.LENGTH_LONG).show(); 
     //Toast.makeText(Context context, String str, Integer integer).show(); 

Надеюсь, это поможет решить вашу проблему.

+0

Это работает только в том случае, если приложение запущено при отправке намерения. Если он запускается, когда объявлено предупреждение о низком заряде батареи, я не получаю намерения. –

+0

Прошу прощения ... Я немного смущен. Но вам нужно запустить приложение, чтобы получить намерение, потому что оно зарегистрировано в AndroidManifest в вашем проекте. –

Смежные вопросы