【问题标题】:Why the method getLastLocation() get a location out of date sometimes?为什么 getLastLocation() 方法有时会导致位置过时?
【发布时间】:2013-11-06 13:37:55
【问题描述】:

我正在使用新的 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

}   

}

【问题讨论】:

标签: android gps maps location android-location


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    正如getLastLocation方法的描述所说,

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

    如果一个位置不可用,这应该很少发生,将返回 null。将返回尊重位置权限的最佳准确度。

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

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

    为了更好地理解,我建议您观看此视频会议: Beyond the blue dot

    编辑:

    连接定位服务后,可以通过requestLocationUpdates方法请求位置更新。

    请从here下载示例应用程序。

    【讨论】:

    • 那么,如果该方法有时会获取旧位置,我该如何获取实际位置?
    • 那么你又在做getLastLocation 吗?你已经请求了,所以你肯定会在onLocationChanged方法中得到更新的位置。
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2011-10-22
    • 2023-01-14
    相关资源
    最近更新 更多