Pergunta

My android app is to track user location on a map and calculate the distance and duration he has walked or run. Then when i press stop, pass it over to the next page. My distance and duration calculation should be correct, but the location is wrong. whether i don't move or move a few meters in my house, it sometimes never change or change a lot, result in the distance being inaccurate. how do i ensure accuracy for when i walked, even a few meters, because when i present i will be walking for a short distance. second, i can pass my duration data over to the next page, but when i pass my distance it is 0.0 but the value shown is not 0.0 at all(got value although inaccurate). i pass my information when i press Stop button.

My MainActivity Java Code, display map, distance, duration.

 protected LocationManager locationManager;
    private GoogleMap googleMap;
    Button btnStartMove,btnPause,btnResume,btnStop;
    static double n=0;
    Long s1,r1;
    double dis=0.0;
    Thread t1;
    EditText userNumberInput;
    boolean bool=false;
    int count=0;

    double speed = 1.6;
    double lat1,lon1,lat2,lon2,lat3,lon3,lat4,lon4;
    double dist = 0.0;
    double time = 0.0;
    TextView distance;
    Button btnDuration;
    float[] result;
    private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES =1; // in Meters
    private static final long MINIMUM_TIME_BETWEEN_UPDATES = 4000; //in milliseconds
    boolean startDistance = false;
    boolean startButtonClicked = false;

    MyCount counter;
    int timer = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MINIMUM_TIME_BETWEEN_UPDATES,MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, this);
        if(isGooglePlay())
        {
            setUpMapIfNeeded();
        }
        distance=(TextView)findViewById(R.id.Distance);
        btnDuration=(Button)findViewById(R.id.Duration);
        btnStartMove=(Button)findViewById(R.id.Start);//start moving
        btnStop=(Button)findViewById(R.id.Stop);

        //prepare distance...........
        Log.d("GPS Enabled", "GPS Enabled");  
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        String provider = locationManager.getBestProvider(criteria, true);
        Location location=locationManager.getLastKnownLocation(provider);

        btnStartMove.setOnClickListener(new OnClickListener() 
        {
            @Override
            public void onClick(View v) {

                Log.d("GPS Enabled", "GPS Enabled");  
                Criteria criteria = new Criteria();
                criteria.setAccuracy(Criteria.ACCURACY_FINE);
                String provider = locationManager.getBestProvider(criteria, true);
                Location location=locationManager.getLastKnownLocation(provider);
                lat3 = location.getLatitude();
                lon3 = location.getLongitude();
                startButtonClicked=true;
                startDistance=true;
                counter= new MyCount(30000,1000);
                counter.start();
                Toast.makeText(MainActivity.this,
                          "Pressed Start",    
                          Toast.LENGTH_LONG).show();
            }
        });
        btnStop.setOnClickListener(new OnClickListener() 
        {
            @Override
            public void onClick(View v) {
                startButtonClicked=false;
                startDistance=false;
                //Double.valueOf(distance.getText().toString()
                Double value=dist;
                Double durationValue=time;
                Intent intent = new Intent(MainActivity.this, FinishActivity.class);

                intent.putExtra("dist", "value");
                intent.putExtra("time",durationValue);
                startActivity(intent);
                finish();
            }
        });

        btnDuration.setOnClickListener(new OnClickListener() 
        {
            @Override
            public void onClick(View v) {
                if(startButtonClicked=true) 
                {
                    time=n*30+r1;
                    Toast.makeText(MainActivity.this,"Duration :"+String.valueOf(time),Toast.LENGTH_LONG).show();
                }       
            }
        });

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


    }
    private void setUpMapIfNeeded() {

        if(googleMap == null)
        {
            Toast.makeText(MainActivity.this, "Getting map",
                    Toast.LENGTH_LONG).show();
            googleMap =((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.displayMap)).getMap();

            if(googleMap != null)
            {
                setUpMap();
            }
        }

    }

    private void setUpMap() 
    {
        //Enable MyLocation Layer of Google Map
        googleMap.setMyLocationEnabled(true);

        //Get locationManager object from System Service LOCATION_SERVICE
        //LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        //Create a criteria object to retrieve provider
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        //Get the name of the best provider
        String provider = locationManager.getBestProvider(criteria, true);
        if(provider == null)
        {
            onProviderDisabled(provider);
        }
        //set map type
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        //Get current location
        Location myLocation = locationManager.getLastKnownLocation(provider);
        if(myLocation != null)
        {
            onLocationChanged(myLocation);
        }       
        locationManager.requestLocationUpdates(provider, 0, 0, this);
    }

    private boolean isGooglePlay() 
    {
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

        if (status == ConnectionResult.SUCCESS)
        {

            Toast.makeText(MainActivity.this, "Google Play Services is available",
                    Toast.LENGTH_LONG).show();
            return(true);
        }
        else
        {
                GooglePlayServicesUtil.getErrorDialog(status, this, 10).show();

        }
        return (false);

     }

    @Override
    public void onLocationChanged(Location myLocation) {
        System.out.println("speed " + myLocation.getSpeed());

            //show location on map.................
            //Get latitude of the current location
            double latitude = myLocation.getLatitude();
            //Get longitude of the current location
            double longitude = myLocation.getLongitude();
            //Create a LatLng object for the current location
            LatLng latLng = new LatLng(latitude, longitude);
            //Show the current location in Google Map
            googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
            //Zoom in the Google Map
            googleMap.animateCamera(CameraUpdateFactory.zoomTo(20));
            googleMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("You are here!"));
            //show distance............................

            if(startDistance == true)
            {

                Toast.makeText(MainActivity.this,
                          "Location has changed",    
                          Toast.LENGTH_LONG).show();
                    if(myLocation != null)
                    {
                        //latitude.setText("Current Latitude: " + String.valueOf(loc2.getLatitude())); 
                        //longitude.setText("Current Longitude: " + String.valueOf(loc2.getLongitude()));
                        float[] results = new float[1]; 
                        Location.distanceBetween(lat3, lon3, myLocation.getLatitude(), myLocation.getLongitude(), results);
                        System.out.println("Distance is: " + results[0]);               

                        dist += results[0];            
                        DecimalFormat df = new DecimalFormat("#.##"); // adjust this as appropriate
                    if(count==1)
                    {
                        distance.setText(df.format(dist) + "meters");
                    }
                        lat3=myLocation.getLatitude();
                        lon3=myLocation.getLongitude();
                        count=1;
                  }

            }
            if(startButtonClicked == true)
            {
                startDistance=true;
            }
    }

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

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

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        Toast.makeText(MainActivity.this, "Provider status changed",
                Toast.LENGTH_LONG).show();
    }
    @Override
    protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
    }
    @Override
    protected void onResume() {
        super.onResume();
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MINIMUM_TIME_BETWEEN_UPDATES,MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, this);
    }
    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;
        }
    }}

