Получение USB-кабеля, подключенного к входу IN / OUT с использованием EXTRA_PLUGGED, не работает

Мое намерение состоит в том, чтобы сохранить в настройках текущий статус устройства Android usb / power cable: подключен / отключен. С сайта разработчика я вижу, что для получения этого статуса есть два намерения: ACTION_POWER_CONNECTED / DISCONNECTED. Поэтому я использовал тот же код, что и в Developers:

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

В разделе «Изменения монитора в состоянии зарядки».

манифест

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

Java-код

 public class PowerConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; Toast.makeText(context, "pvr = " + usbCharge + ", " + acCharge + "," + isCharging, Toast.LENGTH_SHORT).show(); } } 

Когда я подключаю USB-кабель IN / OUT, вещание всегда правильно отправляется и попадает в PowerConnectionReceiver, но всегда с тем же результатом (= кабель подключен).

Я тестировал его с Galaxy Nexus 4.1.1 / 4.2.1. Я всегда получаю 2xFALSE в Toast (chargePlug = FALSE, usbCharge = FALSE).

Почему intent.getIntExtra (BatteryManager.EXTRA_PLUGGED, -1) всегда возвращает значение по умолчанию «-1»?

Спасибо.

пс. Все работает нормально, если я зарегистрирую приемник на Java

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

… в Службе или в действии. Но, согласно сайту разработчиков Android, не обязательно делать код выше, чтобы вернуть правильное значение;

Solutions Collecting From Web of "Получение USB-кабеля, подключенного к входу IN / OUT с использованием EXTRA_PLUGGED, не работает"

Я имел дело с одной и той же проблемой, проходящей через ваш пост. Я думаю, проблема в том, что код на странице обучения для Android, на которую вы предоставили ссылку, неверен.

ACTION_POWER_CONNECTED и ACTION_POWER_DISCONNECTED не «переносят» данные, которые вы запрашиваете из намерения вашего кода. Я не мог получить тот же самый материал для работы на своих устройствах (1-й ген Nexus 7 под управлением Android 4.3 и Nexus One под управлением Android 2.3.6), и, поскольку он, кажется, нигде не работает, я пришел к «плохому коду», вывод.

Я исправил его следующим кодом. Это на самом деле очень близко к тому, что вы предоставили в качестве исправления, за исключением того, что оно входит в мой BroadcastReceiver напрямую, а не в действие. В вашем коде выше, фрагмент здесь будет идти непосредственно перед началом строки «int chargePlug». После этого измените «намерение» в той же строке (ваша строка), начиная «int chargePlug», до «mIntent».

 final Intent mIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

Имейте в виду, что у вашего BroadcastReceiver теперь будет два намерения. Один из них перешел к нему, что будет целью, содержащей действие ACTION_POWER_CONNECTED (или ACTION_POWER_DISCONNECTED), а другое, созданное в BroadcastReceiver, явно для извлечения информации о батарее.

Фрагмент кода, который я предоставил, не будет работать, если вы поместили его в действие (оно не будет подключаться к вашему BroadcastReceiver) из-за нулевого в списке параметров. Вы фактически не регистрируете BroadcastReceiver с этим нулем. Изменение нулевого значения на ваш BroadcastReceiver не было бы идеальным, поскольку уведомление ACTION_BATTERY_CHANGED может вызвать LOT. Я вполне уверен, что ACTION_BATTERY_CHANGED не предназначался для использования в качестве триггера для BroadcastReceiver. Вместо этого я думаю, что он предназначен для использования в режиме реального времени, чтобы получить последнюю «липкую» трансляцию с информацией об изменении информации о батарее (посмотрите «липкую трансляцию» в документации на Android).

Также обратите внимание, что приведенный фрагмент включает в себя «getApplicationContext ()» в цепочке вызовов. Возьмите его, и устройства Gingerbread будут разбиты (спасибо CommonsWare).

Я не уверен, почему у вас проблемы, но для меня работала регистрация действий ACTION_POWER_CONNECTED и ACTION_POWER_DISCONNECTED:

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

И реализовать широковещательный приемник следующим образом:

 public class PowerReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction() == Intent.ACTION_POWER_CONNECTED) { //Handle power connected } else if(intent.getAction() == Intent.ACTION_POWER_DISCONNECTED){ //Handle power disconnected } } } 
 public class PowerConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final Intent mIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int status = mIntent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; int chargePlug = mIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BATTERY_PLUGGED_AC; } }