LoginSignup
76
77

More than 5 years have passed since last update.

AndroidでBLE端末を見つけるための実装方法

Last updated at Posted at 2014-09-16

AndroidでBLE端末を見つけるための実装方法です。
BLEの仕様や用語等についてはiBeacon(BLE)とは - Qiita参照。

パーミッションの設定

BLEに接続するためには、以下のパーミッションを設定する必要があります。

AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

また、アプリがBLE対応端末のみに対応していることを宣言するには、以下の記述をAndroidManifest.xmlに追記します。

AndroidManifest.xml
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

実行時にBLEが利用可能かどうかをチェックするには、以下のように記述します。

if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    // BLEが利用出来ない端末だった場合の処理を記述
}

周辺のBLE端末を見つける

端末の周辺にあるBLE端末を見つけるだけなら、GATTサーバに接続する必要はありません。
以下のようにBluetoothAdapterを利用して、スキャン開始、停止を行います。
その際にコールバックを登録すればOKです。


public class BLEActivity extends Activity {
    /** スキャン時間 */
    private static final long SCAN_PERIOD = 10000;
    /** BLE機器のスキャンを行うクラス */
    private BluetoothAdapter mBluetoothAdapter;
    /** BLE機器のスキャンを別スレッドで実行するためのHandler */
    private Handler mHandler;
    /** BLE機器をスキャンした際のコールバック */
    private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
            // スキャンできた端末の情報をログ出力
            ParcelUuid[] uuids = device.getUuids();
            String uuid = "";
            if (uuids != null) {
                for (ParcelUuid puuid : uuids) {
                    uuid += puuid.toString() + " ";
                }
            }
            String msg = "name=" + device.getName() + ", bondStatus="
                    + device.getBondState() + ", address="
                    + device.getAddress() + ", type" + device.getType()
                    + ", uuids=" + uuid;
            Log.d("BLEActivity", msg);

        }
    };

    /**
     * スキャン開始ボタンタップ時のコールバックメソッド
     * @param v
     */
    public void onClickScan(View v) {
        // 10秒後にBLE機器のスキャンを開始します
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mBluetoothAdapter.startLeScan(mLeScanCallback);
            }
        }, SCAN_PERIOD);
    }

    /**
     * スキャン停止ボタンタップ時のコールバックメソッド
     * @param v
     */
    public void onClickStop(View v) {
        // BLE機器のスキャンを停止します
        mBluetoothAdapter.stopLeScan(mLeScanCallback);
    }
...

また、startLeScanメソッドの第一引数にUUIDの配列を渡すと、スキャン対象のBLE機器を絞ることが出来るようです。
詳細はJavadocを参照してください。
BluetoothAdapter | Android Developers

なお、BLE機器と通常のBluetooth機器を同時にスキャンすることはできないようです。
どちらか一方のスキャンのみできます。

76
77
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
76
77