【问题标题】:getLastKnownLocation return NULL using GPS_PROVIDER and NETWORK_PROVIDERgetLastKnownLocation 使用 GPS_PROVIDER 和 NETWORK_PROVIDER 返回 NULL
【发布时间】:2016-04-20 14:42:22
【问题描述】:

这是我的 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 上测试

【问题讨论】:

  • 问题是什么?

标签: android android-studio locationmanager


【解决方案1】:

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

返回一个 Location 指示来自最后一个已知位置的数据 从给定的提供程序获得的修复。

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

如果提供者当前被禁用,则返回 null。

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

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

在任何一种情况下,您的类都需要实现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()](@987654324 @、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 文档以了解请求位置更新的现代方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2017-10-06
    • 2013-11-06
    • 2013-12-24
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多