Android位置管理器返回NULL

时间:2015-04-14 17:28:59

标签: android nullpointerexception latitude-longitude locationmanager

我有一个简单的位置管理器,通常可以工作,但是当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();
        }
    }

3 个答案:

答案 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();
}