大分久しぶりの 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 デバイスを検出する方法でした。
デバイスとの接続とデータ通信については、でき次第記事にしたいと思います。
参考になれば幸いです。