大分久しぶりの Java に関する投稿です。
今回は、Android 端末で Bluetooth デバイスを検出する方法です。
最終的には、Bluetooth デバイスからデータを取得したいのですが、まだそこまでできていないので、とりあえず検出まで。
今回参考にさせていただいたサイトはこちら。
BLUETOOTHで通信を行う(1)|TechBooster
https://techbooster.org/android/application/5191/Bluetoothを使ってAndroidアプリ同士で通信するには (1/2):Androidで動く携帯Javaアプリ作成入門(35) – @IT
https://www.atmarkit.co.jp/ait/articles/1209/12/news136.html
プログラムの流れとしては、下記のような感じです。
- 端末が Bluetooth に対応しているか確認する
- 端末の Bluetooth が ON になっているか確認する(OFFだったらONにするように促すダイアログ表示)
- Bluetooth デバイスを検索する
ですが、まずは AndroidManifest.xml に下記の3行を追加しましょう。
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
これがないとそもそも Bluetooth 使えないので、忘れずに。
では、サンプルコードです。
まず、1. 端末が Bluetooth に対応しているか確認する と、2. 端末の Bluetooth が ON になっているか確認する(OFFだったらONにするように促すダイアログ表示)のコードはこちら。
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBtAdapter != null){
// Bluetooth 対応端末の場合の処理
Log.d("MainActivity","Bluetoothがサポートされてます。");
boolean btEnable = mBtAdapter.isEnabled();
if (!btEnable){
// OFFだった場合、ON にすることを促すダイアログを表示する画面に遷移
Intent btOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(btOn, REQUEST_ENABLE_BLUETOOTH);
} else {
Log.d("MainActivity","BluetoothはONです。");
}
} else {
// Bluetooth 非対応端末の場合の処理
Log.d("MainActivity","Bluetoothがサポートされていません。");
}
@Override
protected void onActivityResult(int requestCode, int ResultCode, Intent date){
if(requestCode == REQUEST_ENABLE_BLUETOOTH){
if(ResultCode == Activity.RESULT_OK){
// Bluetooth が ONにされた場合の処理
Log.d("MainActivity","BluetoothはONです");
}else{
Log.d("MainActivity","BluetoothはOFFです");
}
}
}
なお、onCreate よりも上の階層で、下記の2行も宣言しておきます。
int REQUEST_ENABLE_BLUETOOTH = 3; BluetoothAdapter mBtAdapter;
コメントもかいてあるのでわかると思いますが…もしBluetooth に対応していて、Bluetooth の設定が OFF だったら Bluetooth のオンを促すダイアログを表示しています。
元々 Bluetooth が ON の場合や、そもそも Bluetooth に対応していない場合は、その旨をログで表示して終了しています。
次に、3. Bluetooth デバイスを検索する 方法です。
私も今回初めて使ったのですが、BroadcastReceiver というのを利用します。
サンプルコードは下記のとおりです。
//インテントフィルターとBroadcastReceiverの登録
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_DISCOVERY_STARTED);
filter.addAction(ACTION_FOUND);
filter.addAction(ACTION_NAME_CHANGED);
filter.addAction(ACTION_DISCOVERY_FINISHED);
getBaseContext().registerReceiver(mReceiver, filter);
//デバイスを検索する
if(mBtAdapter.isDiscovering()){
//検索中の場合は検出をキャンセルする
mBtAdapter.cancelDiscovery();
}
//一定時間の間検出を行う
mBtAdapter.startDiscovery();
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device;
switch (action) {
case ACTION_DISCOVERY_STARTED:
Log.d("MainActivity", "ACTION_DISCOVERY_STARTED");
break;
case ACTION_FOUND:
Log.d("MainActivity", "ACTION_FOUND");
// デバイスが見つかった場合、Intent から BluetoothDevice を取り出す
device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Log.d("MainActivity","device.name : "+device.getName()+", device.address : "+device.getAddress());
break;
case ACTION_NAME_CHANGED:
Log.d("MainActivity", "ACTION_NAME_CHANGED");
device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Log.d("MainActivity","device.name : "+device.getName()+", device.address : "+device.getAddress());
break;
case ACTION_DISCOVERY_FINISHED:
Log.d("MainActivity", "ACTION_DISCOVERY_FINISHED");
// デバイス検出が終了した場合は、BroadcastReceiver を解除
context.unregisterReceiver(mReceiver);
break;
}
}
};
IntentFilter で、デバイス検出の開始時・デバイス検出時・デバイス名の判明時・デバイス検出終了時 の利用をそれぞれ宣言し、BroadcastReceiver の関数内で、それぞれが発火したタイミングで実行する処理を定義しています。
今回は、デバイスを検出したタイミングで、そのデバイス情報を表示しているだけです。
接続とデータ通信を行うことになったら、それらの情報の保存を行う必要があるのかな?
なお、こちらの処理で躓いたのがデバイスの検出で、ACTION_FOUND のタイミングでデバイス情報を取得しようとしても、それが出来ませんでした。
で、試しに ACTION_NAME_CHANGED のタイミングでもデバイス情報を取得したところ…こちらでは取得できました!
ACTION_FOUND という名前が付いてはいますが、端末情報の取得は ACTION_NAME_CHANGED で行えるみたいで…ちょっとネーミングどうにかして、という気持ちになりましたね。
でも、とりあえず、デバイスの名前とアドレスは取得できました!
以上、Android アプリで Bluetooth デバイスを検出する方法でした。
デバイスとの接続とデータ通信については、でき次第記事にしたいと思います。
参考になれば幸いです。