先週書いたAndroidのBLEアプリサンプルを動かした。
が、なぜかBLE Peripheralのスキャンをしても画面に表示されない。
エラーなどは出ていないのだが、onScanResult()がコールバックされないので、画面に出てこないのだ。
じゃあスキャン自体動いていないのかと思ったが、Logcatの方にはデバイス名が表示されるし、設定アプリのBluetoothを開くとデバイス名が出てくる。
アプリ情報を見ても、位置情報は許可している。
Blueoothを入り切りしたり、電源を入れ直したりしたが変わらない。
もう1台あるAndroid端末に同じアプリを入れると、こっちはスキャンされる。
なんじゃこりゃ?と思ったが、Android端末自体の「位置情報サービス」が有効になっていなかった。
有効にしたら、動いた。
BLEが無効だったら確認するし、アプリの位置情報許可がなければ確認するのだけど、位置情報サービスは考えていなかった。
こちらが詳しい。
Android 6.0でBLEデバイスのスキャン結果を受け取るには位置情報モードをオンにする必要がある - Qiita
うん、こういう動きだった。
設定アプリでスキャンできたのは、たぶんPEERS_MAC_ADDRESSパーミッションがついているからじゃなかろうか。
v6.0.0_r1のソースだと、ここら辺。
これをまねして、TwoSpinnersに追加したのがこちら。
getInt()しているから、たぶんSQLiteから直接設定値を持ってきているのだろう。
Intentで設定画面に飛ぶようにしたのだが、アプリを起動していきなりジャンプすると何が起きたかわからないので、Toastを表示させるようにしている。
また、onResume()したときにもう一度チェックするようにした。
無効な場合は、ボタンを押せなくしておけばよいだろう、という作りだ。
今回は、hasScanResultPermission()から真ん中だけ抜き取ったけど、全部まねするか、hasPeersMacAddressPermissionだけ外すとか、そういう方がよいかも。
うちのNexus5はAndroid6.0.1だけど、全部のバージョンで位置情報サービスが必要というわけでもないようだからだ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。