Detectar cambios de estado realizados en el BluetoothAdapter?


Tengo una aplicación con un botón que uso para activar y desactivar BT. Tengo el siguiente código ahí;

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 a button Flip, que cambia el estado BT, y luego llama a ButtonText, que debería actualizar la interfaz de usuario. Sin embargo, el problema que tengo 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 Bluetooth apagado, incluso si estará encendido en 2 segundos.

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

Entonces, tengo dos preguntas:

  1. ¿Hay una manera de vincular dinámicamente un elemento de la interfaz de usuario (como un botón o una imagen) a un estado BT, de modo que cuando el estado BT cambie, 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 dijera BT on, incluso si solo está conectando, ya que estará encendido en 2 segundo). ¿Cómo hago esto?
Author: Alex Lockwood, 2012-03-14

1 answers

Usted querrá registrar un BroadcastReceiver para escuchar cualquier cambio en el estado del BluetoothAdapter:

Como una variable de instancia privada en su Activity (o en un archivo de clase separado... el que prefieras):

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 asume que su Activity implementa un método setButtonText(String text) que cambiará el texto de Button en consecuencia.

Y luego en su Activity, registre y anule el 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);
}
 159
Author: Alex Lockwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-03 15:03:29