我试图刷新用户的位置。
在我的应用中,我启动地图标记用户的当前位置,但locationManager.getLastKnownLocation()
正在返回其他位置
因为它使用缓存位置。
如何将最后的已知位置与当前位置进行比较,以便在回调OnMapReady
中标记地图上的正确位置?
我在StackOverflow中找到的每个示例都使用LocationListener.onLocationChanged()
方法,但我需要在活动启动时刷新位置(如果需要)。
代码:
private static final String TAG_MAP_LOAD_FAILED = "FAIL LOADING MAP STYLE";
private static final String TAG_MAP_PARSING_FAILED = "FAIL PARSING MAP STYLE";
private GoogleMap mMap;
private LatLng mMyCoordinates;
private LocationManager mLocationManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
try{
boolean success = googleMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(getContext(), R.raw.style_mapjson));
if(!success){
Log.e(TAG_MAP_PARSING_FAILED, "Failed parsing JSON Style");
}
}catch (Resources.NotFoundException ex){
Log.e(TAG_MAP_LOAD_FAILED, "Can't find style. Error:", ex);
}
mMap.setIndoorEnabled(false);
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(mMyCoordinates);
markerOptions.title("Marker in my location");
mMap.addMarker(markerOptions);
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(mMyCoordinates, 15);
mMap.moveCamera(cameraUpdate);
mMap.getUiSettings().setRotateGesturesEnabled(false);
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
OBS:我清理了代码,因为它已经完成了不成功的尝试。只是展示它的结构。
我应该使用FusedLocation
吗?
答案 0 :(得分:1)
最后一个已知位置有一个与之关联的时间戳,这可能是过去的一段时间。只需使用您允许的最大年龄与上次已知位置的时间戳进行年龄比较,并在需要时请求更新。这是一个快速而肮脏的例子:
private static long MAX_TIME = 60 * 60 * 1000; //Update if location is older than one hour
@Override
public void onResume() {
super.onResume();
Location location = mLocationManager.getLastKnownLocation(YOUR_PROVIDER_HERE); //GPS or Network
boolean shouldUpdateLocation = false;
if (location != null) {
long elapsedTime = System.currentTimeMillis() - location.getTime();
if (elapsedTime >= MAX_TIME) {
shouldUpdateLocation = true;
}
}
else {
shouldUpdateLocation = true;
}
if (shouldUpdateLocation) {
//TODO: Request location update here.
}
}
您不希望每次启动活动时都要请求位置更新,因此请为此设置合理的MAX_TIME。