Android - GPS、Network位置情報を取得する(LocationManager)

LocationManagerを介してGPS、Networkの位置情報を得ることができます。

位置情報を取得する方法は、 LocationManager.getLastKnownLocation()で、最後に記録された位置情報を取得または LocationManager.requestLocationUpdates()でListenerを登録して、位置が変更されるたびにイベントを受け取ることができます。

Locationパーミッション

位置情報を取得するには、次のパーミッションのいずれかは、AndroidManifestに定義する必要があります。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  • ACCESS_COARSE_LOCATION:都市Block単位の精度の位置情報を取得することができます
  • ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATIONより精密な位置情報を得ることができます

Runtime Permission要求の詳細実装は、Android - Runtime permissionリクエスト方法を参照してください。

最後に確認された位置情報を取得する

LocationManager.getLastKnownLocation(provider) APIで最後に確認された位置情報を得ることができます。 長い間、Location更新がないなどの理由で、非常に長い時間前に保存された位置情報が戻されることがあります。 または、当該Providerの格納された位置情報がないときは、nullが返されることがあります。

引数として渡されたProviderの種類には、一般的にGPSの位置を提供してくれる GPS_PROVIDERとネットワークの位置を提供してくれるNETWORK_PROVIDERがあります。

次のように位置情報の緯度(latitude)と経度(longitude)を得ることができます。

val location : Location? = locationManager
        .getLastKnownLocation(LocationManager.GPS_PROVIDER)
if (location != null) {
    val latitude = location.latitude
    val longitude = location.longitude
    Log.d("Test", "GPS Location changed, Latitude: $latitude" +
            ", Longitude: $longitude")
}

Locationは、次のような情報を提供しています。

  • getAccuracy():正確
  • getLatitude():上記
  • getLongitude():軽
  • getTime():生成された時刻(UTC
  • getElapsedRealtimeNanos():生成された時間(Elapsed time

次のように Location.getElapsedRealtimeNanos()でいつ生成されたLocationオブジェクトであるか知ることができ、現在ので数秒前に生成されたかどうかを計算することができます。 これで古いデータはフィルタすることができます。

val location : Location? = locationManager
        .getLastKnownLocation(LocationManager.GPS_PROVIDER)

val ageMs = TimeUnit.NANOSECONDS.toMillis(SystemClock.elapsedRealtimeNanos()
        - location.getElapsedRealtimeNanos())

位置情報の変更のListener

次のように位置情報のリスナーを登録することができ、リスナーを登録すると、Callbackが渡されます。

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
    10000,  // 10-second interval.
    10.0f,  // 10 meters
    gpsListener)


var gpsListener: LocationListener = object : LocationListener {
    override fun onLocationChanged(location: Location) {
        val latitude = location.latitude
        val longitude = location.longitude
        Log.d("Test", "GPS Location changed, Latitude: $latitude" +
                ", Longitude: $longitude")
    }

    override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {
    }
    override fun onProviderEnabled(provider: String) {
    }
    override fun onProviderDisabled(provider: String) {
    }
}

requestLocationUpdates()の引数には、次のような内容が渡されます。

  • Provider: GPS_PROVIDERまたはNETWORK_PROVIDERすることができます
  • minInterval(ms):10秒に設定すると、更新があったとき、少なくとも10秒間隔でイベントを送出します
  • minDistance(meters):設定された距離だけの変化があったときのイベントを転送します
  • Listener:Listenerオブジェクトを渡します

Listenerの登録解除

Listenerを使用していないときは、次のように終了することができます。

locationManager.removeUpdates(listener);

使用可能なProviderあることを確認

次のようにデバイスのGPSまたはNetworkプロバイダが使用可能かどうかを確認することができます。

val isGPSEnabled =
    locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
val isNetworkEnabled =
    locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)

もしGPSの設定がオフになっている場合は GPS_PROVIDERが無効にされたと返されます。 このような場合には、次のようにSettings画面を実行して、ユーザーにGSPを有効にするようにガイドすることができます。

private fun enableLocationSettings() {
    val settingsIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
    startActivity(settingsIntent)
}

location settings

参考

Related Posts

codechachaCopyright ©2019 codechacha