前回の記事「アプリケーション起動時の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機器によっては、接続開始時に不安定な状態(正しく接続されず、「メディアを除く」とか「電話を除く」のような状態になる)になる事が稀にあるようです。
ですので、運用的に可能なら、確実に接続してもらってからアプリを使ってもらう、というのが良いと思いますね。
今回は以上です。
Leave a Reply