[Android] FusedLocationProviderClient を使って位置情報を取得

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

Android Studio
2021.1.1




FusedLocationProviderClient

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

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

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

 

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

 

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

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

registerForActivityResult()を使ってpermissionが既に許可されているか確認します。アクティビティの結果を取得する | Android デベロッパー

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

またbuild.gradleに「play-services-location」を設定しておきます。

 

測位の設定

 
FusedLocationProviderClient:
FusedLocationProviderClient のインスタンスの生成

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

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

 

サンプルコード(1)

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

MainActivity.java

 

レイアウトです
activity_main.xml

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

 

AndroidManifest.xml

 

更新リクエスト

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

位置情報リクエストの設定:
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







アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう。

TECH ACADEMY
オンライン説明会



Code Camp
現役エンジニアによるオンラインプログラミングスクール【CodeCamp】


直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。



侍エンジニア塾
侍エンジニア塾 無料体験レッスン


とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


シェアする

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

フォローする