LocationManager 总结

第一步:添加权限
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>或者
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>

第二步:获取LocationManager实例

LocationManager mLocationManager = context.getSystemService(Context.LOCATION_SERVICE);

第三步:添加监听
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, mListener);
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, mListener);

第四步:取消监听

mLocationManager.removeUpdates(mListener);

其中 mListener 初始化以及 Location的筛选算法(官网)
private static final int TWO_MINUTES = 1000 * 60 * 2;
	private LocationManager mLocationManager;
	private LocationListener mListener = new LocationListener()
	{
		public void onProviderEnabled(String provider)
		{

		}

		public void onProviderDisabled(String provider)
		{

		}

		public void onLocationChanged(Location location)
		{
			Location currentLoaction = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
			currentLoaction = checkLocation(location, currentLoaction);
		}

		public void onStatusChanged(String provider, int status, Bundle extras)
		{
			
		}
	};

/**
	 * @param location
	 * @param currentLoaction
	 * @return 返回better Loaction
	 */
	private Location checkLocation(Location location,Location currentLoaction)
	{
		if (isBetterLocation(location, currentLoaction))
			return location;
		else
			return currentLoaction;
	}

	/**
	 * Determines whether one Location reading is better than the current
	 * Location fix
	 * 
	 * @param location
	 *            The new Location that you want to evaluate
	 * @param currentBestLocation
	 *            The current Location fix, to which you want to compare the new
	 *            one
	 */
	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;
	}

	/** Checks whether two providers are the same */
	private boolean isSameProvider(String provider1, String provider2)
	{
		if (provider1 == null)
		{
			return provider2 == null;
		}
		return provider1.equals(provider2);
	}

  


原文地址:https://www.cnblogs.com/lipeil/p/2540061.html