1. ホーム
  2. java

BluetoothAdapterに加えられた状態の変化を検出する?

2023-09-04 23:39:58

質問

BTのON/OFFに使うボタンがついたアプリがあります。そこに次のコードがあります。

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 を呼び出し、UI を更新しています。しかし、私が抱えている問題は、BT がオンになるまでに数秒かかり、その数秒の間、BT 状態は有効になっていないため、2 秒後にオンになるとしても、私のボタンは Bluetooth オフと表示されることです。

私は STATE_CONNECTING 定数はBluetoothAdapterのアンドロイドのドキュメントにありましたが 初心者の私には使い方がわかりません。

そこで、2つ質問させてください。

  1. UI 要素 (ボタンや画像など) を BT 状態に動的に結び付けて、BT 状態が変化したときにボタンも変化するようにする方法はありますか。
  2. そうでなければ、ボタンを押して正しい状態を取得したいと思います (2秒後にオンになるので、接続しているだけであっても、BT オンを示すようにしたいと思います)。これを行うにはどうしたらよいですか?

どのように解決するのですか?

を登録することになります。 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);
}