android: BLE Central アプリに必要な permission
2024/11/14
9月30日 にいろいろ書いたが、BLE アプリに必要な permission は OS バージョンで異なる。
最初は Bluetooth だけ許可すれば良かったが、位置もある程度わかるという理由からか位置情報も必要になり、最近になってまた変わった。
用途次第だろうが、BLEサンプルアプリならこんなところか。
- API 26~30
- android.permission.BLUETOOTH
- android.permission.BLUETOOTH_ADMIN
- android.permission.ACCESS_FINE_LOCATION
- API 31~35
- android.permission.BLUETOOTH_SCAN(neverForLocation)
- android.permission.BLUETOOTH_CONNECT
API の下限が 26 なのは Android Studio Koala のウィザードでアプリを作るとそうなったというだけである。
あまり下の方までサポートしようとすると面倒なのだ。
アプリで許可を得る
AndroidManifest.xml にはこれを書くだけだが、アプリが起動したときに権限がなかったら変更できるようにした方が親切だろう。
そうしていなかったら Android のアプリ一覧から対象のアプリを探して手動で設定しないといけないからだ。
以前アプリを作ったときは Activity に実装する ようになっていた。
当時参考にしたコードをまるまる使っているだけだ。
- Jetpack Compose でアプリ・デバイスの位置情報権限を扱う方法を考える
- accompanist/sample/src/main/java/com/google/accompanist/sample/permissions at main · google/accompanist
許可を求めるダイアログだが、一度「許可しない」にすると再度リクエストしてもダイアログが出てこないようだ。
初めての問い合わせ –> ダイアログ –> 許可しない –> 2回目の問い合わせ –> ダイアログ –> 許可しない –> 3回目以降の問い合わせ –> 何も表示されない
仕様がよくわからない。。。
しょうがないので Permission チェック画面を作った。
Permission が全部 grant できていたらスキャン画面に遷移。
そうでなければ初回は自動で Permission Request を行う。
その裏ではボタンがある画面を用意し、ボタンをタップしたらアプリの詳細画面に飛ばすようにした。
それだけだとスキャン画面から「戻る」するとチェック画面に戻ってしまった。
再チェックさせるしか無いのかと思ったが、遷移させないというやり方があった。
本当は、一度許可したものの設定で不許可にした場合の対応なんかもいるのだろうが、もういいやろう。
Bluetooth の有効チェック
また、本機の Bluetooth が有効になっていないとそもそも使えないのでチェックが必要だ。
Gemini さんによると BluetoothAdapter.isEnabled
でよいそうだ。
Kotlin はなんでもプロパティにしたがるようなので私も合わせてみた。
val isBluetoothEnabled: Boolean
get() {
val bluetoothManager = context.getSystemService(BluetoothManager::class.java)
val bluetoothAdapter = bluetoothManager.adapter
return bluetoothAdapter.isEnabled
}
今日はここまで。