2013-01-08 29 views
6

Moim zamiarem jest zapisanie w Preferencjach bieżącego stanu urządzenia z systemem Android. Kabel USB/zasilający: podłączony/odłączony. Z witryny dla programistów widzę, że istnieją dwie możliwości uzyskania tego statusu: ACTION_POWER_CONNECTED/DISCONNECTED. Więc użyłem tego samego kodu opublikowanej programistów:Uzyskiwanie połączenia za pomocą kabla usb z wejściem IN/OUT przy użyciu EXTRA_PLUGGED nie działa

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

w sekcji Zmiany monitora w stan naładowania.

Oczywisty

<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> 

kod 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(); 
    } 
} 

Kiedy jestem podłączając kabel USB IN/OUT niż transmisja jest zawsze poprawnie wysłana i złapany w PowerConnectionReceiver ale zawsze z tego samego rezultatu (= kabel jest odłączony).

Testowałem to z Galaxy Nexus 4.1.1/4.2.1 - Zawsze otrzymuję 2xFALSE w Toast (chargePlug = FALSE, usbCharge = FALSE).

Dlaczego intent.getIntExtra (BatteryManager.EXTRA_PLUGGED, -1) zawsze zwraca wartość domyślną "-1"?

Dziękuję.

ps. wszystko działa poprawnie, gdy rejestruję odbiornik w Javie

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

... w usłudze lub w działaniu. Jednak zgodnie z witryną Android Developers nie jest konieczne, aby kod powyżej zwrócił poprawną wartość;

+0

Zastanawiam się, czy to ma coś wspólnego z tymi problemami? [This] (http://code.google.com/p/android/issues/detail?id=25701) & [This] (http://code.google.com/p/android/issues/detail?can = 2 & start = 0 & num = 100 & q = & colspec = ID% 20Type% 20Status% 20Owner% 20Podsumowanie% 20Stars & groupby = & sort = & id = 25703) – TronicZomB

Odpowiedz

8

Miałem ten sam problem, natknąłem się na twój post. Myślę, że problem polega na tym, że kod na stronie szkoleniowej Android, do której podałeś link, jest błędny.

ACTION_POWER_CONNECTED i ACTION_POWER_DISCONNECTED nie "przenoszą" danych, o które pytasz, z intencji kodu. Nie mogłem uzyskać tych samych rzeczy do pracy na moich urządzeniach (1. gen Nexus 7 z Androidem 4.3 i Nexus One z systemem Android 2.3.6), a ponieważ wydaje się, że nie działa nigdzie, dochodzę do "złego kodu" wniosek.

Naprawiłem to za pomocą następującego kodu. Jest bardzo zbliżony do tego, co dostarczyłeś jako poprawkę, z tym wyjątkiem, że przechodzi bezpośrednio do mojego BroadcastReceiver, a nie do działania. W powyższym kodzie ułamek tutaj byłby tuż przed linią zaczynającą się od "int chargePlug". Następnie zmień "intencję" w tej samej linii (linia), zaczynając "int chargePlug", na "mIntent".

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

Należy pamiętać, że program BroadcastReceiver będzie teraz miał dwa zamiary. Jeden przekazany do niego, który będzie intencją zawierającą akcję ACTION_POWER_CONNECTED (lub ACTION_POWER_DISCONNECTED), a drugą utworzoną w BroadcastReceiver wyraźnie, aby wyodrębnić informacje o baterii.

Dostarczony przeze mnie fragment kodu nie zadziała, jeśli umieścisz go w działaniu (nie połączy się z BroadcastReceiver) z powodu wartości null na liście parametrów. W rzeczywistości nie rejestrujesz BroadcastReceiver z tą zerą.Zmiana wartości null na BroadcastReceiver również nie byłaby idealna, ponieważ powiadomienie ACTION_BATTERY_CHANGED może spowodować DUŻO. Jestem przekonany, że ACTION_BATTERY_CHANGED nie miał być używany jako wyzwalacz dla BroadcastReceiver. Zamiast tego, myślę, że ma być używany w czasie rzeczywistym, aby uzyskać ostatni "lepki" program z informacją o zmianie informacji o baterii (wyszukaj "lepkie wiadomości" w dokumentacji systemu Android).

Należy również zauważyć, że podany fragment kodu zawiera "getApplicationContext()" w łańcuchu wywołań. Wyjmij i urządzenia Gingerbread ulegną awarii (dzięki CommonsWare).

2

Nie jestem pewien, dlaczego masz problemy, ale co pracował dla mnie było rejestracji dla działań ACTION_POWER_CONNECTED i 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> 

i wdrażania odbiornika nadawania takiego:

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 
     } 
    } 
} 
1
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; 

    } 
}