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