我有一个简单的位置管理器,通常可以工作,但是当Android设备关闭然后重新打开时,即使我请求更新,android位置管理器也会返回Null。我知道getLastKnownLocation可以返回null,但我相信我在我的代码中处理它。所有建议都赞赏。
显然lon = location.getLongitude();正在崩溃。
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location == null)
{
// request location update!!
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
lon = location.getLongitude();
lat = location.getLatitude();
}
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//Get last known location
location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//Update if not null
if (location != null)
{
lat = location.getLatitude();
lon = location.getLongitude();
}
//Request update as location manager can return null otherwise
else
{
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
lat = location.getLatitude();
lon = location.getLongitude();
}
}
答案 0 :(得分:2)
即使我请求更新,android位置管理器也会返回Null
正确。请求Android 启动的更新请求尝试找出设备的位置。这需要一段时间。在此期间,getLastKnownLocation()
可以很好地返回null
。
getLastKnownLocation()
通常仅在您想知道位置时才有用,但如果该数据尚未就绪,您可以在没有它的情况下继续前进。如果您需要该位置,getLastKnownLocation()
会返回null
,您将等到Location
使用,直到调用onLocationChanged()
为止。请注意,onLocationChanged()
可能永远不会被调用,因为不要求用户启用任何位置提供程序,并且不要求设备能够实际获得位置修复。
答案 1 :(得分:1)
唯一的问题是我在Android手机上启用了飞行模式。我现在有点尴尬!
答案 2 :(得分:1)
我在飞机模式上看到了您的回复,但是您的代码却有不良做法。
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location == null)
{
// request location update!!
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
lon = location.getLongitude();
lat = location.getLatitude();
}
您已在此处看到该位置为null,表示您无法访问内部属性,例如纬度和经度。在任何情况下,位置请求都是异步的,它们需要很短的时间才能启动。
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//Get last known location
location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//Update if not null
if (location != null)
{
lat = location.getLatitude();
lon = location.getLongitude();
}
//Request update as location manager can return null otherwise
else
{
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
lat = location.getLatitude();
lon = location.getLongitude();
}
}
即使在这里,在"其他" clouse,您无法立即访问该位置。这意味着您无法立即获取该位置(它将只保留最后一个值)。
你应该做的是实现onLocationChanges方法并以异步方式处理那里的位置。像这样:
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null)
{
lat = location.getLatitude();
lon = location.getLongitude();
}
else
{
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
}
@Override
public void onLocationChanged(Location location) {
lat = location.getLatitude();
lon = location.getLongitude();
}