こんにちは、あじゅ~くです。
さて、
本日からBLE特集です。
※2017/03/22 時点の記事
BLEの記事はこちら
vol.1
vol.3
vol.4
vol.5
vol.6
…の続き。
さっそくいきます!
1.パーミッション確認
まず、マニフェストに以下を追加
<!-- android 6.0以降 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- +++++++++++++++ -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
ここちょいと分岐があるんですが、
「Android 6.0以降でBLEを利用する場合に、
位置情報関連のパーミッションが必要になります。
※「ACCESS_COARSE_LOCATION」or FINE
なんで、
Bluetoothで位置情報が…?
と思いますよね。
BLEに「Beacon」って機能があるんですが、
これが影響しています。
他のビーコンデバイスとの距離(曖昧)が分かったり、
プッシュ送信出来たりします。
そんなこんなで、
GPSが絡んでくるんですよ。
※今回「Beacon」の説明は省き(r
で、
Andrroid 6.0(API23) 以降から
認証機能が強化されています。
この処理をしたくない場合は
ビルドのターゲットAPIを「22」にしておけばOKですが、
逃げでしかないので、
キッチリ実装しましょう。
分岐はこうします。
BLE関連だけではなく、Android6.0からこんな形です。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Android 6.0の処理
} else {
// より前
}
で、利用するメソッドはこれ
許可確認
・checkSelfPermission
未許可の場合
・shouldShowRequestPermissionRationale
(標準の)認証ダイアログ表示
・requestPermissions
認証ダイアログでの結果
・onActivityResult
マニアックなパーミッションは
もうちょいメンドイのですが、
位置情報関連はまだましです。
2.BLE利用可能確認
機種依存問題です。
BLEが利用可能か確認します。
public static boolean isBleSupported(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);
}
これだけ。
簡単ですね!
3.Bluetooth ON確認
続いて、
AndroidでのBluetoothが
利用可能状態になっているか確認します。
これがONになってないとそもそもBluetoothが使えませんから…
public static boolean isBluetoothEnabled(Context context) {
BluetoothManager manager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter adapter = manager.getAdapter();
if(adapter != null) {
return adapter.isEnabled();
}
return false;
}
ここで、
OFF場合にONにするか?の
ダイアログを出してあげると親切設計ですね。
強制的にやるにはこちら。
public static void enableBluetooth(Context context, boolean b) {
try {
final BluetoothManager manager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
final BluetoothAdapter adapter = manager.getAdapter();
if( adapter == null )
return;
if (b) {
if (!adapter.isEnabled())
adapter.enable();
} else {
if (adapter.isEnabled())
adapter.disable();
}
} catch (Exception e) {}
}
まぁ乱暴な仕様になりますけど(´・ω・`)
…vol.3へ続く
それでは。