[Android] GPSで位置情報を取得するアプリを作る

アンドロイドで位置情報を取得したい場合は、端末のGPSとWifiや基地局GPSを組み合わせた、FusedLocationProvideAPI が推奨されています。ただし、精度が欲しい時はやはりGPSになります。簡単にGPSを起動させて緯度経度を取得してみます。
 
gps_13

Android Studio 2.1.3
Android 7.0

 

sponsored link

LocationManager

 
GPSに必要なpermissionは、Android 6.0 Runtime Permissiondangerous permissionに該当するため、ユーザーチェックを入れないと使えません。これはコードが複雑になりますので、GPSとしての機能を確認するだけの簡単な実装と、permissionを考慮した場合について考えてみます。

 

GPS簡単な実装

 
checkSelfPermission:
 
とりあえずpermissionのチェクが許可されない例外はあまり考えないで実装します。

permissionチェックのリクエスト結果を受け取る

Permissionの設定:
 
AndroidManifestに設定するPermissionには、FineとCoarseの2種類ありますします。

  • FneはGPSデバイスを使った精度が高い位置情報を取得します。
  • CorseはGPSが使えない屋内やビルの谷間などでもネットワークを利用して大まかな情報を得ます。ただWiFi等を使うケースであれば、FusedLocationProviderApi を使った方がいいのでここではこの設定を使いません。

 
LocationManagerのインスタンス生成:
位置情報を管理しているLocationMnagerのインスタンスを生成します。

 
リスナーの登録:
Activityに LocationListener を登録します。

 

requestLocationUpdates:
 
LocationManagerからrequestLocationUpdatesを使って位置情報をアップデートするメソッドを呼び出します。

  • String provider:
    • GPSを使う場合は LocationManager.GPS_PROVIDER 設定します。
      ネットワークの場合は、LocationManager.NETWORK_PROVIDE となります。
      また、Criteria を使って、低消費電力モードにすることもできます。Criteria
  • long minTime:最小時間間隔[msec]、これは消費電力に大きく関係します
  • minDistance:最小距離間隔[m]、アップデートでの最小距離です
  • listener:登録したリスナー

 
onLocationChanged:

位置情報が変化したケースでonLocationChangedにてgetLatitude()getLongitude()を使って緯度経度を取得します。

 
まとめると
MainActivity.java

 
AndroidManifest.xml

 
activity_main.xml

 
emulatorで実行します。
最初はpermissionの確認ダイアログが出ますので許可。
 
gps_11

emulatorの右下にあるMore「…」をクリックしてExtended controlsを開きます。
「latitude」「longitude」に数値を設定して「SEND」をおすと、アプリに緯度経度が表示されます。

gps_10
 
gps_12

 

GPS実用的な実装

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

permission_1

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

 
まとめると
MainActivity.java

 
ここからGPSの測位
LocationActivity.java

 
一応レイアウト
activity_main.xml

 
AndroidManifest.xml

 

これで実機でテストしてみましょう。今回はGPSのみの動作ですので、屋外でテストするためにログをTextViewで出せるようにしました。屋外でも、ビルの谷間はほぼあきらめた方がいいです。衛星が見えても1個2個ですから最低3個、通常は4個補足する必要があります。
 
gps_13
 

GPSの位置を取得するまで、数分かかる場合があります。GPS衛星のカレンダーを持っていれば、最初の補足時間が短くなりますが、無い場合は、衛星からその情報を取得するのです。
 

関連ページ:

 

References: