簡単に知りたい人むけ。

 AndroidでGPSを利用する場合には、使用者のGPS利用許可をもらう必要がある。この実行時パーミッションについては、詳しくはこちらを参考に。
 GPSでは場所が移動するたびに緯度情報がコールバックされてくる。そのためコールバックに必要なメソッドを用意してあげて、そのインスタンスを渡すことでコールバックをしている。
 具体的にはLocationListenerインターフェースを継承し、それに必要なメソッドをoverrideすることで利用する。別にどのようなクラスでもいいが、Activityに設定するのが最もわかりやすいのではないかなと思う。overrideが必要なメソッドは以下の4つだ。

class MapsActivity : AppCompatActivity(), LocationListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_maps)
    }

//位置情報が変更された場合に呼ばれる override fun onLocationChanged(location: Location?) { } //GPSが利用不可、利用可能になった場合に呼ばれる
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) { } //プロバイダを使用不可にしたときに呼ばれる
override fun onProviderDisabled(provider: String?) { }
//プロバイダを使用可能にしたときに呼ばれる override fun onProviderEnabled(provider: String?) { } }
 具体的な実装は以下のようになる。
 GPSはonStartでリスナーを設定し、onStopでリスナーを解除する。こうしないとアクティビティが削除されたときにおかしくなるらしい。
 緯度経度などの情報が更新されるとonLocationChangedが呼ばれるので、そこで情報を取得して処理を行う。
 具体的には以下のようにする。コメントに説明が書いてあるので、呼んでみてほしい。


//LocationListenerインターフェースを継承する class MapsActivity : AppCompatActivity(), LocationListener { //リスナーを設定したり解除するためにLocationManagerのインスタンスを保持しておく
private lateinit var mLocationManager: LocationManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_maps) } //GPSの開始はonStartで行う
override fun onStart() { super.onStart()

//マネージャのインスタンスを生成してGPSの機能が利用できるようなら起動する mLocationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
//ここで実際にはGPSの利用権限があるかチェックしたり、権限がなければ許可をもらうなどが必要
//第二引数はコールバックする最小の通知間隔をミリ秒で設定する 1秒以内では通知しないなど
//第三引数はコールバックする最小の移動距離をメートルで設定する 50m以内では通知しないなど
//第四引数はコールバックするクラスのインスタンスを指定する
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 50F, this) } } //アクティビティが削除されるとおかしくなるのでonStopでリスナーを解除しておく
override fun onStop() { super.onStop() mLocationManager.removeUpdates(this) }
//情報が更新されると呼ばれる override fun onLocationChanged(location: Location?) { location?.let { val position = LatLng(it.latitude, it.longitude) mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 15F)) Log.v("Latitude", it.latitude.toString()) Log.v("Longitude", it.longitude.toString()) Log.v("Accuracy", it.accuracy.toString()) Log.v("Altitude", it.altitude.toString()) Log.v("Time", it.time.toString()) Log.v("Speed", it.speed.toString()) Log.v("Bearing", it.bearing.toString()) } }
//プロバイダの状態がかわると呼ばれる override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) { when(status) { LocationProvider.AVAILABLE -> { } LocationProvider.OUT_OF_SERVICE -> { //サービスが利用できない(利用が期待できない) } LocationProvider.TEMPORARILY_UNAVAILABLE -> { //一時的にサービスが利用できない(しばらく経過すると利用が期待できる) } } } override fun onProviderDisabled(provider: String?) { } override fun onProviderEnabled(provider: String?) { } }