AndroidはGPS以外にもWiFiのESSIDやIPアドレスとかで位置情報がとれるので(機種によるし今後増減すると思うが)、bestなLocationProvierから緯度経度を取るのはこんな感じ

Android2.1向け。

LocationManager lm = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);

Criteria crit = new Criteria();
crit.setAccuracy(Criteria.ACCURACY_FINE);
String provider = lm.getBestProvider(crit, true);
Location loc = lm.getLastKnownLocation(provider);

double lat = loc.getLatitude();
double lon = loc.getLongitude();
参考:Using Location API – Marakana




ふつうにGPSを使って緯度経度を取るのは、衛星キャッチして計測するまで少し間が空くものなのでonLocationChangedイベントを登録して待とう


自らLocationListenerをimplementsして
public class GpsTracker extends Activity implements LocationListener{
 // code
}


requestLocationUpdatesを呼ぶ。画面上の方のメニューバーにGPS測位中アイコンが出るはず
LocationManager lm = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, this); // 5秒間隔、10メートル


位置がupdateされる毎にこの関数が呼ばれる
public void onLocationChanged(Location location) {
double lat = location.getLatitude();
double lon = location.getLongitude();
}

onLocationChangedが呼ばれるタイミングは、この場合5000ミリ秒経過した&&10メートル以上移動したという事でいいのかな?
よくわからない。0メートルにしたらほぼ5秒間隔で呼ばれた。


ちなみに複数回requestLocationUpdatesすると、リスナが多重に登録されてしまう。数を数えておくか、登録する前にあらかじめremoveしておくとかすれば良さそう
lm.removeUpdates(this);
removeUpdatesを呼ぶか、アプリ自体を終了させるまでGPSのアイコンは点きっぱなしになっていた。
ユーザが止めれるようにするか、数分で自動的に止めるべき。


あと当たり前だけどLocationManagerを初期化しているgetSystemService()はonCreateイベント内かそれより後で呼ばないとアプリごと強制終了する。コンストラクタで呼んだら堕ちた。