Я не могу получать трансляцию при изменении состояния батареи?
У меня такая же проблема, как и этот пост: Батарейный приемник не работает. Но, похоже, никто не ответил на этот вопрос.
Вот мой BroadcastReceiver:
public class BatteryLevelReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.v("plugg", "plug change fired");
Toast.makeText(context, " plug change fired", Toast.LENGTH_LONG).show();
}
И вот мой AndroidManifest.xml:
<receiver android:name=".ReceversAndServices.BatteryLevelReceiver">
<intent-filter android:priority="900">
<action android:name="android.intent.action.BATTERY_LOW" />
</intent-filter>
</receiver>
<receiver android:name=".ReceversAndServices.BatteryLevelReceiver">
<intent-filter android:priority="900">
<action android:name="android.intent.action.BATTERY_CHANGED" />
</intent-filter>
</receiver>
Я также добавил эту строку в манифест:
<uses-permission android:name="android.permission.BATTERY_STATS"/>
Но до сих пор нет успеха!
Я был бы очень признателен, если бы кто-нибудь мог сообщить мне, что я делаю неправильно.
Ответы
Ответ 1
Из документация для ACTION_BATTERY_CHANGED:
Вы не можете получить это через компоненты, объявленные в манифесте, только путем явной регистрации для него с помощью Context.registerReceiver(). См. ACTION_BATTERY_LOW, ACTION_BATTERY_OKAY, ACTION_POWER_CONNECTED и ACTION_POWER_DISCONNECTED для различных связанных с батареей передач, которые отправляются и могут быть получены через приемники манифеста.
Там у вас есть: вы должны явно зарегистрировать его с вашего Java-кода.
Ответ 2
Я только что пошел по руководству разработчика Android на "Контроль уровня батареи и состояния зарядки" и имел немедленный успех. Если BatteryLevelReceiver - это собственный класс, я бы рекомендовал:
<receiver android:name=".BatteryLevelReceiver">
<intent-filter android:priority="900">
<action android:name="android.intent.action.BATTERY_LOW" />
<action android:name="android.intent.action.BATTERY_CHANGED" />
</intent-filter>
</receiver>
Дополнение
Я готов догадаться, что вы написали BatteryLevelReceiver как вложенный класс в ReceiversAndServices. Согласно Получателю как внутреннему классу в Android, вы не можете сделать это с помощью нестатических классов. Вы можете сделать BatteryLevelReceiver статическим классом и зарегистрировать ресивер в onResume(), но тогда ваше приложение должно будет работать, чтобы поймать события... Переместите ваш приемник в отдельный класс и зарегистрируйте эти намерения:
<receiver android:name=".BatteryLevelReceiver">
<intent-filter android:priority="900">
<action android:name="android.intent.action.BATTERY_LOW" />
<action android:name="android.intent.action.BATTERY_OKAY" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
(не BATTERY_CHANGED, как указано в Darshan Computing.)
Ответ 3
Убедитесь, что класс приемника аккумулятора не является подклассом другого, но как отдельный класс в вашем проекте.
Также попробуйте использовать метод Context.registerReceiver() явно в вашем коде и не забудьте его отменить: http://developer.android.com/reference/android/content/Context.html#registerReceiver%28android.content.BroadcastReceiver,%20android.content.IntentFilter%29