2013-01-08 9 views
6

La mia intenzione è di aver salvato in Preferenze lo stato corrente del dispositivo USB cavo di alimentazione/USB: connesso/disconnesso. Dal sito dello sviluppatore vedo che ci sono due intenzioni per ottenere quello stato: ACTION_POWER_CONNECTED/DISCONNECTED. Così ho usato lo stesso codice come pubblicato agli sviluppatori:Ottenere l'evento IN/OUT con cavo USB inserito utilizzando EXTRA_PLUGGED non funziona

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

nella sezione monitorare i cambiamenti nello stato di carica.

manifesto

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

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

Quando sto collegando il cavo USB IN/OUT di trasmissione è sempre inviato e catturato in PowerConnectionReceiver ma sempre con lo stesso risultato (correttamente = il cavo è scollegato).

L'ho provato con Galaxy Nexus 4.1.1/4.2.1 - Ricevo sempre 2xFALSE in Toast (chargePlug = FALSE, usbCharge = FALSE).

Perché intent.getIntExtra (BatteryManager.EXTRA_PLUGGED, -1) ritornano sempre valore predefinito "-1"?

Grazie.

ps. tutto funziona correttamente se registro il ricevitore in Java

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

... in Servizio o in Attività. Tuttavia, secondo il sito degli sviluppatori Android, non è necessario eseguire il codice sopra per restituire il valore corretto;

+0

Mi chiedo se questo ha qualcosa a che fare con questi problemi? [This] (http://code.google.com/p/android/issues/detail?id=25701) e [This] (http://code.google.com/p/android/issues/detail?can = 2 & start = 0 & num = 100 & q = & colspec = ID% 20Type% 20Status% 20Owner% 20Summary% 20Stars & groupby = & sort = & id = 25703) – TronicZomB

risposta

8

Mi stavo occupando dello stesso problema, incrociando il tuo post. Penso che il problema sia che il codice, nella pagina di allenamento di Android a cui hai fornito un link, è sbagliato.

ACTION_POWER_CONNECTED e ACTION_POWER_DISCONNECTED non stanno "trasportando" i dati che stai richiedendo dall'intenzione del tuo codice. Non sono riuscito a far funzionare le stesse cose sui miei dispositivi (1 ° gen Nexus 7 con Android 4.3 e Nexus One con Android 2.3.6) e, dato che sembra non funzionare da nessuna parte, arrivo al "codice errato" conclusione.

L'ho risolto con il seguente codice. In realtà è molto vicino a quello che hai fornito come correzione, tranne per il fatto che sta entrando nel mio BroadcastReceiver direttamente e non in un'attività. Nel tuo codice qui sopra, lo snippet qui andrebbe subito prima della riga che inizia con "int chargePlug". Successivamente, cambia "intent" nella stessa riga (la tua linea), iniziando "int chargePlug", in "mIntent".

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

Attenzione, il tuo BroadcastReceiver avrà ora due intenti. Ne è passato uno, che sarà l'intento contenente l'azione ACTION_POWER_CONNECTED (o ACTION_POWER_DISCONNECTED), e l'altro creato all'interno del BroadcastReceiver per estrarre espressamente le informazioni sulla batteria.

Lo snippet di codice che ho fornito non funzionava se lo hai inserito in un'attività (non si collegava al tuo BroadcastReceiver) a causa del null nell'elenco dei parametri. In realtà non stai registrando un BroadcastReceiver con quel valore null.La modifica del valore null su BroadcastReceiver non sarebbe ideale, poiché la notifica ACTION_BATTERY_CHANGED può attivare A LOT. Sono abbastanza fiducioso che ACTION_BATTERY_CHANGED non fosse destinato a essere utilizzato come trigger per un BroadcastReceiver. Invece, penso che sia destinato ad essere utilizzato in tempo reale per ottenere l'ultima trasmissione "appiccicosa" con informazioni su un cambiamento nelle informazioni sulla batteria (cercare "trasmissione appiccicosa" nella documentazione di Android).

Si noti inoltre che lo snippet che ho fornito include "getApplicationContext()" nella catena di chiamate. Tiralo fuori e i dispositivi Gingerbread si schiantano (grazie a CommonsWare).

2

io non sono sicuro perché si hanno problemi, ma che cosa ha funzionato per me era la registrazione del per le azioni ACTION_POWER_CONNECTED e 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> 

e attuare il ricevitore trasmissione in questo modo:

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; 

    } 
} 
Problemi correlati