利用可能なデバイスを発見する方法
Android 端末には Bluetooth の設定にて、あらかじめペアリングの設定をしておくことが可能です。
ペアリング済みの端末の設定は、プログラムの中では BluetoothAdapter オブジェクトを経由して取得可能な、 結合リスト (Bonded List) で簡単に取得できます。
この具体的な方法は「ペアリングされたデバイスリストの取得」をみてください。
ここではプログラム中でデバイスを発見する方法を説明します。
デバイスの発見手順は次の通りです。
まずは、BluetoothAdapter オブジェクトを取得します。
BluetoothAdapter.getDefaultAdapter() メソッドで BluetoothAdapter オブジェクトを取得できるのですが、 そもそも Bluetooth がサポートされていない端末ではこのメソッドは null を返します。
BluetoothAdapter オブジェクトの startDiscovery() メソッドを呼べば発見作業が開始されます。
発見作業は時間のかかるので、メソッドの戻り値として直ちに結果が得られるのではなくて、 システム側から「デバイスが見つかった」 という通知としてブロードキャストが送出されます。
従って、startDiscovery() を呼ぶ前にブロードキャストレシーバを登録しておく必要があります。このとき、 インテントフィルタに BluetoothDevice.ACTION_FOUND を追加しておきます。
btBroadcastReceiver = new BtBroadcastReceiver();
intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
registerReceiver(btBroadcastReceiver, intentFilter);
if (bluetoothAdapter.startDiscovery()) {
// 発見開始(結果はブロードキャストで取得)
} else {
// 発見開始できず。Bluetooth が無効であるなど。
}
ブロードキャストされたインテントから、BluetoothDevice オブジェクトを取得できます。BluetoothDevice オブジェクトからは、 名前やアドレスが取得できます。
class BtBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device = intent.getParcelableExtra(
BluetoothDevice.EXTRA_DEVICE);
String name = device.getName();
String s = deviceTextView.getText().toString();
s += (name == null ? "n/a" : name) + " [" + device.getAddress() + "]\r\n";
deviceTextView.setText(s);
}
}
}
}
BluetoothDevice オブジェクトが取得できれば、Bluetooth クライアントとして Bluetooth サーバー側に接続する準備ができます。 BluetoothDevice オブジェクトの createRfcommSocketToServiceRecord メソッドを呼び出すだけです。
尚、発見を行うには Android 6.0 以降は ACCESS_FINE_LOCATION または ACCESS_COARSE_LOCATION が必要です。 パーミッションについては「Bluetooth を利用するためのパーミッション設定」をみてください。
BluetoothDevice オブジェクトは、ここで紹介したように発見作業の結果として取得できますが、その他、 ペアリング済みのデバイスリストからも取得できます。
ペアリング自体、Android 端末で一度実施すればペアリングを記憶しておけるので、通常はデバイス利用時にあらかじめ行っておくとよいです。 プログラムからペアリングした端末の BluetoothDevice オブジェクトを取得する方法については 「ペアリングされたデバイスリストの取得」を参考にしてください。