getLastKnownLocation在Android中返回null
我知道这已经讨论过很多次了,但是没有任何东西可以帮助我解决getLastKnownLocation返回null的问题 我的活动实现位置侦听器:getLastKnownLocation在Android中返回null,android,Android,我知道这已经讨论过很多次了,但是没有任何东西可以帮助我解决getLastKnownLocation返回null的问题 我的活动实现位置侦听器: public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, 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中):
我当时试过:
@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;
}