Android - FusedLocationProviderClientに位置情報を取得する

Google Play Serviceで提供するLocationライブラリに位置情報を取得することができます。

この記事では、簡単なサンプルコードを紹介します。

Android Developerで提供される文書を見れば、より詳細な使用方法を得ることができます。

Android FrameworkのLocationManagerを使用して位置情報を取得することもできます。

依存性の設定

Appの build.gradleのdependenciesに次のようにplay-services-locationを追加すると、Locationライブラリを使用することができます。

dependencies {
    ...
    implementation 'com.google.android.gms:play-services-location:17.1.0'
}

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リクエスト方法を参照してください。

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

FusedLocationProviderClientオブジェクトは、次のように得ることができます。

val fusedLocationClient: FusedLocationProviderClient!
        = LocationServices.getFusedLocationProviderClient(this)

FusedLocationProviderClientで最後に保存された位置情報を取得することができます。

fusedLocationClient.lastLocation.addOnSuccessListener { location : Location? ->
    if (location != null) {
        val latitude = location.latitude
        val longitude = location.longitude
        Log.d("Test", "GPS Location Latitude: $latitude" +
                ", Longitude: $longitude")
    }
}

LocationServiceは、位置情報をキャッシュし、 lastLocation.addOnSuccessListener()最後にキャッシュされた位置情報を取得します。

次のような場合にnullが返されることがあります。

  • デバイスのLocation使用が中止されている場合は、キャッシュ情報が削除されるため、nullが返されることがあります
  • 位置情報を取得したことがないとき、nullが返されることがあります
  • Google Playサービスが再実行されたとき、保存された位置情報がないため、nullが返されることがあります

位置情報の変更のイベント受信

次のように位置情報が更新されるたびにイベントを受け取ることができます。 まず、アップデートIntervalなどのオプションが保存されてLocationRequestとLocationCallbackを作成し、 requestLocationUpdates()に変更のCallbackを求めることができます。

val locationRequest = LocationRequest.create()
locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
locationRequest.interval = 20 * 1000
fusedLocationClient.requestLocationUpdates(locationRequest,
    locationCallback,
    Looper.getMainLooper());


val locationCallback = object : LocationCallback() {
    override fun onLocationResult(locationResult: LocationResult) {
        if (locationResult == null) {
            return
        }
        for (location in locationResult.locations) {
            if (location != null) {
                val latitude = location.latitude
                val longitude = location.longitude
                Log.d("Test", "GPS Location changed, Latitude: $latitude" +
                        ", Longitude: $longitude")
            }
        }
    }
}

Callback登録解除

さらに位置情報を取得する必要がない場合は、次のようにサービスに登録されたCallbackを解除することができます。

fusedLocationClient.removeLocationUpdates(locationCallback);

参考

Related Posts

codechachaCopyright ©2019 codechacha