2016-11-24 4 views
3

В моем приложении я хочу проверить, заряжен ли телефон сокет или USB. Для этого я создал BroadcastReceiver со следующим кодом:ACTION_POWER_CONNECTED не отправлен Intent

манифеста:

<receiver 
    android:name=".ChargingReceiver" 
    android:enabled="true" android:exported="false"> 

    <intent-filter> 
     <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> 
     <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> 
    </intent-filter> 
</receiver> 

ChargingReceiver

public void onReceive(Context context, Intent intent) { 
    int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 

    boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC); 
    boolean usbCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_USB); 

    //... 
} 

Моя проблема в том, что первая строка ChargingReceiver всегда возвращают -1 который является значением по умолчанию, которое я установил. BroadcastReceiver вызывается правильно, когда я подключаю или отключает свой телефон, поэтому мне кажется, что намерение не содержит Extra Я пытаюсь найти. У меня есть код от here, поэтому он должен работать.

Я также нашел this ответ, но это мне не помогает, потому что я должен различать зарядку USB и зарядку сокетов. Любые идеи, что я сделал неправильно? BTW Я протестировал код с Android Nougat. Я думаю, что на леденец она работала, но я не совсем уверен, что ...

ответ

1

Вы зарегистрировали ACTION_POWER_CONNECTED и ACTION_POWER_DISCONNECTED в своем манифесте. Но эти трансляции не включают информацию о состоянии зарядки.

Для получения информации о состоянии зарядки вам необходимо зарегистрировать трансляцию ACTION_BATTERY_CHANGED. Из документов Разработчик:

BatteryManager передач все батареи и детали зарядки в липкого Intent, который включает состояние зарядки.

Таким образом, вы можете попробовать следующий фрагмент кода в onReceive:

Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
boolean pluggedAC = (plugged == BatteryManager.BATTERY_PLUGGED_AC); 
boolean pluggedUSB = (plugged == BatteryManager.BATTERY_PLUGGED_USB); 

Вы можете прочитать больше об этом here

+0

Ничего себе это работает спасибо за это! Я думаю, что это не лучшее решение, потому что я реагирую с помощью «Broadcast» на «Broadcast», но поскольку я не могу зарегистрировать этот «Intent» через манифест, это единственное решение, которое я могу использовать или у вас есть идеи, чтобы украсить это? Или я немного мелочен с этим? – Cilenco

+0

Я думаю, что делать это в вашем широковещательном приемнике было бы хорошим решением, так как вы хотите получать информацию о статусе батареи в случае изменения состояния подключения к сети – IIIIIIIIIIIIIIIIIIIIII

0

попробовать это

 int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
     boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || 
          status == BatteryManager.BATTERY_STATUS_FULL; 

     int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
     boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
     boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 

Как предполагают, на @MarkB вы должны явно зарегистрировать ACTION_BATTERY_CHANGED из кода Java refer

+0

Спасибо за ответ, но я сожалею. Это также не работает – Cilenco

+0

какое значение вы получаете для boolean isCharging? – Nas

+0

Он также всегда возвращает false. – Cilenco

1

@MarkB подход является правильным, это же один из них предложил в документации для разработчиков , Я хотел бы указать, что вам не нужно регистрировать BroadcastReceiver, потому что это Sticky Intent.

В основном все, что вам нужно сделать, это позвонить registerReceiver переходящие в нуль в качестве приемника и, конечно, действия (Intent.ACTION_BATTERY_CHANGED):

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
Intent batteryStatus = context.registerReceiver(null, ifilter); 

И тогда вы можете сделать это следующим образом:

// Are we charging/charged? 

int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || 
        status == BatteryManager.BATTERY_STATUS_FULL; 

// How are we charging? 
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 

(Эти фрагменты являются не моими, но из документов)

Обратите внимание, что нет ничего плохого в этом, так как документы предлагают это.

Теперь, возвращаясь к коду вы на самом деле listeting для ACTION_POWER_CONNECTED и ACTION_POWER_DISCONNECTED, которые используются для мониторинга изменений в состоянии зарядки и может быть полезными для обработки количества батареи вы можете использовать.

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