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機器を同時にスキャンすることはできないようです。
どちらか一方のスキャンのみできます。