it-swarm.com.de

Erkennen Sie Statusänderungen am BluetoothAdapter?

Ich habe eine App mit einer Schaltfläche, mit der ich BT ein- und ausschalten kann. Ich habe den folgenden Code drin;

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

Ich rufe den Button Flip auf, der den BT-Status umdreht, und rufe dann ButtonText auf, der die Benutzeroberfläche aktualisieren soll. Das Problem ist jedoch, dass das Einschalten von BT einige Sekunden dauert. In diesen Sekunden ist der BT-Status nicht aktiviert, sodass meine Taste Bluetooth deaktiviert anzeigt, auch wenn sie in 2 Sekunden eingeschaltet sein wird.

Ich fand die STATE_CONNECTING Konstante im BluetoothAdapter Android Dokumentation, aber ... Ich weiß einfach nicht, wie ich es benutzen soll, da ich ein Neuling bin und so.

Ich habe also zwei Fragen:

  1. Gibt es eine Möglichkeit, ein Benutzeroberflächenelement (z. B. eine Schaltfläche oder ein Bild) dynamisch mit einem BT-Status zu verknüpfen, sodass sich die Schaltfläche auch ändert, wenn sich der BT-Status ändert?
  2. Andernfalls möchte ich die Taste drücken und den richtigen Status erhalten (ich möchte, dass BT eingeschaltet ist, auch wenn nur eine Verbindung hergestellt wird, da es in 2 Sekunden eingeschaltet sein wird). Wie mache ich das?
67
raingod

Sie möchten ein BroadcastReceiver registrieren, um auf Änderungen des Status des BluetoothAdapter zu achten:

Als private Instanzvariable in Ihrem Activity (oder in einer separaten Klassendatei ... je nachdem, welche Sie bevorzugen):

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

Beachten Sie, dass dies voraussetzt, dass Ihr Activity eine Methode setButtonText(String text) implementiert, die den Text des Button entsprechend ändert.

Und dann registrieren Sie in Ihrem Activity das BroadcastReceiver wie folgt und heben die Registrierung auf,

@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