为什么方法getLastLocation()有时会得到一个过时的位置



我使用新的 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时 - 可能会发生以下两种情况之一。

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

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

有关 LocationClient 类的更多信息以及在应用程序中使用位置的方法,可以从 Android 开发人员站点查看这些源。

  • https://developer.android.com/reference/com/google/android/gms/location/LocationClient.html
  • http://developer.android.com/guide/topics/location/strategies.html

正如关于方法getLastLocation的描述所说,

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

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

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

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

为了更好地理解,我建议您通过此视频会话:蓝点之外

编辑:

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

请从此处下载示例应用程序。

最新更新