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); }