Edited at

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

More than 3 years have passed since last update.

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機器を同時にスキャンすることはできないようです。

どちらか一方のスキャンのみできます。