mucchinのAndroid戦記

BluetoothのHeadsetの接続状態の管理方法

前回の記事「アプリケーション起動時のBluetoothのHeadset接続状態の取得方法」にて、アプリケーション起動開始時のBluetoothヘッドセットの接続状態を取得する方法をご紹介しました。
せっかくなので、起動中にBluetoothヘッドセットを着脱された場合の処理も実装してやりましょう。

まずは、ActivityのonCreateイベントで、以下のようなコードを追加します。


IntentFilter bluetoothFilter = new IntentFilter();
bluetoothFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
bluetoothFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);

BluetoothReceiver bluetoothReceiver = new BluetoothReceiver();
this.registerReceiver(bluetoothReceiver, bluetoothFilter);


まず1から3行目で、Bluetoothデバイスが接続された場合と、接続が切れた場合のイベントを受け取れるように設定をしたIntentFilterインスタンスを用意します。
その後で、実際にイベントを受け取るリスナーと共に、registerReceiver()を用いて登録します。
上記コード内にあるBluetoothReceiverクラスは以下のような形です。
private class BluetoothReceiver extends BroadcastReceiver {
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if(BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)){
         if(mBluetoothHeadset != null){
             List<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices();
             if(devices.size() > 0){
                 isBluetoothConnected = true;
                 bluetoothDevice = devices.get(0);
             }
         }
        }else if(BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)){
          isBluetoothConnected = false;
          if(mBluetoothHeadset != null){
              List<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices();
              if(devices.size() > 0){
                  isBluetoothConnected = true;
                  bluetoothDevice = devices.get(0);
              }
          }
        }
    }
}
上記コード内で出現する変数「mBluetoothHeadset」は、前回の記事「アプリケーション起動時のBluetoothのHeadset接続状態の取得方法」で掲載しているサンプルコードにあります。BluetoothHeadsetという型のインスタンスです。
このBluetoothの着脱のイベントは、Headset以外のBluetooth機器の場合でもコールバックされますので、ヘッドセット機器かどうかの判定が必要です。
前回のサンプルコード同様、Bluetoothヘッドセットが接続されているかどうかは、BluetoothHeadset.getConnectedDevices()の戻り値によって判定しています。

Bluetooth機器が外れたときのイベント「BluetoothDevice.ACTION_ACL_DISCONNECTED」の場合は、まずはBluetooth機器接続中を示すフラグを落としておきます。その後、同じように現在、他のBluetoothヘッドセットが接続されているかを確認して、あればもう一度フラグを立て直してやる、という事をしています。


一応、上記のやり方で、プログラム的には、アプリ起動中のBluetooth機器の接続状態を管理できます。
ただ、Bluetooth機器によっては、接続開始時に不安定な状態(正しく接続されず、「メディアを除く」とか「電話を除く」のような状態になる)になる事が稀にあるようです。
ですので、運用的に可能なら、確実に接続してもらってからアプリを使ってもらう、というのが良いと思いますね。

今回は以上です。