Android - 无法在活动启动时刷新用户位置

时间:2017-05-01 16:48:04

标签: android android-maps-v2 android-location locationmanager android-maps

我试图刷新用户的位置。

在我的应用中,我启动地图标记用户的当前位置,但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吗?

1 个答案:

答案 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。