getLastKnownLocation在Android中返回null

时间:2014-03-10 14:34:41

标签: android

我知道这已被多次讨论,但没有任何帮助我解决getLastKnownLocation返回null的问题。

我的活动实现LocationListener:

public class MainActivity extends Activity implements
    GooglePlayServicesClient.ConnectionCallbacks,
    GooglePlayServicesClient.OnConnectionFailedListener, LocationListener {

我的onCreate方法中有这个:

  LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
  lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

然后我尝试获取用户位置(也在onCreate中):

    // Getting the Co-ordinates of the users current location
    Location location = lm
            .getLastKnownLocation(LocationManager.GPS_PROVIDER);

    if(location != null){
        longitude = location.getLongitude();
        latitude = location.getLatitude();
    }

我当时试过了:

@Override
public void onLocationChanged(Location location) {      
    longitude = location.getLongitude();
    latitude = location.getLatitude();
}

我错过了什么吗?

编辑:仍然没有工作,但我尝试过的代码:

    if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    while (location == null) {
        if (counter > MAX_TIME) {   
        }
        else {
            try {
                 location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            counter += 1000;
        }
    }
    }

2 个答案:

答案 0 :(得分:1)

您需要等待一段时间才能获得该位置,因为GPS需要几秒钟才能预热。

如果直接调用getLastLocation,它将返回您最后找到的位置,或者在没有缓存位置时返回null。如果您实施位置服务并尝试获取onLocationChanged的位置,这总是很好。您可以将此变量保持为静态,以便在其他类中访问。

有时, GPS提供商在您建设时无法获取位置,因此在这种情况下您可以切换到网络提供商以获取该位置但在网络中提供商准确与GPS提供商的比较

要获得更准确的位置,您可以在onLocationChanged中使用一段时间,直到您认为准确度更高。

答案 1 :(得分:1)

来自文档:

“返回一个位置,指示从给定提供程序获取的上次已知位置修复的数据。

返回 提供程序的最后已知位置,或null “

因此,必须至少使用提供的提供程序获得一个以前的位置。要使其接收位置,您必须至少使用该提供程序注册一次更新并接收实际更新。之后,getLastKnownLocation将返回该值。如果您想注册其他应用程序提供的位置,请使用Location.PASSIVE_PROVIDER。

希望这有帮助。

编辑:正如我在上面评论的那样,在迭代中放一个while循环说30秒,如果位置不再为null,则每秒检查一次。你需要至少发生一次,然后才能使用getLastKnownLocation,AFAIK。

使用未经测试的小例子进行编辑。最好将所有这些放在AsyncTask中,即在doInBackground中。请注意,我假设您正在存储Location对象本身,而不是将其分为经度和纬度。:

if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    long final MAX_TIME = 30000;
    long counter = 0;
    while (location == null) {
        if (counter > MAX_TIME) {
            return False;
        }
        Thread.sleep(1000);
        counter += 1000;
    }
} else {
    return False;
}

编辑:请记住,位置在onLocationUpdate(位置位置)中更新。一个已经更新,然后你有一个不等于null的位置对象。