繁体   English   中英

getLastKnownLocation使用GPS_PROVIDER和NETWORK_PROVIDER返回NULL

[英]getLastKnownLocation return NULL using GPS_PROVIDER and NETWORK_PROVIDER

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

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

返回一个位置,指示从给定提供程序获取的上次已知位置修复的数据。

这可以在不启动提供程序的情况下完成。 请注意,此位置可能已过期,例如,如果设备已关闭并移至其他位置。

如果当前禁用了提供程序,则返回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文档以获取请求位置更新的现代方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM