0

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

}   

}

4

2 回答 2

0

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

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

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

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

于 2013-11-06T13:55:52.523 回答
0

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

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

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

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

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

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

编辑 :

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

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

于 2013-11-06T13:56:32.490 回答