我的挑战任务是获得非常高的准确性.所以我使用的是GPS_PROVIDER.但我的代码准确性不正确.有一段时间它显示我离我当前位置10到50米.有一段时间它显示我离我当前位置5到15米的距离.我已经测试了两个设备,如XOLO和索尼.我已经完成了这些问题并且无法修复它.这是我的代码: -
@Override protected void onResume() { super.onResume(); if(mMap!= null) mMaprivate LatLng geo; map.clear(); locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE); mFragment = (SupportMapFragment) this.getSupportFragmentManager().findFragmentById(R.id.map); mMap = mFragment.getMap(); } setListener(); } private void setListener() { System.out.println("setListener() locationListener = "+locationListener); if(locationListener != null){ clearListener(); } Toast toast = Toast.makeText(this, this.getResources().getString(R.string.maps_loading), Toast.LENGTH_LONG); toast.show(); private LatLng geo; locationListener = new CustomLocationListener(); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); //criteria.setAccuracy(Criteria.ACCURACY_HIGH); criteria.setPowerRequirement(Criteria.NO_REQUIREMENT); String bestProvider = locationManager.getBestProvider(criteria, true); Toast.makeText(this, "bestProvider= "+bestProvider, Toast.LENGTH_SHORT).show(); // locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); locationManager.requestLocationUpdates(bestProvider, 0, 0, locationListener); handler=new Handler(); timeoutTask = new TimeoutTask(locationListener); handler.postDelayed(timeoutTask, 50*1000); } private void clearListener(){ if(locationListener != null){ locationManager.removeUpdates(locationListener); locationListener = null; } } private void gotLocation(Location location){ loc = location; System.out.println("getLocation = "+location.getLatitude()); // Toast.makeText(getBaseContext(), "new Lat = "+location.getLatitude(), Toast.LENGTH_LONG).show(); } public class CustomLocationListener implements LocationListener { private boolean isCompleted = false; public CustomLocationListener() {} @Override public void onLocationChanged(Location location) { isCompleted=true; System.out.println("onLocationChanged 1"); // Called when a new location is found by the GPS location provider. if(isBetterLocation(location, loc)){ // Toast.makeText(getBaseContext(), "yes", Toast.LENGTH_LONG).show(); System.out.println("onLocationChanged 2"); gotLocation(location); } System.out.println("onLocationChanged 3"); clearListener(); setUserPoint(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } public boolean isCompleted() { return isCompleted; }private LatLng geo; } private LatLng geo; public class TimeoutTask implements Runnable { private CustomLocationListener listener; public TimeoutTask(CustomLocationListener listener) { this.listener=listener; } @Override public void run() { // TODO Auto-generated method stub if (listener == null || listener.isCompleted()) { Log.e("provider", "completed"); } else { Toast.makeText(ScorecardMapViewActivity.this, "We were unable to find your position, please try again", Toast.LENGTH_LONG).show(); Log.e("provider", "timeout"); clearListener(); setUserPoint(); if(goToScorecardStep3WithLocation) finish(); } } } protected boolean isBetterLocation(Location location, Location currentBestLocation) { if (currentBestLocation == null) { // A new location is always better than no location return true; } // Check whether the new location fix is newer or older long timeDelta = location.getTime() - currentBestLocation.getTime(); boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; boolean isNewer = timeDelta > 0; // If it's been more than two minutes since the current location, use the new location // because the user has likely moved if (isSignificantlyNewer) { return true; // If the new location is more than two minutes older, it must be worse } else if (isSignificantlyOlder) { return false; } // Check whether the new location fix is more or less accurate int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy()); boolean isLessAccurate = accuracyDelta > 0; boolean isMoreAccurate = accuracyDelta < 0; boolean isSignificantlyLessAccurate = accuracyDelta > 200; // Check if the old and new location are from the same provider boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider()); // Determine location quality using a combination of timeliness and accuracy if (isMoreAccurate) { return true; } else if (isNewer && !isLessAccurate) { return true; } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { return true; } return false; } private LatLng geo; private void setUserPoint() { if(!goToScorecardStep3WithLocation) { if(loc != null) { if(handler != null) { System.out.println("removed timeout task from handler"); handler.removeCallbacks(timeoutTask); } geo = HelperUtil.getLatLng(loc); mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(geo, 18)); mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); System.out.println("loc.getLatitude() = "+loc.getLatitude()); System.out.println("loc.getLongitude() = "+loc.getLongitude()); // your current position show. mMap.addMarker(new MarkerOptions().title("Player").position(geo) .icon(BitmapDescriptorFactory.fromResource(R.drawable.map_point))); } } }
请任何一位专家帮助我.你的帮助将非常有帮助.谢谢!
更新:-
我注意到我在同一个地方.有时我得到长小数点和有时小小数点.是否也会因小数点计算距离而产生任何影响?我在Yard计算距离.
当前位置= 纬度28.65361000000004长= 77.4122733333333
之前的当前位置点(这是相同的地方,但是纬度/长度不同)
Lat = 28.653685000000003 Long = 77.4123083333334
我有8码的距离.我认为一些问题可能是由于长或小的数字点.是否有办法让我们只获得长小数?