2015/10/26

[android]位置情報許可が無いときに許可を求める

遊んでいられる時間も少なくなってきたので、せめて今週中にはAndroidでNotifyを受けとって時間と値を表示するようなアプリを作りたい。
手っ取り早く、Androidについているサンプルを改造して仕立てよう。

でも、あれだけはやりたい。
アプリが位置取得を許可していないから動作しない、というやつへの警告だ。
BLEのアプリは、こういうのをやることになると思っている。

  1. [実装]uses-permissionの設定
    • android.permission.BLUETOOTH
    • android.permission.BLUETOOTH_ADMIN
    • android.permission.ACCESS_COARSE_LOCATIONかFINE_LOCATION
  2. [設定]アプリの許可
    • 「位置情報」を許可する
    • API23以降だけ?

1番目はアプリを作るときにやればいいけど、2番目は実行時の話だ。
気付かないままになりそうで、怖い。

スキャンしたときに例外が発生するとかだろうと思ったが、

W/Binder: Caught a RuntimeException from the binder stub implementation.
          java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results
              at android.os.Parcel.readException(Parcel.java:1599)
              at android.os.Parcel.readException(Parcel.java:1552)
              at android.bluetooth.IBluetoothGatt$Stub$Proxy.startScan(IBluetoothGatt.java:772)
              at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper.onClientRegistered(BluetoothLeScanner.java:324)
              at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:56)
              at android.os.Binder.execTransact(Binder.java:453)

と、アプリ名が出てこないので、catchはできなさそうな気がする。
できたとしても、それよりはアプリが表に出てきたときに警告する方が親切だと思う。

なのでやりたいことは、こう。

  • 自分のアプリで「位置情報」が許可になっているか調べる
  • 許可されていない場合は、アプリ情報の画面に飛ばせるようにする

こういう説明がGoogle Playにあるので、普通にインストールするときは聞いてきてくれるのかも。
Android 6.0 以降のアプリの権限の管理


この辺を参考にした。

onCreate()の最初の方に、こんなのを追加。

        if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // 権限がない場合はリクエスト
            requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
        }

起動すると、こういうのが出てきた。
「許可」にすると、アプリの権限にも「位置情報」が許可されていた。

image

まあ、onCreate()だけじゃなくて、onResume()にも入れた方がいいんだろうな。
とは思うのだけど、位置情報を許したくない人にとってはうっとうしいだろう。
でも、BLEでスキャンしないということはあまりないと思うので、許可が無いままだったらアプリ終了、でもよいかもしれない。

0 件のコメント:

コメントを投稿

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