Android6.0というかAPI23というか、そこからアプリごとに位置情報の権限を許可するかどうか設定できるようになった。
しかし、それとは別に端末自体のBluetooth有効設定というものがある。
この2つは、それぞれ別に設定できるのだけど、その許可を得る場合にはどう組み合わせるとよいのだろうか?
パターンは、こうなる。
- Bluetoothも有効だし、アプリの位置情報も許可あり
- Bluetoothは有効だが、アプリの位置情報は許可無し
- Bluetoothは無効だが、アプリの位置情報は許可あり
- Bluetoothも無効だし、アプリの位置情報も許可無し
1~3は、あまり問題が無い。
両方有効であればそのまま動けばよいし、片方だけであれば今まで通り確認すればよい。
問題は4番。
両方とも許していない場合は、どのようにあしらうとよいのだろうか?
ちなみに、いまgithubにアップしているソースでは3番もだめだ。
まだ調べきれていないが、getBluetoothLeScanner()でnullが返るため、onResume()時に強制終了してしまっている。
まず、onResume()。
ここでは、BluetoothAdapter#isEnabled()がfalseだった場合、startActivityForResult()してBluetooth使用の許可を得ようとしている。
で、勘違いしていたのだが、これは非同期処理なので、そっちはそっちで動くけれど、今のコンテキストもそれはそれで流されるようだ。
投げたインテントから結果が返ってくると、onActivityResult()が呼ばれるようだ。
サンプルでは、Bluetoothが許可されなかったらアプリ終了のfinish()を呼んでいる。
いま強制終了しているのは、Bluetoothの使用許可を得る前にBLEのスキャンを開始しようとしているためだろう。
対応を追加した。
許可が無いときの対応追加 · hirokuma/android-BluetoothLeGatt@70d24eb
ついでに、アプリ権限の確認をonResume()に移したり、権限の許可を求めるときはスキャンを開始しないようにしたりしている。
なんか、しくみがわかっていないものを変更している感じがして、怖いですな。
でも、いまや一人で全部作ったとしてもできることなどたかが知れているので、楽できるんだ、と考えることにしよう。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。