Обнаружение изменений состояния, сделанных в адаптере Bluetooth? - PullRequest
66 голосов
/ 14 марта 2012

У меня есть приложение с кнопкой, которое я использую для включения и выключения BT.У меня есть следующий код:

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

Я вызываю кнопку Flip, которая переворачивает состояние BT, а затем вызывает ButtonText, который должен обновить пользовательский интерфейс.Однако проблема, с которой я столкнулся, заключается в том, что BT включается через несколько секунд, и в течение этих секунд состояние BT не активируется, и моя кнопка отключает Bluetooth, даже если он будет включен через 2 секунды.

Я нашел константу STATE_CONNECTING в документации по Android для BluetoothAdapter, но ... я просто не знаю, как ее использовать, будучи новичком и все такое.

Итак, я 'У нас есть два вопроса:

  1. Есть ли способ динамически привязать элемент пользовательского интерфейса (например, кнопку или изображение) к состоянию BT, чтобы при изменении состояния BT кнопка изменялась какхорошо?
  2. В противном случае, я бы хотел нажать кнопку и получить правильное состояние (я бы хотел, чтобы он включил BT, даже если он только подключается, так как он будет включен через 2 секунды).Как мне это сделать?

1 Ответ

176 голосов
/ 14 марта 2012

Вы захотите зарегистрировать BroadcastReceiver для прослушивания любых изменений в состоянии BluetoothAdapter:

Как личная переменная экземпляра в вашем Activity (или в отдельном файле класса ... в зависимости от того, какой файл вы предпочитаете):

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

Обратите внимание, что это предполагает, что ваш Activity реализует метод setButtonText(String text), который соответствующим образом изменит текст Button.

А затем в вашем Activity зарегистрируйте и отмените регистрацию BroadcastReceiver следующим образом:

@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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...