android gps distance显示重启时的上一条记录

时间:2013-12-19 13:47:21

标签: android gps

我有一个Android应用程序,可以计算行走时与GPS的距离。第一次距离计算正确。但是当我重新启动应用程序时,它最初会显示前一个距离,它应该为0.

这是我的活动:

public class Gps extends Activity {
TextView display;
Button start;
boolean doubleclick = false;
AnimationDrawable AppNameAnimation;
private boolean enabled;
double currentLon = 0;
double currentLat = 0;
double lastLon = 0;
double lastLat = 0;
double distance;
Animation animRotate;
TextView startStop;

LocationManager lm;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_test);
    startStop = (TextView) findViewById(R.id.textView2);
    display = (TextView) findViewById(R.id.textView1);
    start = (Button) findViewById(R.id.button1);
    animRotate = AnimationUtils.loadAnimation(this, R.anim.anim_rotate);

    start.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (!doubleclick) {
                lm = (LocationManager) getSystemService(LOCATION_SERVICE);
                enabled = lm
                        .isProviderEnabled(LocationManager.GPS_PROVIDER);
                if (!enabled) {
                    Intent inte = new Intent(
                            Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivity(inte);
                } else {
                    lm.requestLocationUpdates(lm.GPS_PROVIDER, 0, 0,
                            Loclist);
                    Location loc = lm.getLastKnownLocation(lm.GPS_PROVIDER);

                    if (loc == null) {
                        display.setText("No GPS location found");
                    } else {
                        // set Current latitude and longitude
                        currentLon = loc.getLongitude();
                        currentLat = loc.getLatitude();
                        Log.e("Location", "currentLat:" + currentLat);

                    }
                    // Set the last latitude and longitude
                    startStop.setText("Stop");
                    lastLat = currentLat;
                    lastLon = currentLon;
                    doubleclick = true;
                }
            } else {
                lm.removeUpdates(Loclist);
                startStop.setText("Start");
                v.clearAnimation();
                doubleclick = false;
                Intent in = new Intent(Gps.this, NextActivity.class);
                // in.putExtra("distance", display.toString());
                startActivity(in);
                finish();
            }

        }
    });
}

LocationListener Loclist = new LocationListener() {

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub

        // start location manager
        LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);

        // Get last location
        Location loc = lm.getLastKnownLocation(lm.GPS_PROVIDER);

        // Request new location
        lm.requestLocationUpdates(lm.GPS_PROVIDER, 0, 0, Loclist);

        // Get new location
        Location loc2 = lm.getLastKnownLocation(lm.GPS_PROVIDER);

        // get the current lat and long
        currentLat = loc.getLatitude();
        currentLon = loc.getLongitude();

        Location locationA = new Location("point A");
        locationA.setLatitude(lastLat);
        locationA.setLongitude(lastLon);

        Location locationB = new Location("point B");
        locationB.setLatitude(currentLat);
        locationB.setLongitude(currentLon);
        if (lastLat != 0 || lastLon != 0) {
            double distanceMeters = locationA.distanceTo(locationB);

            double distanceKm = distanceMeters / 1000f;

            display.setText(String.format("%.2f Km", distanceKm));
            Constant.distance = (String.format("%.2f Km", distanceKm));
            start.startAnimation(animRotate);
        }

    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

};
}

请帮帮我。这对我来说非常重要。

已编辑的代码

public class Gps extends Activity {
TextView display;
Button start;
boolean doubleclick = false;
AnimationDrawable AppNameAnimation;
private boolean enabled;
double currentLon = 0;
double currentLat = 0;
double lastLon = 0;
double lastLat = 0;
double distance;
Animation animRotate;
TextView startStop;

LocationManager lm;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_test);
    startStop = (TextView) findViewById(R.id.textView2);
    display = (TextView) findViewById(R.id.textView1);
    start = (Button) findViewById(R.id.button1);
    animRotate = AnimationUtils.loadAnimation(this, R.anim.anim_rotate);

    start.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (!doubleclick) {
                lm = (LocationManager) getSystemService(LOCATION_SERVICE);
                enabled = lm
                        .isProviderEnabled(LocationManager.GPS_PROVIDER);
                if (!enabled) {
                    Intent inte = new Intent(
                            Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivity(inte);
                } else {
                    lm.requestLocationUpdates(lm.GPS_PROVIDER, 0, 0,
                            Loclist);
                    Log.e("successss", "111111111111");
                }
            } else {
                lm.removeUpdates(Loclist);
                startStop.setText("Start");
                v.clearAnimation();
                doubleclick = false;
                Intent in = new Intent(Gps.this, NextActivity.class);
                // in.putExtra("distance", display.toString());
                startActivity(in);
                finish();
            }

        }
    });
}

