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

GPS、Wifi、電話基地局などにより位置情報を取得できますが
それぞれ、メリット・デメリットがあります。
GPSは精度が高い反面時間がかかるのと、電力消費が大きいなどです。
 
fusedlocaitionapi
 
あえてプログラムでこれを調整するのは大変ですが FusedLocationProviderApi はそれぞれのソースから最適な方法を選んでくれます。
 
fusedlocaitionapi
 
fused_location_1

Android Studio 2.1.2
Android 6.0

 

sponsored link

FusedLocationProviderApi

 
Manifestに以下のGPSなどのACESS設定と Google play services の設定が必要です
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
は、Android 6.0 Runtime Permissionに該当するため
アプリ起動中に許可を得るように設定します
許可しない場合でも例外で落ちないように実装しないといけません
 

permission_1

  • APIが23以上か否か
    • False: そのまま処理実行
  • 許可しているか否か、checkSelfPermission(…)
    • 許可していない場合や、初回起動のケースは次に行く
      • 初めは許可していたが、途中で拒否をユーザーが選択するケースもあり得ることに注意
    • 許可しているケースは処理に移る
  • Permissionが何に使われるか説明して許可してもらうように依頼する
    • 拒否された場合はこの機能については動作しないが他の処理をする
      • 例えばゲームアプリで得点をネットにアップするとき、ユーザーの位置情報もアップしたいという要請に対して拒否しても、ゲームは継続されるということです。
    • 許可されて処理の実行

 
マニフェストに「ACCESS_FINE_LOCATION」と「ACCESS_COARSE_LOCATION」を入れ「google_play_services_version」をmeta-dataで設定します。

AndroidManifest.xml

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

 
MainActivityでPermissionの確認をして、許可された場合にLocationActivityにIntentで移行して位置情報の取得に入ります。

MainActivity.java

 
Permissionを確認した後に実行する本体
LocationActivity.java

 
activity_main.xml

 
実機で実行すると
 
fused_location_1
 
関連ページ:

 

References: