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.qiquanji.com/post/8439.html
本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。