[Android] GPS パーミッションを考慮して実装する

Android7

アンドロイドでの位置情報は端末のGPSとWifiや基地局GPSを組み合わせた、FusedLocationProvideAPI が推奨されています。ただ精度が高いのはやはりGPSになります。簡単な実装を GPSで位置情報を取得するアプリを作る で試しましたがその続きです。
 
gps_13

Android Studio 2.3.2
Android 7.1.1

 



LocationManager

 
繰り返しになりますが、GPSに必要なpermissionは、Android 6.0 Runtime Permissiondangerous permission に該当するため、ユーザーの許可を得るための実装が必要になります。

 

Runtime Permission

 
Android 6.0 Runtime Permission に該当するPermissionため、アプリ起動中に許可を得るように設定します。許可しない場合でも例外で落ちないように実装しないといけません。下のようなフロー処理となります。
 
permission_1

  • APIが23以上か否か
    • False: そのまま処理実行
  • 許可しているか否か、checkSelfPermission(…)
    • 許可していない場合や、初回起動のケースは次に行く
      • 初めは許可していたが、途中で拒否をユーザーが選択するケースもあり得ることに注意
    • 許可しているケースは処理に移る
  • Permissionが何に使われるか説明して許可してもらうように依頼する
    • 拒否された場合はこの機能については動作しないが他の処理をする
      • 例えばゲームアプリで得点をネットにアップするとき、ユーザーの位置情報もアップしたいという要請に対して拒否しても、ゲームは継続されるということです。
    • 許可されて処理の実行


GPSの基本的な設定は こちら を参照してください。
 
以下はMainActivityでPermissionの確認をして、許可されていたら別Activity(LocationActivity.java)に遷移してGPS測位を開始するようにしました。
 
MainActivity.java

 
ここからGPSの測位
LocationActivity.java

 
一応レイアウト
activity_main.xml

 
AndroidManifest.xml

 

これで実機でテストしてみましょう。屋外でテストするためにログをTextViewで出せるようにしました。屋外でも、ビルの谷間はほぼあきらめた方がいいです。衛星が見えても1個2個ですから最低3個、通常は4個補足する必要があります。
 
gps_13
 
GPSの位置を取得するまで、数分かかる場合があります。GPS衛星のカレンダーを持っていれば、最初の補足時間が短くなりますが、無い場合は、衛星からその情報を取得するのです。
 
測位によって得られる主な情報は:

  • getLatitude():緯度[°]
    • 南緯がマイナス、北緯がプラスで、WGS84座標系
  • getLongitude():経度[°]
    • 西経がマイナス、東経がプラスで、WGS84座標系
  • getAccuracy():精度[m]
    • この緯度経度を中心としてこの半径の円内にある確率が68%ということです。正規分布の標準偏差+/-2σということですね。
  • getAltitude():高度
    • 単位は[m]でWGS84座標系、高度はGPSではあまり精度がよくありません
  • getTime():測位時刻[msec]
    • 1970/1/1 0:00からのUTC時間。これを使って時間差を計算してはいけないようで時間が前後することもあり得ます。時間のデルタを計測したい場合は
      getElapsedRealtimeNanos を使います。
  • getSpeed():速度[m/sec]
    • 止まっていれば0となります。
  • getBearing():方位(水平)[°]
    • 北から東へ90°となり0°は北向きを示しています。

などです。これ以外にも色々あります。尚、これはフォアグランドでのGPSを走らせています。バックグランドでの測位はこちらを参考にしてください。

 
関連ページ:

 

References:
LocationManager | Android Developers
Criteria | Android Developers
Runtime Permissions | Android Developers
Location Strategies | Android Developers
Location | Android Developers