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

AndroidではGPSとWifiや基地局GPSを組み合わせた、FusedLocationProvider が推奨されていますが、GPSが一番精度の高い位置情報を取得できます。KotlinでのGPSの設定方法を調べてみました。
 
1x1.trans - [Android & Kotlin] GPS位置情報を取得するアプリを作る


Android Studio
2021.1.1

 




LocationManager

 
GPSの実装はここのところ色々と制約がついてきてしまっているので、ここでの内容は一番簡単な以下の設定ですが、実用ではバックグラウンドで処理、Permissionの扱いなどが必要となります。

  • GPSを起動するためのもっとも簡単な実装 
  • 1つのRuntime Permissionのみを想定
  • フォアグランドでの実行

 

 

GPS簡単な実装

 
GPSに必要なpermissionは、Android 6.0 Runtime Permissiondangerous permissionに該当するため、ユーザーが許可しないと使えません。これは複雑になるので、GPSとしての機能を確認する実装について考えてみます。

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

onRequestPermissionsResultは非推奨になり

registerForActivityResult()を使います。
アクティビティの結果を取得する | Android デベロッパー

registerForActivityResult() は、

  • ActivityResultContract
  • ActivityResultCallback

を受け取り、他のアクティビティを開始するために使用する

  • ActivityResultLauncher

を返します。
 
permissionが既に許可されているかの確認

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

 
Permissionの設定:
 
AndroidManifestに以下の設定をします。FineとCoarseの2種類あります。
Fineを設定する場合は両方必要

  • FineはGPSデバイスを使った精度が高い位置情報を取得します。
  • CoarseはGPSが使えない屋内やビルの谷間などでもネットワークを利用して大まかな情報を得ます。
 

LocationManager

 
LocationManagerのインスタンス生成:
GPSだけでなく位置情報を管理しているのがLocationMnagerです。インスタンスは Context.getSystemService(Class)を使って取得します。
 

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

 

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

  • provider:
    • GPSを使う場合は LocationManager.GPS_PROVIDER 設定します。
      ネットワークの場合は、LocationManager.NETWORK_PROVIDE となります。
      ただこの設定の場合はGPS_PROVIDERのみの選択で、ユーザーの位置情報設定が「バッテーリー節約」つまりNETWORK_PROVIDEになっていると設定を促すページに飛ぶようにしてあります。
      1x1.trans - [Android & Kotlin] GPS位置情報を取得するアプリを作る
      「高精度」あるいは「端末のみ」の選択です。
      また、Criteria を使って、低消費電力モードにすることもできます。Criteria
  • minTime:最小時間間隔[msec]、これは消費電力に大きく関係します
  • minDistance:最小距離間隔[m]、アップデートでの最小距離です
  • listener:登録したリスナー

 
onLocationChanged:
 
位置情報が変化したケースでonLocationChangedにて latitude と longitude を使って緯度経度を取得します。
 

 

サンプルコード

 
まとめると
MainActivity.kt

 
AndroidManifest.xml

 
レイアウトですが、緯度・経度を表示するだけです。
activity_main.xml

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

  • アプリの使用時のみ
  • 今回のみ
  • 許可しない

1x1.trans - [Android & Kotlin] GPS位置情報を取得するアプリを作る

emulatorの右下にあるMore「…」をクリックしてExtended controlsを開きます。
「Location」のタグから適当なマップにマーカーをセットし「Set Location」をクリックすると、アプリに緯度経度が表示されます。

1x1.trans - [Android & Kotlin] GPS位置情報を取得するアプリを作る

1x1.trans - [Android & Kotlin] GPS位置情報を取得するアプリを作る


  

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

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

関連記事:

 
References:







アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう。

TECH ACADEMY
オンライン説明会


侍エンジニア塾
侍エンジニア塾 無料体験レッスン


とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする