Java 显示累计距离gps。转换字符串/双精度
我的android应用程序功能是在人行走时通过gps显示累计距离。以类似null9.55355.9346855.94574547的格式显示的距离值,并按秒递增。我的gos是敏感的位置变化非常快,即使我不移动我的手机。但主要的问题是我如何增加值,而不是使其增加长度。我正在考虑将字符串dist转换为Double1,double2+=valueofdouble1。然后将double2转换为字符串并显示我的文本视图。但我不知道如何在android中转换。首先,我甚至不确定我的想法是否可行 编辑:当我运行时,我的输出变为1.093507E7。为什么会有E7?它确实显示在我的文本视图上,但很快就崩溃了 我的java代码Java 显示累计距离gps。转换字符串/双精度,java,android,distance,Java,Android,Distance,我的android应用程序功能是在人行走时通过gps显示累计距离。以类似null9.55355.9346855.94574547的格式显示的距离值,并按秒递增。我的gos是敏感的位置变化非常快,即使我不移动我的手机。但主要的问题是我如何增加值,而不是使其增加长度。我正在考虑将字符串dist转换为Double1,double2+=valueofdouble1。然后将double2转换为字符串并显示我的文本视图。但我不知道如何在android中转换。首先,我甚至不确定我的想法是否可行 编辑:当我运行
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);
}}
原木猫
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
看看你最近的编辑,我想你已经想得太多了。试试这样吧。请注意,我们仅为您的距离存储一个
double
值,并在用户每次旅行时增加该值
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
我尝试将dis转换为double,然后转换为string来显示它,但我的应用程序崩溃了。你能帮我吗?@Myst将堆栈跟踪添加到问题中。对不起,我是新手。我不知道什么是堆栈策略。它说什么是错误异常,是由什么引起的?我只发布所有的日志,我可以复制。应与前一行相同,因此它可能不是stacktrace..@Myst您需要删除行
dist+=String.valueOf(结果[0])代码>。我删除了它,因为我不需要dist,所以我将代码更改为finalDist1=Double.valueOf(结果[0]);finalDist2+=finalDist1;distanceText.setText(String.valueOf(finalDist2));。如上面最新的日志目录所示。