2015/10/21

[android]BLEのscanをしたらSecurityExceptionが起きた

前回の続き。
ようやくADTのプロジェクトをインポートできたので、実際に動かしてみる。
プロジェクトは、こちらで登録してダウンロードしたもの。
Bluetooth Smart Developers | Bluetooth Development Portal

立ち上げると、よくBLEであるようにSCANボタンがあるので、Advertisingさせた状態で押してみたが・・・何も出ない。
スニファではAdvertisingしているし、Androidの設定画面でも出てくる。
アプリに出てこないだけ。

やはりインポートしたやり方がよくなかったのかとadbログを見ると、なんかSecurityExceptionが起きている。

java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results

インポートしたら、そういうパーミッションも欠けてしまうものなのか。。
と思って検索すると、そう言うわけではなかった。
bluetooth - Android6.0(marshmallow)にOSをUpdateしたらアプリのBLE機能が動かなくなった時の対処方法 - Qiita
Android6.0になってかららしい。

BluetoothLeScanner
Android DeveloperのstartScan()を見ると、APIは21から追加されたらしい。
API21はAndroid5.0なので、当時からそうなっていそうな気がするのだが・・・。
Android 6.0 Changes | Android Developers
データ保護のために変更したらしい。

こういうのって、コンパイルエラーなりワーニングなり出てくれないと、気付かないよなぁ。
みんなどうやって気付いているんだろう?

 

ACCESS_FINE_LOCATION
すばらしいロケーション、ではなく、正確な位置情報、かな。
プロテクションレベルは「dangerous」。危険だ!

ACCESS_COARSE_LOCATION
おおよその位置情報、でよいのかな。
これも「dangerous」だ!

BLEのビーコンは、どっちになるんだろう?
位置といっても、ビーコンの付近ということしかわからないが、届く範囲は数メートルから数十メートルだから、その範囲にいることはわかってしまう。
近距離としてはおおよそなんだけど、遠距離としては正確な感じがする。
そういうわけで、COARSEの方をuses-permissionに追加。

そして焼き直してSCAN!
・・・あれ、同じExceptionが出る。
リビルドし直したが、変わらん。
わからん、わからんのだ・・・。

Androidの方でアプリ情報を見てみた。
ちゃんとビルドできているなら、位置情報うんぬんと書いてあるはずだ。
が、アプリ情報に「許可」という欄があり、そこには「権限が付与されていません」と出ている。
タップすると「位置情報」とあり、スイッチできるようになっていた。
今の状態は、オフ。
これをオンにしてSCANすると・・・出てきた。
ちゃんとAdvertisingしていた端末が出てきたのだ。
もちろん、Exceptionも発生していない。
2段構えだったのか・・・。

じゃあ、Android6.0にする前からインストールしているNordicのnRF Master Control Panelアプリなんかもスキャンできないのかと思ったら、これはできる。
アプリ情報を見ても、許可はしていないし、許可内容に「位置情報」がない。

つまり、API23でビルドしているから出てきた、ということなのかな。
まあ、許可内容をスイッチできるのはありがたいですな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。