pass information to this page,distance 0.0(inaccurate) duration is ok

public class FinishActivity extends Activity {
TextView displayDistance;
TextView displayDuration;
TextView displaySports;
TextView userID;
TextView sportID;
TextView caloriesBurned;


Button back;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_finish);
    Bundle extras = getIntent().getExtras();
    if (extras != null) 
    {
        Double value = extras.getDouble("dist");
        Double durationValue = extras.getDouble("time");
        displayDistance=(TextView)findViewById(R.id.finishDistance);
        displayDistance.setText("Distance: " + value);

        displayDuration=(TextView)findViewById(R.id.finishDuration);
        displayDuration.setText("Duration: " + durationValue + " seconds");

    }

    back=(Button)findViewById(R.id.Back);
    back.setOnClickListener(new OnClickListener() 
    {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(FinishActivity.this, MainActivity.class);
            startActivity(intent);
            finish();
        }
    });}

My output for my map, inaccurate location. i search for long but there seem to be no solution for this..please help..thanks. the starting location, speed where it change location, all seem to be different each time i run. it appear to be out of my control(or i can but i do not know..i'm a beginner at gps... most of the time it needs to wait a while before displaying the distance.

enter image description here

Foi útil?

Solução

Gps may not work well under the roof. So try it outside the house.

Also you have

intent.putExtra("dist", "value")

key is dist

value is a string not a double

SO you are passing string

But when you get you get the double

Double value = extras.getDouble("dist"); // wrong

If you pass a double value then you can get the double in the next activity. But you pass string and then you try to get the double value and that is wrong.

What you need

public Intent putExtra (String name, double value)

and

public double getDoubleExtra (String name, double defaultValue)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top