getLastKnownLocation使用GPS_PROVIDER和NETWORK_PROVIDER返回NULL

时间:2016-04-20 14:42:22

标签: android android-studio locationmanager

这是我的GPSTracker构造函数类:

    public GPSTracker(Context context) {
    this.mContext = context;
    locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

    Location gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    Location networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}

gpsLocation和networkLocation始终为NULL。

getLastKnowLocation方法不会返回任何位置...即使我确定在午餐活动前几秒(并创建GPSTracker对象)设备有网络位置(我在检查网络位置后禁用地理标记)是可用的)

使用Android Studio在Nexus 5上测试

1 个答案:

答案 0 :(得分:1)

是的,getLastKnownLocation()可能会返回null。 documentation说:

  

返回指示上一个已知位置的数据的位置   从给定的提供者处获得的修复。

     

这可以在不启动提供程序的情况下完成。请注意这一点   位置可能已过时,例如,如果设备已转动   关闭并搬到另一个地方。

     

如果当前禁用了提供程序,则返回null。

Android设备不会自动跟踪其位置。 "最后的已知位置"仅在某些应用程序请求该位置时才可用。因此,您不应期望始终获得getLastKnownLocation()的位置。即使它返回的东西,位置可能不是最新的。 Location对象有一个时间戳,您可以使用getTime()方法读取该时间戳,并使用getAccuracy()方法读取估计的准确度。这些可用于评估可用的位置。

如果您收到空或旧位置,则需要申请新的位置。基本选项只是请求单个位置更新或使用您可以指定的时间间隔进行连续更新。

在任何一种情况下,您的类都需要实现LocationListener接口:

public class GpsTracker implements LocationListener {

    // ...other code goes here...

    @Override
    public void onLocationChanged(Location location) {

        // Do something with 'location' here.   

    }
}

对于单个位置更新,您可以调用[LocationManager.requestSingleUpdate()](http://developer.android.com/reference/android/location/LocationManager.html#requestSingleUpdate(java.lang.String,android.location.LocationListener,android.os.Looper))以及连续更新[LocationManager.requestLocationUpdates()]( http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(java.lang.String,long,float,android.location.LocationListener))。在任何一种情况下,都会有一个小的(或不是那么小的)延迟,当一个位置可用时调用LocationListener.onLocationChanged()回调。

例如,您可以从GPS提供商处请求一次更新,如下所示:

locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, null);

用于GPS提供商最大连续更新。每1秒钟,只有当位置改变了至少1米时,您才能打电话:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this);

然后您可以在文档中看到requestSingleUpdate()的更多变体,另一方面可以看到Google Play服务位置API,但是请不要去那里。您的问题是关于getLastKnownLocation()返回null,而Stack Overflow有几个不同方法请求最新位置的示例。

编辑:这是一个老答案。基本想法仍然有效,但请查看Android文档以获取请求位置更新的现代方法。