2012-03-13 13 views
52

Ho un'app con un pulsante che uso per attivare e disattivare BT. Ho il seguente codice in là;Rilevamento delle modifiche di stato apportate a BluetoothAdapter?

public void buttonFlip(View view) { 
    flipBT(); 
    buttonText(view); 
} 

public void buttonText(View view) { 
    Button buttonText = (Button) findViewById(R.id.button1); 
    if (mBluetoothAdapter.isEnabled() || (mBluetoothAdapter.a)) { 
     buttonText.setText(R.string.bluetooth_on); 
    } else { 
     buttonText.setText(R.string.bluetooth_off); 
    } 
} 

private void flipBT() { 
    if (mBluetoothAdapter.isEnabled()) { 
     mBluetoothAdapter.disable();  
    } else { 
     mBluetoothAdapter.enable(); 
    } 
} 

sto chiamando pulsante Flip, che ribalta lo stato BT, e quindi chiama ButtonText, che dovrebbe aggiornare l'interfaccia utente. Tuttavia, il problema che sto riscontrando è che occorrono alcuni secondi affinché BT si accenda, e durante questi secondi, lo stato BT non è abilitato, facendo sì che il mio pulsante dica Bluetooth disattivato, anche se sarà acceso in 2 secondi.

Ho trovato la costante STATE_CONNECTING nella documentazione Android BluetoothAdapter, ma ... Semplicemente non so come usarlo, essendo un principiante e tutto il resto.

Così, ho due domande:

  1. C'è un modo per legare dinamicamente un elemento dell'interfaccia utente (ad esempio un pulsante o immagine) a uno stato di BT, in modo che quando i cambiamenti di stato BT, anche il pulsante cambierà?
  2. Altrimenti, vorrei premere il pulsante e ottenere lo stato corretto (vorrei che dicesse BT acceso, anche se è solo in connessione, dato che sarà acceso in 2 secondi). Come faccio a fare questo?
+0

non è possibile utilizzare un valore booleano e impostarlo su true una volta BT inizia a girare su, quindi controllare lo stato booleano per cambiare il pulsante? –

+0

Dai un'occhiata a questo codice AOSP per avere un'idea di come stanno monitorando le modifiche bluetooth on/off: http://androidxref.com/5.1.0_r1/xref/frameworks/base/services/core/java/com/ android/server/BluetoothManagerService.java –

risposta

149

Si vuole registrare un BroadcastReceiver di ascoltare di eventuali modifiche di stato del BluetoothAdapter:

Come variabile di istanza privata nella vostra Activity (o in un file di classe separata ... quale uno voi preferire):

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 

     if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { 
      final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 
               BluetoothAdapter.ERROR); 
      switch (state) { 
      case BluetoothAdapter.STATE_OFF: 
       setButtonText("Bluetooth off"); 
       break; 
      case BluetoothAdapter.STATE_TURNING_OFF: 
       setButtonText("Turning Bluetooth off..."); 
       break; 
      case BluetoothAdapter.STATE_ON: 
       setButtonText("Bluetooth on"); 
       break; 
      case BluetoothAdapter.STATE_TURNING_ON: 
       setButtonText("Turning Bluetooth on..."); 
       break; 
      } 
     } 
    } 
}; 

si noti che questo presuppone che il Activity implementa un metodo setButtonText(String text) che cambierà il testo 's il Button conseguenza.

E poi nel vostro Activity, registrare e annullare la registrazione del BroadcastReceiver come segue,

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    /* ... */ 

    // Register for broadcasts on BluetoothAdapter state change 
    IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
    registerReceiver(mReceiver, filter); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    /* ... */ 

    // Unregister broadcast listeners 
    unregisterReceiver(mReceiver); 
} 
+0

Alex, questo funziona quasi. poche cose. in primo luogo, penso che intendevi registrare BluetoothAdapter, non BluetoothDevice, poiché BluetoothDevice è quando accoppi il dispositivo, e ha solo un BluetoothDevice.ACTION_BOND_STATE_CHANGED, che non si applica qui. Ho anche aggiunto un; dopo il codice broadcastReceiver (sto solo scrivendo questo per persone future che avranno lo stesso problema e leggerlo), tuttavia, sto ricevendo un "Java.lang.RuntimeException: Impossibile istanziare l'attività ComponentInfo", che di solito significa la mia attività non è registrata in manifest-do ho bisogno di registrare il ricevitore lì? – raingod

+0

ha! Sono un idiota :) Ho capito il mio problema. quindi, a parte il codice, le cose che ho menzionato lassù, funziona magnificamente :) grazie Alex! – raingod

+0

nessun problema! mi dispiace per gli errori di battitura ... mentre stavo scrivendo, sapevo che ci doveva essere un paio :). –

Problemi correlati