たいていのAndroid端末にはGPSセンサが搭載されており、位置情報を取得することが可能です。また、ネットワーク(3G/WiFi)を利用して位置情報を取得することも可能です。
HT-03A、Xperia、Desire、Nexus OneにもGPSが搭載されていますよね。
今回はAndroidでGPSセンサを利用する方法を説明します。
ポイントは以下の通りです。
- マニフェストファイル(AndroidManifest.xml)にGPSのパーミッションを追加する
- ロケーションマネージャ(LocationManager)、ロケーションプロバイダ(LocationProvider)の取得
- 位置情報リスナーの実装
それでは順に説明していきます。
端末の位置情報取得の設定
アプリケーションで位置情報を取得するには、まず端末の設定で位置情報を取得するという設定を行う必要があります。
GPSを使って位置情報を取得する機能と、ネットワーク(3G/WiFi)を使って位置情報を取得する機能をそれぞれ有効にするか、無効にするかを設定することができます。ここでは両方とも有効にしています。
マニフェストファイル(AndroidManifest.xml)にGPSのパーミッションを追加する
アプリケーションでGPSを利用するにはマニフェストファイルにGPSを使用するための記述が必要です。Eclipseでプロジェクトを作成したらAndroidManifest.xmlに追記しましょう。
GPSによる位置情報取得の許可
<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION”/>
ネットワークによる位置情報取得の許可
<uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION”/>
ロケーションマネージャの設定
まずはメンバとしてロケーションマネージャを定義しておきましょう。
private LocationManager locationManager; // ロケーションマネージャ
次に位置情報を取得を開始する箇所で、ロケーションマネージャを取得して開始を指示します。
ここで大事なのは位置情報の取得が不要になった場合には必ず停止させることです。
今回はonStart()で開始させ、onStop()で停止させることにします。
ロケーションマネージャの取得にはgetSystemServiceメソッドの引数にContext.LOCATION_SERVICEを与えます。
位置情報の更新を受け取るためには取得したロケーションマネージャに対し、requestLocationUpdatesを呼び出します。
引数に与えるプロバイダはGPS の場合は
LocationManager.GPS_PROVIDER
ネットワークからの位置情報取得の場合は
LocationManager.NETWORK_PROVIDER
を利用します。
その他の引数の内容は下記コードのコメントを参照してください。
ここでは例のため間隔を最小にしていますが、実際のアプリとしては消費電力を考慮して適切な値を設定する必要があります。
GPSを利用するとバッテリーはすぐに減っていくので要注意です。
また、位置情報リスナーはLocationListenerインタフェースを実装する必要があります。
@Override public void onStart() { super.onStart(); // ロケーションマネージャのインスタンスを取得する locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); // 位置情報の更新を受け取るように設定 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, // プロバイダ 0, // 通知のための最小時間間隔 0, // 通知のための最小距離間隔 this); // 位置情報リスナー } @Override public void onStop() { super.onStop(); // 位置情報の更新を止める locationManager.removeUpdates(this); }
位置情報リスナーの実装
実装が必要なメソッドは4つです。
@Override public void onLocationChanged(Location location) { // 例としてラベルに取得した位置を表示 latitudeLabel.setText(Double.toString(location.getLatitude())); longitudeLabel.setText(Double.toString(location.getLongitude())); } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { }
位置情報の変化を受け取るのはonLocationChangedメソッドです。
Locationクラスを受け取ります。このLocationクラスから緯度、経度などを取得することが可能になります。
Locationクラスの主なメソッドは以下の通りです。
- 緯度取得 getLatitude()
- 経度取得 getLongitude()
- 精度取得 getAccuracy()
- 標高取得 getAltitude()
- 時間取得 getTime()