我的应用程序应该在用户走动时实时显示距离和位置,但我的输出有错误.距离没有立即开始,但是当它开始时它会增加很多,直到它减慢一点.根据我见过的一个例子,红色标记和蓝点应该在一起,但它们在我的应用程序中是分开的.他们两个都说我当前的位置对吗?红色标记和蓝点在短时间内跳跃,我没有移动,远离我的真实位置.我认为这也会导致距离的不准确.
请参阅我的输出了解更多详情
java代码
public class MainActivity extends FragmentActivity implements LocationListener{ 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; TextView distanceText; float[] result; private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES =1; // in Meters private static final long MINIMUM_TIME_BETWEEN_UPDATES = 3000; //in milliseconds boolean startDistance = false; boolean firstTime = false; @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(); } distanceText=(TextView)findViewById(R.id.Distance); btnStartMove=(Button)findViewById(R.id.Start);//start moving //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) { startDistance = true; // lat3 = location.getLatitude(); // lon3 = location.getLongitude(); } }); 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())); //lat3 = location.getLatitude(); //lon3 = location.getLongitude(); } 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()); // if(myLocation.getSpeed() > speed) // { //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) { distanceText.setText(df.format(dist) + "meters"); } lat3=myLocation.getLatitude(); lon3=myLocation.getLongitude(); count=1; } } 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); }}
似乎没有办法解决我的错误.我被推荐使用location.getSpeed,但它返回0.