Androidでの位置情報の取得方法を紹介します。

個人アプリでの位置情報の取得というのは少ないかも知れませんが、位置情報を使ったWebAPIも複数あるので、それを使って現在地からのおすすめ店舗の紹介とかはできるかと思います。

取得自体はとても簡単なのでとりあえずお試しでやってみることをおすすめします。

では取得方法を紹介していきます。

uses-permissionの追加

位置情報を取得するにはまずユーザーさんの許可が必要になります。

こちらを記述しないとアプリが落ちてしまうので、必ず追記してください。

AndroidManifest.xml
1
2
3
4
5
6
7
8
9
10
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="">
<!-- ネットワークベース(Networkを使って位置情報を取得する場合は以下の2つを追加)(INTERNETは通信が発生するので必要) -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- GPSベース -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application ... >
</application>
</manifest>

<uses-permission/>の説明をしていきます。

android.permission.ACCESS_COARSE_LOCATION

public static final String ACCESS_COARSE_LOCATION
Allows an app to access approximate location derived from network location sources such as cell towers and Wi-Fi.

ということでWiFiやLTE(3G)とかの電波塔などのネットワークの場所の供給源を利用して、おおよその場所の位置情報へのアクセスを出来るようにするパーミッションとなります。

ネットワークを使うということなので、かならずandroid:name="android.permission.INTERNET"uses-permissionが必要になります。

android.permission.ACCESS_FINE_LOCATION

public static final String ACCESS_FINE_LOCATION
Allows an app to access precise location from location sources such as GPS, cell towers, and Wi-Fi.

ということでGPSやWiFi、電波塔などを使って正確な位置情報へのアクセスを出来るようにするパーミッションとなります。

GPSを使って位置情報を取得したい場合はこのパーミッションが必要になります。

またこのパーミッションを追加した場合はandroid.permission.ACCESS_COARSE_LOCATIONのパーミッションは追記する必要がなくなります。

引用文にも書かれていますが、android.permission.ACCESS_FINE_LOCATIONlocation sources such as GPS, cell towers, and Wi-Fi.へのアクセスの許可を得るパーミッションなので、GPSと一緒にネットワークへの許可も得られることになるからです。

ちなみにネットワークからの位置情報を取得する場合はこちらのパーミッションでもandroid:name="android.permission.INTERNET"が必要になるので、ご注意ください。

必要なパーミッションを追加できたら次はソースコードの説明をします。

ソースコード

こんな感じになります。

まずは全部紹介してから、後で一つ一つ説明したいと思います。

以下のActivityで位置情報の取得ができます。

ソースコードの解説

では最初から解説していきます。

LocationManager

位置情報の取得するためにはandroid.location.LocationManagerを使用します。

getSystemService()を使ってLocationManagerを生成しています。

位置情報の取得をリクエストする

LocationManagerrequestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)を使って、位置情報の取得をリクエストしています。

  • String provider

    どのProviderを使うかです。

    LocationManager.GPS_PROVIDERLocationManager.NETWORK_PROVIDERを渡すと思います。

    他にもLocationManager.PASSIVE_PROVIDERがありますが、今回は使いませんでした。

  • long minTime

    位置情報を更新する時間です。

    ミリ秒を指定してください。

    この値はあくまで目安です。例えば、3,000を渡したとしても毎回3秒経ったら更新されるかというとそうではありません。少なからず時差があります。

  • float minDistance

    位置情報を更新する距離です。

    メートルを指定してください。

    この値もあくまで目安です。例えば3を渡したとしてもユーザーさんが現在地から3メートル移動したら必ず更新されるわけではありません。

  • LocationListener listener

    callbackを受けるlistenerです。

LocationListener

このクラスを実装して、更新された位置情報を受け取ります。

onLocationChanged(Location location)

位置情報が正常に更新された時に呼び出されるメソッドです。

android.location.Locationのクラスの中に位置情報の値があります。

onProviderEnabled(String provider)

ユーザーにより、引数に渡されたプロバイダーが有効化された時に呼び出されるメソッドです。

onProviderDisabled(String provider)

ユーザーにより、引数に渡されたプロバイダーが無効化された時に呼び出されるメソッドです。

onStatusChanged(String provider, int status, Bundle extras)

プロバイダーのステータスが変わったときに呼び出されます。

今のステータスの値はint statusに格納されています。

int statusの値は以下の3つになります。

  • LocationProvider.OUT_OF_SERVICE

    サービスが圏外になった(位置情報が使えなくなった)状態。すぐに変化はしない状態。

  • LocationProvider.TEMPORARITY_UNABAILABLE

    プロバイダーが一時的に利用できないけど、すぐに利用可能になる状態。

  • LocationProvider.AVAILABLE

    プロバイダーが利用可能になった状態。

Location

onLocationChanged(Location location)の引数にあるandroid.location.Locationが位置情報の値を保持しています。

Longitude(経度), Latitude(緯度), Altitude(標高), Time(更新時間)などさまざまな値があります。

以下の公式リファレンスを参考にしてください。

Location | Android Developers

getLastKnownLocation(String provider)

一番最後に取得した位置情報の値がある場合はandroid.location.Locationを返してくれるメソッドです。

一度も取得していない場合はnullが返ってくるので、注意してください。

終わりに

位置情報を使ったサービスがちょくちょく出現しているので、これを期に作ってみようかなと目論んでおります。

また今回のサンプルも合わせて作ったので、参考になれば幸いです。

NinjaAdMax/SampleLocation

以上になります。

参考

Manifest.permission | Android Developers

LocationManager | Android Developers

LocationListener | Android Developers

LocationProvider | Android Developers

Location | Android Developers

「Android」のおすすめ記事