getLastKnownLocation在Android中返回null

getLastKnownLocation在Android中返回null,android,Android,我知道这已经讨论过很多次了,但是没有任何东西可以帮助我解决getLastKnownLocation返回null的问题 我的活动实现位置侦听器: public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, LocationListener

我知道这已经讨论过很多次了,但是没有任何东西可以帮助我解决getLastKnownLocation返回null的问题

我的活动实现位置侦听器:

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中):

我当时试过:

@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;
        }
    }
    }

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

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

有时,当您在建筑中时,GPS提供商无法获取位置,因此在这种情况下,您可以切换到网络提供商获取位置,但与GPS提供商相比,网络提供商的准确度会更低

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

来自文档:

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

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

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

希望这有帮助

编辑:正如我在上面所评论的,在其中放置一个while循环,循环30秒,并每秒检查位置是否不再为null。您需要这种情况至少发生一次,然后才能使用getLastKnownLocation,AFAIK

使用未经测试的小示例进行编辑。最好将所有这些也放在一个异步任务中,即在doInBackground中。注意,我假设您存储的是位置对象本身,而不是将其分为经度和纬度

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。

最好在此处实现一个循环,每隔一秒左右检查一次位置是否不再为null,显然有时间限制(比如30秒).@Middle\u有时有循环的例子吗?@NatalieCarr你做过定位服务吗?@TGMCians不,我不这么认为,对我来说很陌生android@NatalieCarr不幸的是,它只是超时,位置保持为空。请确保首先启用位置提供程序。。我已经更新了帖子。另外,请确保您拥有正确的清单权限(FINE_LOCATION)。我已经编辑了帖子以显示代码,但仍在计时输出否,循环就在那里,直到位置不再为空。从中删除GetLastKnown位置。如果循环超时,则在其他位置获取位置时会遇到问题。与其使用GPS,不如尝试使用网络提供商,因为你更有可能在室内找到一个位置。
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;
}