Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android在没有RequestLocationUpdate的情况下获取用户位置_Android_Location_Locationmanager - Fatal编程技术网

Android在没有RequestLocationUpdate的情况下获取用户位置

Android在没有RequestLocationUpdate的情况下获取用户位置,android,location,locationmanager,Android,Location,Locationmanager,我想知道用户的位置,但如果gps尚未打开,则不打开gps,这意味着我只想知道用户正在使用地图或类似工具的位置 如果我这样做 locationManager.requestLocationUpdates(); 这就打开了gps 如果我使用 locationManager.getLastKnownLocation(); 这将始终返回相同的位置,即使因为“地图”正在运行而应该有新的位置 有什么想法吗?:) 您可以使用被动\u提供程序,但这仅在API级别8中引入。 一种特殊的位置提供程序,用于在不

我想知道用户的位置,但如果gps尚未打开,则不打开gps,这意味着我只想知道用户正在使用地图或类似工具的位置

如果我这样做

locationManager.requestLocationUpdates();
这就打开了gps

如果我使用

locationManager.getLastKnownLocation();
这将始终返回相同的位置,即使因为“地图”正在运行而应该有新的位置


有什么想法吗?:)

您可以使用
被动\u提供程序
,但这仅在API级别8中引入。

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

通过这种方式,您不直接请求任何位置更新,而是在其他应用程序请求更新时才获得这些更新

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

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

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

试试这个:

让您的
活动
实现
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\u PROVIDER
requestLocationUpdates
一起使用,这将使用WiFi和手机定位,为获得更高的准确性,通过编程方式打开WiFi。定期检查
isGpsStarted
是否为真,然后使用
requestSingleUpdate
切换到
GPS\u提供程序
。同时检查是否需要切换回
网络\u提供程序
,如果
isgpssstarted
再次变为false,则定期更新