基本的な処理の流れは次の通りです。
LocationManager を取得するLocationManager に LocationListener を登録するLocationListener のメンバ関数 onLocationChanged がコールバックされるLocationManager から LocationListener を外す
package com.example.helloworld;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.content.Context;
import android.location.LocationManager;
import android.location.LocationListener;
import android.location.Location;
import android.widget.TextView;
// http://developer.android.com/reference/android/app/Activity.html
public class MainActivity extends ActionBarActivity
{
private LocationManager mLocationManager = null;
private LocationListener mLocationListener = null;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLocationManager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );
final boolean gpsEnabled = mLocationManager.isProviderEnabled( LocationManager.GPS_PROVIDER );
if (!gpsEnabled) {
// ToDo: GPS 有効にしてくれー
}
mLocationListener = new LocationListener()
{
// http://developer.android.com/reference/android/location/Location.html
public void onLocationChanged(Location location) {
String out =
"---------- Location --------\n" +
"緯度(Latitude)\n\t" + String.valueOf(location.getLatitude()) + " 度\n" +
"経度(Longitude)\n\t" + String.valueOf(location.getLongitude()) + " 度\n" +
"高度(Altitude)\n\t" + String.valueOf(location.getAltitude()) + " m\n" +
"精度(Accuracy)\n\t" + String.valueOf(location.getAccuracy()) + " m\n" +
"速度(Speed)\n\t" + String.valueOf(location.getSpeed()) + " m/s\n" +
"方角(Bearing)\n\t" + String.valueOf(location.getBearing()) + " 度\n" +
"時刻(Time)\n\t" + String.valueOf(location.getTime()) + " ミリ秒\n" +
"\n";
Bundle extra = location.getExtras();
if( extra != null ) {
int satellites = extra.getInt("satellites");
out += "extra.satellites\n\t" + String.valueOf(satellites);
}
TextView t = (TextView) findViewById( R.id.textView1 );
t.setText( out );
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
}
protected void onStart() { // ⇔ onStop
super.onStart();
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
1000 * 1/*mSec*/, 1/*meter*/,
mLocationListener );
}
protected void onStop() { // ⇔ onStart
super.onStop();
mLocationManager.removeUpdates( mLocationListener );
}
}
LocationManager を取得します(概要の手順 2)。LocationListener のインスタンスを生成しています(概要の手順 3)。ここでは匿名クラスとしてリスナを生成していますが、お行儀よく LocationListener を implements したサブクラスを定義すべきです。ここでリスナを生成していますが、まだ LocationManager に登録されていないので、位置情報は取得しません。Location オブジェクトを参照してください。緯度・経度・標高などの基本的な位置情報の他に、情報の精度や移動速度・移動方向なども取得できます。TextView に出力しています。LocationManager に LocationListener を登録して、位置情報の取得を始めます(概要の手順 4)。ここで指定している距離と時間のパラメータは、情報を取得する頻度を決定するための参考値として利用されるので、実際にここで指定した数値で動作する訳ではないとのこと。LocationManager から LocationListener を取り外して、位置情報の取得を停止します(概要の手順 5)。GPS による位置情報の取得は、バッテリを激しく消耗するので、こまめに止めてやる方が良いです。サンプル コードによっては、onStart/onStop ではなく、onResume/onPause で処理しているものもあります。