概要
Google Location Services API を利用してワンショットで最新の位置情報を取得したい場面があったのですが、
定期的に取得し続ける方法のドキュメントは一定数あったもののワンショットで取得する方法についてはあまりなかったので、軽くまとめてみました。
ワンショットで取得する方法
- 定期的に取得する方法と同様に
fusedLocationClient
を利用することに変わりないですが、requestLocationUpdates()
ではなくgetCurrentLocation()
を利用する必要があります -
getCurrentLocation()
をコールする際、第1引数にCurrentLocationRequest.Builder
のインスタンスが必要なので、作成の上セットしています - 以下はサンプルコードになります
サンプルコード
val locationProviderClient = LocationServices.getFusedLocationProviderClient(activity)
val currentLocationRequestBuilder = CurrentLocationRequest.Builder().apply {
setPriority(Priority.PRIORITY_HIGH_ACCURACY)
setDurationMillis(durationMillis)
}.build()
locationProviderClient
.getCurrentLocation(currentLocationRequestBuilder, null)
.addOnSuccessListener { location ->
// 位置情報取得に成功
}
.addOnFailureListener {
// 位置情報取得に失敗
}
.addOnCompleteListener {
// 位置情報取得リクエスト完了時
}
- リクエストの結果ごとにコールバックが各種用意されているので、必要に応じて実装を追加することが可能
-
getCurrentLocation()
の第2引数には CancellationToken を設定できますが、今回は不要だったためnullとしています - 参考:CurrentLocationRequest.Builder()、getCurrentLocation()
サンプルコード上のCurrentLocationRequest.Builder()のプロパティについて
-
setPriority
- 位置情報を取得する際の精度で、LocationRequestと同様
- デフォルト値:
Priority.PRIORITY_BALANCED_POWER_ACCURACY
-
setDurationMillis
- リクエストのタイムアウトのリミット
- 公式では30秒が推奨されているが、将来的に変わる可能性を見込んでおく必要があるとの記載あり
- デフォルト値:
Long.MAX_VALUE
- 他の設定値もあるので、必要に応じて設定することも可能です
ハマりポイント
- 実際に上記のように位置情報を取得できた場合には、locationが返却されるのですが
nullableになっているためnullで返ってくる可能性があります。
なのでnullチェック等を自前でやってあげないと予期せぬ挙動となってしまうこともあると思われるので注意が必要です。
以上です。
定期的に取得する方法とワンショットで取得する方法の2通りを知ることにより、電池の寿命を考慮しつつユースケースに応じてリクエスト方法を選べるようになるので、公式でも記載しておいてくれるといいなと思いました