Android 为什么getLastLocation()方法有时会获取过期的位置?

Android 为什么getLastLocation()方法有时会获取过期的位置?,android,gps,maps,location,android-location,Android,Gps,Maps,Location,Android Location,我正在使用新的api获取位置。但即使有了这个新的api,我的设备的位置也过时了。此方法(getLastLocation())获取的位置已过期。如果wifi正常,则会获取任意位置。但当wifi关闭时,它会得到一个旧位置。谷歌地图应用程序怎么能如此快速地获取位置 这是我正在使用的类: public class NewGPSTracker implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayService

我正在使用新的api获取位置。但即使有了这个新的api,我的设备的位置也过时了。此方法(getLastLocation())获取的位置已过期。如果wifi正常,则会获取任意位置。但当wifi关闭时,它会得到一个旧位置。谷歌地图应用程序怎么能如此快速地获取位置

这是我正在使用的类:

public class NewGPSTracker implements
    GooglePlayServicesClient.ConnectionCallbacks,
    GooglePlayServicesClient.OnConnectionFailedListener,
    LocationListener, com.google.android.gms.location.LocationListener {


private LocationRequest lr;
private LocationClient lc;
Location location;
double latitude = 0;
double longitude = 0;
Context context;    
public int res = 0;
boolean connected;  


public  NewGPSTracker(Context context) {
    this.context = context;
    lr = LocationRequest.create();
    lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    lr.setInterval(5000);       
    lr.setFastestInterval(1000);
    lc = new LocationClient(context, this, this);   

    sp = context.getSharedPreferences("GPS", 0);
    editor = sp.edit();
}

@Override
public void onLocationChanged(Location location) {              
    if (connected && location != null) {
        latitude = location.getLatitude();
        longitude = location.getLongitude();

        }


    }

}



@Override
public void onConnected(Bundle connectionHint) {
    Log.i("NewGPSTracker", "Google Play Services Conectado.");
    lc.requestLocationUpdates(lr, this);
    connected = true;           

    location = lc.getLastLocation();        
    if (connected && location != null) {    

        latitude = location.getLatitude();
        longitude = location.getLongitude();    
        Log.i("Location", ""+latitude + " "+longitude);

    }       
}

@Override
public void onConnectionFailed(ConnectionResult arg0) {     
    Log.e("NewGPSTracker", ""+arg0);
}

public double getLatitude() {
    return latitude;
}

public double getLongitude() {
    return longitude;
}   


public void connect(){
    lc.connect();
}

public void disconnect(){
    lc.disconnect();
}       

@Override
public void onDisconnected() {

}


public void onProviderDisabled(String arg0) {
    // TODO Auto-generated method stub

}

public void onProviderEnabled(String arg0) {
    // TODO Auto-generated method stub

}

public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    // TODO Auto-generated method stub

}   

}如果我理解你的问题,你想知道为什么WiFi关闭时报告的位置已过期。
LocationClient.getLastLocation()
方法将只返回“当前可用的最佳最近位置”。这意味着,当您不使用WiFi时,可能会发生以下两种情况之一

  • 设备没有连接。当使用没有移动数据的设备时,例如Nexus 7的仅WiFi型号,情况就是如此。在这种情况下,
    getLastLocation()
    方法将返回上次连接时的最后一个位置。这将导致在调用该方法时返回旧位置

  • 该设备正在使用移动网络获取位置。通常,为了减少使用的移动数据量,位置的获取精度较低和/或获取频率较低。这意味着,当获得一个新位置时,它可能被视为不是“最佳最近位置”。有多个因素影响是否更新“最新最佳位置”,如获取位置之间的时间和收集的数据的准确性

  • 有关
    LocationClient
    类以及在应用程序中使用位置的方法的更多信息,您可以从Android开发者网站查看这些源代码


    正如对该方法的描述所述

    此方法返回当前可用的最佳最近位置

    如果位置不可用(这种情况应该很少发生),则返回null。将返回在尊重位置权限的情况下可用的最佳精度

    此方法提供了获取位置的简化方法。它特别适合于不需要精确位置且不希望为位置更新维护额外逻辑的应用程序

    这仅仅意味着,它可能不会同时尝试为您检索新位置

    为了更好地理解,我建议您进行以下视频课程:

    编辑:

    连接到位置服务后,您可以使用方法请求位置更新


    请从下载示例应用程序。

    看看这个问题:那么,如果该方法有时获取旧位置,我如何获取atual位置?那么您又在执行
    getLastLocation
    ?您已经请求了,因此您肯定会在
    onLocationChanged
    方法中获得更新的位置。