2012-03-13 23 views
52

Tengo una aplicación con un botón que utilizo para encender y apagar BT. Tengo el siguiente código allí;¿Detecta cambios de estado realizados en 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(); 
    } 
} 

estoy llamando botón Flip, que voltea el estado de BT, y luego llama ButtonText, que debe actualizar la interfaz de usuario. Sin embargo, el problema que estoy teniendo es que BT tarda unos segundos en encenderse, y durante estos segundos, el estado de BT no está habilitado, lo que hace que mi botón diga que Bluetooth está apagado, incluso si estará encendido en 2 segundos.

Encontré la constante STATE_CONNECTING en la documentación de Android de BluetoothAdapter, pero ... simplemente no sé cómo usarlo, siendo un novato y todo.

Por lo tanto, tengo dos preguntas:

  1. ¿Hay una manera de atar dinámicamente un elemento de interfaz de usuario (por ejemplo, un botón o imagen) a un estado de BT, de modo que cuando los cambios de estado de BT, el botón también cambiará?
  2. De lo contrario, me gustaría presionar el botón y obtener el estado correcto (me gustaría que diga BT encendido, incluso si solo se está conectando, ya que estará encendido en 2 segundos). ¿Cómo hago esto?
+0

no se puede utilizar un valor lógico y la ponemos a true vez BT comienza a encender, a continuación, comprobar el estado booleano para cambiar el ¿botón? –

+0

Eche un vistazo a este código AOSP para tener una idea de cómo están rastreando los cambios de activación/desactivación de bluetooth: http://androidxref.com/5.1.0_r1/xref/frameworks/base/services/core/java/com/ android/server/BluetoothManagerService.java –

Respuesta

149

Usted tendrá que registrar un BroadcastReceiver para escuchar a cualquier cambio en el estado de la BluetoothAdapter:

como una variable de instancia privada en su Activity (o en un archivo de clase independiente ... lo que uno se prefiere):

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

Tenga en cuenta que esto supone que su Activity implementa un método setButtonText(String text) que cambiará el texto Button 's en consecuencia.

Y luego, en su Activity, registrar y eliminar la BroadcastReceiver de la siguiente manera,

@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, esto casi funciona. unas pocas cosas. primero, creo que quería registrar BluetoothAdapter, no BluetoothDevice, ya que BluetoothDevice es cuando empareja el dispositivo, y solo tiene un BluetoothDevice.ACTION_BOND_STATE_CHANGED, que no se aplicará aquí. También agregué un; después del código de broadcastReceiver (solo estoy escribiendo esto para futuros usuarios que tendrán el mismo problema y lo leo), sin embargo, obtengo una "Java.lang.RuntimeException: no se puede instanciar la actividad de ComponentInfo", lo que generalmente significa mi actividad no está registrada en manifiesto, ¿tengo que registrar el receptor allí? – raingod

+0

¡ja! Soy un idiota :) Descubrí mi problema. así que, sí, aparte de las cosas de código que mencioné allí, esto funciona maravillosamente :) ¡gracias Alex! – raingod

+0

no hay problema! perdón por los errores tipográficos ... mientras lo escribía, sabía que debía haber un par :). –

Cuestiones relacionadas