Gps/ AndroidでGPSセンサを利用
GPS での緯度経度取得の基本
http://jp-shibax.air-nifty.com/blog/2010/07/gps-3b04.html
android端末でGPSを利用して緯度経度を取得する際のホントの基本コードです。
public class MainAct? extends Activity implements
LocationListener?,
GpsStatus?.Listener
{
LocationManager mLocMan;
InnerState mInnerState = new InnerState();
public final static String LOG_TAG = "GpsTest";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mLocMan = (LocationManager) getSystemService(LOCATION_SERVICE);
// GPS状態取得
if(!mLocMan?.isProviderEnabled?(LocationManager?.GPS_PROVIDER)){
Log.d(LOG_TAG, "GPS is disabled.");
return;
}else{
Log.d(LOG_TAG, "GPS is Enabled.");
}
}
@Override
protected void onResume() {
mLocMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
mLocMan.addGpsStatusListener(this);
Log.d(LOG_TAG, "Start Location Update.");
super.onResume();
}
@Override
protected void onPause() {
mLocMan.removeUpdates(this);
mLocMan.removeGpsStatusListener(this);
super.onPause();
}
public void updateTextview(){
String szMsg = "";
szMsg = "lat = " + String.valueOf(mInnerState.latitude ) + "\n";
szMsg += "lon = " + String.valueOf(mInnerState.longitude) + "\n";
szMsg += "alt = " + String.valueOf(mInnerState.altitude ) + "\n";
if(mInnerState.satellites!=null){
int nFind=0, nUse = 0;
for(GpsSatellite one : mInnerState.satellites){
nFind ++;
nUse += one.usedInFix()? 1: 0;
}
szMsg += "Find = " + String.valueOf(nFind) + " ";
szMsg += "Used = " + String.valueOf(nUse) + "\n";
szMsg += "accr = " + String.valueOf(mInnerState.accuracy) + "\n";
szMsg += "Powr = " + String.valueOf(mInnerState.powerReq) + "\n";
}
((TextView)findViewById(R.id.TextView01)).setText(szMsg);
}
// by LocationListener
@Override
public void onLocationChanged(Location arg0) {
Log.d(LOG_TAG, "onLocationChanged...");
mInnerState.latitude = arg0.getLatitude();
mInnerState.longitude = arg0.getLongitude();
mInnerState.altitude = arg0.getAltitude();
this.updateTextview();
}
// by LocationListener
@Override
public void onProviderDisabled(String provider) {
Log.d(LOG_TAG, "onProviderDisabled...");
}
// by LocationListener
@Override
public void onProviderEnabled(String provider) {
Log.d(LOG_TAG, "onProviderEnabled...");
}
// by LocationListener
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Log.d(LOG_TAG, "onStatusChanged...");
}
// by GpsStatus.Listener
@Override
public void onGpsStatusChanged(int event) {
Log.d(LOG_TAG, "onGpsStatusChanged...");
// GpsStatus.Listenerで呼ばれる
switch(event){
case GpsStatus.GPS_EVENT_STARTED:
Log.d(LOG_TAG, "GPS_EVENT_STARTED");
break;
case GpsStatus.GPS_EVENT_STOPPED:
Log.d(LOG_TAG, "GPS_EVENT_STOPPED");
break;
case GpsStatus.GPS_EVENT_FIRST_FIX:
Log.d(LOG_TAG, "GPS_EVENT_FIRST_FIX");
break;
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
GpsStatus st = mLocMan.getGpsStatus(null);
LocationProvider prod = mLocMan.getProvider(LocationManager.GPS_PROVIDER);
mInnerState.satellites = st.getSatellites();
mInnerState.accuracy = prod.getAccuracy();
mInnerState.powerReq = prod.getPowerRequirement();
updateTextview();
break;
}
}
public class InnerState{
public double latitude = 0;
public double longitude = 0;
public double altitude = 0;
public Iterable<GpsSatellite> satellites = null;
public int accuracy = 0;
public int powerReq = 0;
}
}
やってる事は・・・
getSystemService?(LOCATION_SERVICE) で LocationManager?を取得して
LocationManager?#requestLocationUpdate? で位置更新のリスナを登録して
LocationManager?#addGpsStatusListener? でGPSの状態更新のリスナを登録して
あとは、それぞれのイベントを処理しているだけです。
参考まで。。。(って参考にならないか。)