displaying accumulated distance gps. convert string/double

ぐ巨炮叔叔 提交于 2019-12-11 19:43:25

问题


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

回答1:


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


来源:https://stackoverflow.com/questions/21436652/displaying-accumulated-distance-gps-convert-string-double

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!