【Java】Android端末でBluethoothデバイスを検出する方法

大分久しぶりの 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

 

プログラムの流れとしては、下記のような感じです。

  1. 端末が Bluetooth に対応しているか確認する
  2. 端末の Bluetooth が ON になっているか確認する(OFFだったらONにするように促すダイアログ表示)
  3. 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 デバイスを検出する方法でした。
デバイスとの接続とデータ通信については、でき次第記事にしたいと思います。
参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG