LocationManager locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE); //定义一个监听器来响应位置的更新 LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { useNewLocation(location); } public void onStatusChanged(String provider, int status, Bundle extras) { } public void onProviderEnabled(String provider) { } public void onProviderDisabled(String provider) { } }; //注册监听器接收位置信息 LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER; //LocationProvider locationProvider=LocationManager.GPS_PROVIDER; locationManager.requestLocationUpdates(locationProvider, 0, 0, locationListener); //停止监听 locationManager.removeUpdates(locationListener); //利用缓存的位置信息 Location lastKnowLocation = locationManager.getLastKnowLocation(locationProvider); //维护一个最佳估测量的完整逻辑 private static final int TWO_MINUTES = 1000 * 60 * 2; protected boolean isBetterLocation(Location location, Location currentBestLocation) { if(currentBestLocation == null) { return true; } long timeDelta = location.getTime() - currentBestLocation.getTime(); boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; boolean isNewer = timeDelta > 0; if(isSignificantlyNewer) { return true; } else if(isSignificantlyOlder) { return false; } int accuracyDelta = (int)(location.getAccuracy() - currentBestLocation.getAccuracy()); boolean isLessAccurate = accuracyDelta > 0; boolean isMoreAccurate = accuracyDelta < 0; boolean isSignificantlyLessAccurate = accuracyDelta > 200; boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider()); if(isMoreAccurate) { return true; } else if(isNewer && !isLessAccurate) { return true; } else if(isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { return true; } return false; } private boolean isSameProvider(String provider1, String provider2) { if(provider1 == null) { return provider == null; } return provider1.equals(provider2); } //选择合适的位置服务提供者 Criteria criteria = new Criteria(); //经度要求 criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(false); criteria.setPowerRequirement(Criteria.POWER_LOW); //取得效果最好的criteria String provider = mlocationManager.getBestProvider(criteria, true);