web-dev-qa-db-fra.com

Détecter les changements d'état apportés au BluetoothAdapter?

J'ai une application avec un bouton que j'utilise pour activer et désactiver BT. J'ai le code suivant là-dedans;

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

J'appelle le bouton Flip, qui retourne l'état BT, puis appelle ButtonText, qui devrait mettre à jour l'interface utilisateur. Cependant, le problème que je rencontre est qu'il faut quelques secondes pour que BT s'allume - et pendant ces secondes, l'état BT n'est pas activé, ce qui fait que mon bouton indique Bluetooth désactivé, même s'il sera activé dans 2 secondes.

J'ai trouvé le STATE_CONNECTING constante dans le BluetoothAdapter Android, mais ... je ne sais tout simplement pas comment l'utiliser, étant un débutant et tout.

J'ai donc deux questions:

  1. Existe-t-il un moyen de lier dynamiquement un élément d'interface utilisateur (tel qu'un bouton ou une image) à un état BT, de sorte que lorsque l'état BT change, le bouton change également?
  2. Sinon, je voudrais appuyer sur le bouton et obtenir le bon état (je voudrais qu'il dise BT allumé, même s'il ne fait que se connecter, car il sera allumé dans 2 secondes). Comment puis-je faire cela?
67
raingod

Vous voudrez enregistrer un BroadcastReceiver pour écouter tout changement dans l'état du BluetoothAdapter:

En tant que variable d'instance privée dans votre Activity (ou dans un fichier de classe séparé ... celui que vous préférez):

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

Notez que cela suppose que votre Activity implémente une méthode setButtonText(String text) qui changera le texte de Button en conséquence.

Et puis dans votre Activity, enregistrez et désenregistrez le BroadcastReceiver comme suit,

@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);
}
179
Alex Lockwood