使用gps获取距离,速度,行进时间

时间:2014-01-06 13:12:06

标签: android gps

我有一个代码,它给我当前的位置,行进的距离。但问题是,即使按下暂停按钮,我也无法获得适当的固定距离。数据波动。我如何修改它以便在按下获取距离按钮后获得一个距离。此代码也无法获得速度。

public class TestActivity extends Activity implements Runnable {
 private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
private static final long MINIMUM_TIME_BETWEEN_UPDATES = 30000;

protected LocationManager locationManager;
static double n=0;
Long s1,r1;
double plat,plon,clat,clon,dis;
MyCount counter;
Thread t1;
EditText e1;
boolean bool=true;

Button b1,b2,b3,b4,b5;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b1=(Button)findViewById(R.id.button1);<--- current position
b2=(Button)findViewById(R.id.button2);<---- start moving.. calculates distance on  clicking this
b3=(Button)findViewById(R.id.button3);<--- pause
b4=(Button)findViewById(R.id.button4);<-- resume
b5=(Button)findViewById(R.id.button5);<-- get distance
e1=(EditText)findViewById(R.id.editText1);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 
        MINIMUM_TIME_BETWEEN_UPDATES, 
        MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
        new MyLocationListener()
);
b1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        showCurrentLocation();
    }
});     

}
protected void showCurrentLocation() {

Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

if (location != null) {
    String message = String.format(
            "Current Location \n Longitude: %1$s \n Latitude: %2$s",
            location.getLongitude(), location.getLatitude()
    );
    clat=location.getLatitude();
    clon=location.getLongitude();
    Toast.makeText(TestActivity.this, message,
            Toast.LENGTH_LONG).show();
}
else{
    Toast.makeText(TestActivity.this, "null location",
            Toast.LENGTH_LONG).show();
}

}
public void start (View v){

switch(v.getId()){

case R.id.button2:
    t1=new Thread();
    t1.start();
    counter= new MyCount(30000,1000);
 counter.start();
 break;
case R.id.button3:
    counter.cancel();
    bool=false;
    break;
case R.id.button4:
    counter= new MyCount(s1,1000);
 counter.start();
 bool=true;
 break;
case R.id.button5:

    double time=n*30+r1;
    Toast.makeText(TestActivity.this,"distance in metres:"+String.valueOf(dis)+"Velocity in m/sec :"+String.valueOf(dis/time)+"Time :"+String.valueOf(time),Toast.LENGTH_LONG).show();

}


}


private class MyLocationListener implements LocationListener {

public void onLocationChanged(Location location) {
    String message = String.format(
            "New Location \n Longitude: %1$s \n Latitude: %2$s",
            location.getLongitude(), location.getLatitude()
    );

    Toast.makeText(TestActivity.this, message, Toast.LENGTH_LONG).show();
}

public void onStatusChanged(String s, int i, Bundle b) {
    Toast.makeText(TestActivity.this, "Provider status changed",
            Toast.LENGTH_LONG).show();
}

public void onProviderDisabled(String s) {
    Toast.makeText(TestActivity.this,
            "Provider disabled by the user. GPS turned off",
            Toast.LENGTH_LONG).show();
}

public void onProviderEnabled(String s) {
    Toast.makeText(TestActivity.this,
            "Provider enabled by the user. GPS turned on",
            Toast.LENGTH_LONG).show();
}

}
public class MyCount extends CountDownTimer{
public MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
    counter= new MyCount(30000,1000);
 counter.start();
 n=n+1;
}
@Override
public void onTick(long millisUntilFinished) {
    s1=millisUntilFinished;
    r1=(30000-s1)/1000;
    e1.setText(String.valueOf(r1));


}
}
@Override
public void run() {
while(bool){
clat=location.getLatitude();
    clon=location.getLongitude();
    if(clat!=plat || clon!=plon){
        dis+=getDistance(plat,plon,clat,clon);
        plat=clat;
        plon=clon;

    }

}

}

这是我的getDistance()

public double getDistance(double lat1, double lon1, double lat2, double lon2) {
double latA = Math.toRadians(lat1);
double lonA = Math.toRadians(lon1);
double latB = Math.toRadians(lat2);
double lonB = Math.toRadians(lon2);
double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
                (Math.sin(latA) * Math.sin(latB));
double ang = Math.acos(cosAng);
double dist = ang *6371;
return dist;
}

1 个答案:

答案 0 :(得分:0)

为什么不使用Google Play服务位置API?

https://developer.android.com/google/play-services/location.html

您无需为距离和速度编写任何距离计算代码。此外,它比Android的LocationListener更稳定。

也检查一下。 https://developer.android.com/training/location/index.html