[Android & Kotlin] FusedLocationProviderClient による位置情報の取得

位置情報といえばGPSと思う人が多いとは思いますが、スマホでの位置情報はGPS以外にWiFiや電話網を駆使して短時間で効率の良い情報を取得しています
AndroidではFusedLocationProviderClientを使うと簡単に測位することが可能

Android Studio
2021.2.1




FusedLocationProviderClient

 

融合された位置予測プロバイダ(FusedLocationProvider)と訳されていますがどういうことでしょうか

GPSは単体での初期起動では位置情報を衛星から取得するのに40分程度かかったりします。また衛星からの電波はほとんどホワイトノイズに近い微弱電波でそれを捕まえるために比較的電力も使います。

それをカバーするためにWifiや電話回線網などによって位置情報を得ることができます。

それぞれGPS、Wifi などの切り分けをプログラマーがいちいちコードで記述するのは大変です。これを、まとめて位置情報を得ることができるのが FusedLocationProvider です。

また、デバイスの電池の消費を最適化も重要なタスクで位置情報はバッテリーコストがかかります
 

 

アプリの権限をリクエスト

 位置情報は個人情報に類するため、権限リクエストをして、アプリ起動後に許可を得るように設定します

マニュフェストに以下のGPSなどのACESS設定と Google play services の設定が必要です
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
 
マニフェストにこれらの権限取得を宣言します。
AndroidManifest.xml

checkSelfPermission()を使ってpermissionが既に許可されているか確認します

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

またbuild.gradleに「play-services-location」を設定しておきます
バージョンは適宜合わせます

 

測位の設定

 FusedLocationProviderClient:

FusedLocationProviderClient のインスタンスの生成

 
getLastLocation():
直近の(端末として計測した最後の)位置情報の取得。

レアケースとして情報が無くて null が返ってくることもあります。

 

サンプルコード(1)

 

getLastLocation() を使った直近の位置情報を取得するケースで、
MainActivityでPermissionの確認をして、許可された場合に位置情報を取得します。
パーミッションは確認だけです。

MainActivity.kt

 

レイアウトです
activity_main.xml

 
Google play services の play-services-location ライブラリーを build.gradle のdependenciesに設定します。バージョンは適宜変更してください。
 
build.gradle

 

AndroidManifest.xml

 

更新リクエスト

 

移動している場合などでは位置情報の更新が必要になり、継続的な位置情報取得は
バッテリー消費が増加しすぎないように考慮する必要があります。

現在地の更新情報リクエストに使うのが、

requestLocationUpdates()

位置情報リクエストの設定:
LocationRequest を作成して以下のパラメータを設定します。

  • 更新間隔:setInterval()
    • 更新データを受信する頻度をミリ秒単位で設定
  • 最短更新間隔:setFastestInterval()
    • 最短の更新間隔を設定
    • setInterval()よりも短い間隔で更新するメリットがなければ設定は不要
  • 優先度:setPriority()
    • PRIORITY_HIGH_ACCURACY
      • 高精度の位置情報を取得
        主に精度重視のためGPSが優先的に使われる
      • バッテリー消費を抑えたい場合、精度は100m程度と悪くなる
        主にwifi,電話網での位置情報が主となるPRIORITY_BALANCED_POWER_ACCURACY
      • バッテリー消費を抑えたい場合、精度は10kmと悪くなるPRIORITY_LOW_POWER
    • PRIORITY_NO_POWER
      • 位置情報取得をアプリが自ら測位しない、
        他のアプリで得られた位置情報は入手できる

位置情報リクエストを作成:
LocationCallback コールバックを使用して更新を取得
requestLocationUpdates() を呼び出しLocationRequest オブジェクトのインスタンスと LocationCallback を渡す。

コールバック メソッドが受け取る引数には、位置情報の緯度と経度を格納するリスト形式の Location オブジェクトが含まれています。

更新を停止:
位置情報の更新を停止するには、removeLocationUpdates() を呼び出して止めます。

 

サンプルコード(2)

 

位置情報の更新ができるようにまとめてみます。

MainActivity.java

レイアウトその他のコードはサンプルコード(1)と同じです。

関連記事:

 

References:
直近の位置情報を取得する – Android Developers
現在地の更新情報をリクエストする – Android デベロッパー
位置情報の設定を変更する – Android デベロッパー
FusedLocationProviderClient
Get the last known location | Android Developers
Runtime Permissions | Android Developers
Making Your App Location-Aware | Android Developers
LocationRequest | Android Developers
googlesamples/android-play-location – GitHub
ActivityCompat | Android Developers

シェアする

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

フォローする