LocationListener Loclist = new LocationListener() {

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        Log.e("successss", "2222222222222");
        // start location manager
        LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
        lm.requestLocationUpdates(lm.GPS_PROVIDER, 0, 0, Loclist);
        // Get last location

        if(!doubleclick){
        Location loc1 = lm.getLastKnownLocation(lm.GPS_PROVIDER);
        Log.e("successss", "33333333333333333");
        if (loc1 == null) {
            display.setText("No GPS location found");
        } else {
            Log.e("successss", "444444444444");
            // set Current latitude and longitude
            currentLon = loc1.getLongitude();
            currentLat = loc1.getLatitude();
            Log.e("Location", "currentLat:" + currentLat);

        }
        Log.e("successss", "5555555555555");
        // Set the last latitude and longitude
        startStop.setText("Stop");
        lastLat = currentLat;
        lastLon = currentLon;
        doubleclick = true;
        }
        Log.e("successss", "66666666666");
        Log.e("Location", "lastLat:" + lastLat);
        Log.e("Location", "currentLat:" + currentLat);
        //Location loc = lm.getLastKnownLocation(lm.GPS_PROVIDER);
        // Request new location
        //lm.requestLocationUpdates(lm.GPS_PROVIDER, 0, 0, Loclist);

        // Get new location
        Location loc2 = lm.getLastKnownLocation(lm.GPS_PROVIDER);

        // get the current lat and long
        currentLat = loc2.getLatitude();
        currentLon = loc2.getLongitude();

        Location locationA = new Location("point A");
        locationA.setLatitude(lastLat);
        locationA.setLongitude(lastLon);

        Location locationB = new Location("point B");
        locationB.setLatitude(currentLat);
        locationB.setLongitude(currentLon);
        if (lastLat != 0 || lastLon != 0) {
            double distanceMeters = locationA.distanceTo(locationB);

            double distanceKm = distanceMeters / 1000f;

            display.setText(String.format("%.2f Km", distanceKm));
            Constant.distance = (String.format("%.2f Km", distanceKm));
            start.startAnimation(animRotate);
        }

    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

};
}

2 个答案:

答案 0 :(得分:0)

当您重新启动应用时,GPS需要一些时间才能获得新的位置坐标。

在你的代码中你有这个

lm.requestLocationUpdates(lm.GPS_PROVIDER, 0, 0, Loclist);
                    Location loc = lm.getLastKnownLocation(lm.GPS_PROVIDER);

所以,loc从最后一次运行中获得lastKnownLocationValues,因此显示它们。

如果您不想显示上次已知的位置值,请在每次重新启动时指定loc = null,但这需要一些时间来获取第一个位置。

这种特殊行为的实施是因为通常情况下您的GPS连接可能会丢失一段时间,在那么短的时间内您不希望向用户显示该位置为空或无法找到,因为可能在这个小范围内,他们没有走得太远,所以你改为显示最后一个已知位置。

编辑:

从您的其他地方删除此代码 这是你的locationListener

而不是

 if (!enabled) {
                    Intent inte = new Intent(
                            Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivity(inte);
                } else {
                    lm.requestLocationUpdates(lm.GPS_PROVIDER, 0, 0,
                            Loclist);
                    Location loc = lm.getLastKnownLocation(lm.GPS_PROVIDER);

                    if (loc == null) {
                        display.setText("No GPS location found");
                    } else {
                        // set Current latitude and longitude
                        currentLon = loc.getLongitude();
                        currentLat = loc.getLatitude();
                        Log.e("Location", "currentLat:" + currentLat);

                    }
                    // Set the last latitude and longitude
                    startStop.setText("Stop");
                    lastLat = currentLat;
                    lastLon = currentLon;
                    doubleclick = true;
                }

更改为

 if (!enabled) {
                    Intent inte = new Intent(
                            Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivity(inte);
                } else {
                    lm.requestLocationUpdates(lm.GPS_PROVIDER, 0, 0,
                            Loclist);

                        display.setText("searching for location...");
                    }

然后在locationListener的{​​{1}}方法

中更新文本框

编辑:

再声明两个变量和一个标志

onLocationChanged()
你的onLocationChanged()

中的

public void onLocationChanged(位置位置){

private boolean enabled;
double currentLon = 0;
double currentLat = 0;

double prevLon = 0;
double prevLat = 0;
bool firstTime = true;

答案 1 :(得分:0)

因为您使用:

Location loc = lm.getLastKnownLocation(lm.GPS_PROVIDER);

如果要等待实际位置,请将其设置为null。然后从OnLocationChangedListener开始你的工作 该方法会撤消用户的最后位置... GPS需要一些时间才能获得实际位置。

修改

从else中删除此代码:

                Location loc = lm.getLastKnownLocation(lm.GPS_PROVIDER);

                if (loc == null) {
                    display.setText("No GPS location found");
                } else {
                    // set Current latitude and longitude
                    currentLon = loc.getLongitude();
                    currentLat = loc.getLatitude();
                    Log.e("Location", "currentLat:" + currentLat);

                }
                // Set the last latitude and longitude
                startStop.setText("Stop");
                lastLat = currentLat;
                lastLon = currentLon;
                doubleclick = true;

并且只是等待这个位置......例如,显示吐司,告诉用户你正在等待这个位置。 然后,当你有位置时,在

中做这些事情
public void onLocationChanged(Location location) {}

方法.. 我不知道你的代码到底做了什么......我只是想解释一下我将如何做到这一点......你必须等待并且不要在创建视图时开始操作,但是你当你有职位时必须开始一切