Question

my android app function is displaying accumulated distance through gps when the person is walking. the distance value displayed in like null9.55355.9346855.94574547 and increasing by the second. my gos is sensitive location change very fast even though i am not moving my phone. but the main problem is how do i add the value and not make it increase its length. i was thinking of turning the string dist to a Double1 and double2 += valueof double1. then convert double2 to string and display of my TextView. but i do not know how to convert in android. in the first place i am not even sure my idea can work.

EDIT: when i run my output becomes 1.093507E7 . why is there the E7? it did display on my textview but then it crash soon after.

My java code

    public class MainActivity extends Activity{

protected LocationManager locationManager;
EditText userNumberInput;
EditText userTextInput;
TextView distanceText;
TextView latitude;
TextView longitude;
double lat1,lon1,lat2,lon2,lat3,lon3,lat4,lon4;
String dist = "";
String value;
double finalDist1, finalDist2;
float[] result;
private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 0; // in Meters
    private static final long MINIMUM_TIME_BETWEEN_UPDATES = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    distanceText=(TextView)findViewById(R.id.Distance);
    latitude=(TextView)findViewById(R.id.currentLat);
    longitude=(TextView)findViewById(R.id.currentLon);

    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MINIMUM_TIME_BETWEEN_UPDATES,MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, myLocationListener); 
    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);

    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();

        //Display current location in textview  
        latitude.setText("Current Latitude: " + String.valueOf(location.getLatitude())); 
        longitude.setText("Current Longitude: " + String.valueOf(location.getLongitude()));
        lat1 = location.getLatitude();
        lon1 = location.getLongitude();
    }
    else if(location == null)
    {
        Toast.makeText(MainActivity.this,
                "Location is null",    
                Toast.LENGTH_LONG).show();
    }

}

private CharSequence ToString(double latitude2) {
    // TODO Auto-generated method stub
    return null;
}

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


            if(dist!=null &&  String.valueOf(results[0])!=null)
            {
                dist += String.valueOf(results[0]); // your String
                finalDist1 = Double.parseDouble(dist);
                finalDist2 += finalDist1;
                distanceText.setText(String.valueOf(finalDist2));
                Toast.makeText(MainActivity.this,
                        "Distance is accumulated",    
                        Toast.LENGTH_LONG).show();
                lat1=loc2.getLatitude();
                lon1=loc2.getLongitude();
            }


            Toast.makeText(MainActivity.this,
                    "Distance",    
                    Toast.LENGTH_LONG).show();
            lat1=loc2.getLatitude();
            lon1=loc2.getLongitude();
        }         
}

public void onProviderDisabled(String provider)
{
    Toast.makeText(MainActivity.this,
            "GPS is disabled",
            Toast.LENGTH_LONG).show();
}
public void onProviderEnabled(String provider)
{
    Toast.makeText(MainActivity.this,
            "GPS is enabled",
            Toast.LENGTH_LONG).show();
}
public void onStatusChanged(String provider, int status,
        Bundle extras)
{
    Toast.makeText(MainActivity.this,
            "GPS status changed",
            Toast.LENGTH_LONG).show();
}

};
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(myLocationListener);
}
@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MINIMUM_TIME_BETWEEN_UPDATES,MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, myLocationListener);
}}

log cat

01-29 23:53:04.814: D/gralloc_goldfish(1076): Emulator without GPU emulation detected.
01-29 23:53:16.444: I/System.out(1076): Distance is: 1.093507E7
01-29 23:53:16.614: I/Choreographer(1076): Skipped 45 frames!  The application may be doing too much work on its main thread.
01-29 23:53:23.784: I/Choreographer(1076): Skipped 57 frames!  The application may be doing too much work on its main thread.
01-29 23:53:34.774: I/System.out(1076): Distance is: 6412915.0
01-29 23:53:34.774: D/AndroidRuntime(1076): Shutting down VM
01-29 23:53:34.774: W/dalvikvm(1076): threadid=1: thread exiting with uncaught exception (group=0xb3a3dba8)
01-29 23:53:34.814: E/AndroidRuntime(1076): FATAL EXCEPTION: main
01-29 23:53:34.814: E/AndroidRuntime(1076): Process: com.example.validationapp, PID: 1076
01-29 23:53:34.814: E/AndroidRuntime(1076): java.lang.NumberFormatException: Invalid double: "1.093507E76412915.0"
01-29 23:53:34.814: E/AndroidRuntime(1076):     at java.lang.StringToReal.invalidReal(StringToReal.java:63)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at java.lang.StringToReal.initialParse(StringToReal.java:114)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at java.lang.StringToReal.parseDouble(StringToReal.java:263)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at java.lang.Double.parseDouble(Double.java:295)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at com.example.validationapp.MainActivity$1.onLocationChanged(MainActivity.java:112)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:279)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:208)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:224)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at android.os.Looper.loop(Looper.java:136)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at   android.app.ActivityThread.main(ActivityThread.java:5017)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at java.lang.reflect.Method.invokeNative(Native Method)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at java.lang.reflect.Method.invoke(Method.java:515)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-29 23:53:34.814: E/AndroidRuntime(1076):     at dalvik.system.NativeStart.main(Native Method)
01-29 23:53:38.814: I/Process(1076): Sending signal. PID: 1076 SIG: 9
Was it helpful?

Solution

Looking at your latest edits, I think you've over-thought this. Try something like this instead. Note how we just store one double value for your distance and we increment that each time the user has travelled.

public class MainActivity extends Activity{

  protected LocationManager locationManager;
  EditText userNumberInput;
  EditText userTextInput;
  TextView distanceText;
  TextView latitude;
  TextView longitude;
  double lat1,lon1,lat2,lon2,lat3,lon3,lat4,lon4;
  double dist = 0;
  String value;
  float[] result;
  private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 0; // in Meters
  private static final long MINIMUM_TIME_BETWEEN_UPDATES = 0;

  // methods omitted

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

        dist += results[0];            
        DecimalFormat df = new DecimalFormat("#.##"); // adjust this as appropriate
        distanceText.setText(df.format(dist));

        Toast.makeText(MainActivity.this,
        "Distance",    
        Toast.LENGTH_LONG).show();
        lat1=loc2.getLatitude();
        lon1=loc2.getLongitude();
      }         
    }

  // methods omitted
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top