Android Bluetooth Low Energy (BLE) vol.2

こんにちは、あじゅ~くです。

さて、
本日から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へ続く

それでは。

azjuke

投稿者: azjuke

神奈川県横浜市在住 何かよくわからないブログに変身中! 色々な話題振りまいていきますよ。