Androidで位置情報の取得を行う方法

Android, Java

この記事は最終更新日から1年以上が経過しています。

新卒グループ開発演習で位置情報を用いたAndroidアプリを開発しました。

以下は位置情報の取得に関する備忘録です。

実装要件

  • 精度の高いGPSを優先的に利用して位置を取得
  • GPSが利用できない場合は、基地局情報を用いて位置を取得
  • 基地局情報も利用可能でない場合は位置情報に関する設定画面を開き、ユーザーに位置情報を使うことを促す

実装ポイント

Permissionの設定

  • Android6.0からは、位置情報を用いるにはPermissionの設定が必要
    ※そもそもPermissionとは

  • 設定する位置情報関連のPermissionは2種類

    • Fine : GPSデバイスを使った精度が高い位置情報を取得する
    • Corse: ネットワークを使って、GPSが使えない屋内やビルの谷間などで大まかな位置情報を取得する
  • AndroidManifestには以下のように書き加える

リスナーの登録

onLocationChanged

  • 位置情報が変化すると、onLocationChangedがコールバックされる
  • getLatitude()とgetLongitude()を使って緯度経度を取得

onProviderEnabled

  • ロケーションプロバイダが利用可能になるとコールバックされる

onProviderDisabled

  • ロケーションプロバイダが利用不可能になるとコールバックされる

onstatusChanged

  • ロケーションステータスが変わるとコールバックされる

LocationManagerのインスタンス生成

isProviderEnabled

  • 引数にとったロケーションプロバイダが利用可能かどうか調べる

requestLocationUpdates

  • LocationManagerからrequestLocationUpdatesを使って位置情報をアップデートするメソッド
  • 位置情報を使わなくなったら、removeUpdates を使って位置情報の更新をやめる必要がある

まとめると、このようになった

はまったところ

  • requestLocationUpdatesの引数である、位置情報を通知するための最小距離間隔(メートル)を0に設定すると、onLocationChangedが呼ばれないことがある
    • 1以上にする必要があると思われる

今後の課題

  • getLastKnownLocationで最初に位置を取得してから、onLocationChangedで二回目以降位置情報を取得するまで時間がかかってしまう
  • そもそもアクティビティに処理を色々書くのではなく機能ごとにクラス分けする必要がある

感想

  • 位置情報を取得する実装自体はそんなにむずかしくなかった
  • コールバックメソッドが厳密にどのような条件で呼ばれるかが、複数の記事を読んでも不透明のまま
  • そのあたりをどう実装したらいいのかベストな方法がまだわからない

Android, Java