Подтвердить что ты не робот

Я не могу получать трансляцию при изменении состояния батареи?

У меня такая же проблема, как и этот пост: Батарейный приемник не работает. Но, похоже, никто не ответил на этот вопрос.

Вот мой 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"/>

Но до сих пор нет успеха!

Я был бы очень признателен, если бы кто-нибудь мог сообщить мне, что я делаю неправильно.

4b9b3361

Ответ 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