Android获取没有requestLocationUpdates的用户位置

时间:2012-06-22 15:37:51

标签: android location locationmanager

我想知道用户的位置,但是如果没有打开gps就没有打开gps,意味着我只想获取位置,无论如何用户正在使用地图或类似物。

如果我这样做

locationManager.requestLocationUpdates();

打开gps。

如果我使用

locationManager.getLastKnownLocation();

这将返回相同的位置,即使应该有新的,因为地图正在运行。

任何人的想法? :)

2 个答案:

答案 0 :(得分:0)

您可以使用PASSIVE_PROVIDER,但这仅在API级别8中引入。 From Android Documentation for LocationManager

  

用于接收位置而不实际启动位置修复的特殊位置提供程序。当其他应用程序或服务请求时,此提供程序可用于被动地接收位置更新,而无需自己实际请求位置。此提供程序将返回其他提供程序生成的位置。您可以查询getProvider()方法以确定位置更新的来源。需要权限android.permission.ACCESS_FINE_LOCATION,但如果未启用GPS,则此提供程序可能只返回粗略修复。

这样您就不会直接请求任何位置更新,只有在其他应用程序请求更新时才会获得这些更新。

至于getLastKnownLocation()再次引用Android文档:

  

返回一个位置,指示从给定提供程序获取的上次已知位置修复的数据。这可以在不启动提供程序的情况下完成。请注意,此位置可能已过期,例如,如果设备已关闭并移至其他位置。   如果当前禁用了提供程序,则返回null。

因此,如果您使用getLastKnownLocation一遍又一遍地获取相同的位置,则可能是该提供程序被禁用,您只需获取函数名称所指示的内容,即设备的最后已知位置。阅读上面的引用或参阅Android文档以获取更多详细信息。

答案 1 :(得分:0)

试试这个:

让您Activity实施GpsStatus.Listener并使用

boolean isGpsStarted= false;
public void onGpsStatusChanged(int event) {
    switch (event) {
        case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
            break;
        case GpsStatus.GPS_EVENT_FIRST_FIX:                               
            break;
        case GpsStatus.GPS_EVENT_STARTED:
            isGpsStarted = true;
            break;
        case GpsStatus.GPS_EVENT_STOPPED:
            isGpsStarted = false;
            break;
    }
}

NETWORK_PROVIDERrequestLocationUpdates一起使用,这将使用WiFi和单元格定位,并以更好的准确性以编程方式打开wifi。定期检查isGpsStarted是否为真,然后使用GPS_PROVIDER切换到requestSingleUpdate。同时检查是否需要切换回NETWORK_PROVIDER,如果isGpsStarted再次变为假,则定期更新。