基本的な処理の流れは次の通りです。
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
で処理しているものもあります。