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

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

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

Android Studio 3.5
Android 10.0



FusedLocationProvider

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

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

それぞれGPS、Wifi、電話基地局の切り分けをプログラマーがいちいちコードで記述するのは大変です。
 
flp 04 - [Android] FusedLocationProviderClient を使って位置情報を取得
 
これを、このようにまとめるのが FusedLocationProvider です。
 
flp 05 - [Android] FusedLocationProviderClient を使って位置情報を取得
 

 

Runtime Permission

 
Manifestに以下のGPSなどのACESS設定と Google play services の設定が必要です
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
これらは、Android 6.0 Runtime Permissionに該当するため
アプリ起動後に許可を得るように設定します

あくまでテストだけであれば起動後に端末設定からアプリを開いて許可すれば可能です。
 

cat61 00 100x100 - [Android] FusedLocationProviderClient を使って位置情報を取得
Android もセキュリティーを厳しくしているため、特定の機能はユーザーからの明確な許可を得ないと怒られます。 元々インスト...

 
マニフェストに「ACCESS_FINE_LOCATION」あるいは「ACCESS_COARSE_LOCATION」を入れ(同じグループであれば1つでチェックのようですが過去に説明が異なっていたこともあるので…)
また「google_play_services_version」をmeta-dataで設定します。

AndroidManifest.xml

 

測位の設定

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

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

SettingsClient はシステム設定が適切に構成されているかどうかを確認できる

LocationRequest:
FusedLocationProviderClientを使うとGPS, WiFi, 電話網を自動的に切り替えてくれますがプライオリティを設定できます。
測位のプライオリティを設定:

常数として以下のものがあります。

PRIORITY_HIGH_ACCURACY

  • 高精度の位置情報を取得
    主に精度重視のためGPSが優先的に使われる

PRIORITY_BALANCED_POWER_ACCURACY

  • バッテリー消費を抑えたい場合、精度は100m程度と悪くなる
    主にwifi,電話網での位置情報が主となる

PRIORITY_LOW_POWER

  • バッテリー消費を抑えたい場合、精度は10kmと悪くなる

PRIORITY_NO_POWER

  • 位置情報取得をアプリが自ら測位しない、
    他のアプリで得られた位置情報は入手できる

getLastLocation():
最新の(最後の)位置情報の取得。レアケースとして情報が無くて null が返ってくることもあります。

 

サンプルコード

 
googlesamples/android-play-location – GitHubを参考にしました。このFusedLocationprovider絡みはよく変わるのでね(これに限ったことではないですが)

ここではMainActivityでPermissionの確認をして、許可された場合に測位するためのLocationActivityにIntentで移行して位置情報の取得に入ります。
 
Permissionを確認した後に実行する本体
LocationActivity.java

ここはパーミッションの確認だけです。

Permissionの要求が厳しいのですが、アプリ次第だと思います。位置計測のアプリで位置情報を取得できないと何もできないですが、追加のようなパーミッションの場合はパスして本来のアプリに戻ることもあるでしょう。

MainActivity.java

 
レイアウトです
activity_main.xml

リソース
strings.xml

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

 
 
測位をbackgroundで行ってログを取るような仕様の場合はServiceなど諸々を使うことになります。

gps background 00 100x100 - [Android] FusedLocationProviderClient を使って位置情報を取得
GPSのログを取り続けるためにはどうするといいのでしょうか。システムはすぐにスリープ、Dozeに入れてバッテリー消費を抑制しようとします。た...

関連ページ:

 

References:
LocationServices | Google Developers
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

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

ブックマークしておくと便利です このエントリーをはてなブックマークに追加




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

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

以下の3つはAndroidが学習できるオンラインスクールです。


TECH ACADEMY
Androidアプリコース



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



CodeCamp
~約8,000名の受講生と80社以上の導入実績~
現役エンジニアのオンライン家庭教師CodeCamp





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

尚、スクールがダメだと言う人がいますが、やる気があれば問題ありません。与えられるのを待っていてはいけないですね
欲しいものは取りに行くのです。


Google Pixel 3 XLグローバル版
SIMフリー 並行輸入品
6.3インチの大画面
背景をぼかすポートレートモード撮影


Anker PowerCore II Slim 10000
Power IQ 2.0搭載
iPhone & Android対応

シェアする

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

フォローする