Android-Can';t在活动启动时刷新用户位置

Android-Can';t在活动启动时刷新用户位置,android,android-maps-v2,android-location,locationmanager,android-maps,Android,Android Maps V2,Android Location,Locationmanager,Android Maps,我无法刷新用户的位置 在我的应用程序中,我启动了标记用户当前位置的地图,但是locationManager.getLastKnownLocation()返回了一个不同的位置 因为它使用缓存位置 如何将上一个已知位置与当前位置进行比较,以便在回调OnMapReady中标记地图上的正确位置 我在StackOverflow中找到的每个示例都使用LocationListener.onLocationChanged()方法,但我需要在activity launch上刷新位置(如果需要) 代码: priva

我无法刷新用户的位置

在我的应用程序中,我启动了标记用户当前位置的地图,但是
locationManager.getLastKnownLocation()
返回了一个不同的位置 因为它使用缓存位置

如何将上一个已知位置与当前位置进行比较,以便在回调
OnMapReady
中标记地图上的正确位置

我在StackOverflow中找到的每个示例都使用
LocationListener.onLocationChanged()
方法,但我需要在activity launch上刷新位置(如果需要)

代码:

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
吗?

最后一个已知位置有一个与之关联的时间戳,它可能是过去相当长的一段时间。只需将最后一个已知位置的时间戳与您允许的最大年龄进行年龄比较,并在需要时请求更新。下面是一个简单的例子:

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.
    }
}

您不希望每次启动活动时都请求位置更新,因此为此设置一个合理的最长时间。

谢谢,Pablo。还有一个问题:我应该使用
requestSingleUpdate()
来获取刷新的位置吗?您可以,尽管我会使用
requestLocationUpdates()
并在获得准确的位置后停止它。如果这是解决方案,我将测试它并更新问题!谢谢对
LocationManager
使用了不同的实现,我认为您不能将它与
GoogleMap
一起使用来获取连接回调。你从哪里得到这个主意的?为此,您需要一个API客户端。你为什么先在SO而不是在中寻找答案,这是另一个论坛的问题。试着把它读到最后,你就会解决这个问题。是的,请使用
FusedLocation
,除非您想使用不推荐使用的代码