getLastKnownLocation 不是实际位置
Posted
技术标签:
【中文标题】getLastKnownLocation 不是实际位置【英文标题】:getLastKnownLocation is not the actual location 【发布时间】:2013-05-30 00:27:25 【问题描述】:在我的应用程序中,我有一个 AlarmManager
设置为每隔一段时间运行一个 IntentService
以向我的服务器发出 WebService 调用,发送您当前的位置
当警报启动时,我还会启动一个 Service
,它有一个 LocationManager
来跟踪本地位置。
当我对我的服务器进行网络服务调用时,我使用
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
String provider = locationManager.getBestProvider(criteria, true);
Location lastKnownLocation = locationManager.getLastKnownLocation(provider);
因为我现在只需要该位置,并且下次再次调用 Web 服务时,我只需再次获取它。但是,即使我在后台运行了一项服务,该服务使用GPS
并获得正确的位置,调用
locationManager.getLastKnownLocation(provider);
当我创建 Web 服务以获取位置时,它给了我一个陈旧的位置,而不是当前的位置。现在我想,因为我已经在另一个服务中运行了一个 locationmanager,所以每次调用 onLocationChanged
时,getLastKnownLocation
都会更新到正确的位置,但显然情况并非如此,这对我来说毫无意义。
所以我现在的问题是我如何才能在我的IntentService
中获得正确的位置,因为我不能依赖getLastKnownLocation
我不需要每次更改位置时都知道位置我只需要知道在我进行 Web 服务调用时它是什么,因此启动另一个位置管理器似乎不是一个好主意。我能想到的解决这个问题的唯一方法是将我的其他服务中的位置存储在SharedPreferences
中,然后抓取其中的任何内容,但这似乎有点老套,我不喜欢老套。
有什么想法吗?
【问题讨论】:
只是一个建议:如果可以的话,您应该使用 FusedLocationProvider。 developer.android.com/google/play-services/location.html @hwrdprkns 我试过了,但是 IntentService 在onConnect
被调用之前结束,抛出一个IllegalStateExcepion
说我需要在尝试调用onConnect
之前调用onConnect
所以基本上服务正在获取在我到达之前就被摧毁了
【参考方案1】:
只有当任何应用程序请求位置时(应用程序可以是您的或设备上的任何其他应用程序),Android 的最后一个已知位置才会更新。您必须实现位置侦听器,然后使用 locationManger.requestLocationUpdates(provider, minTime, minDistance, locationListener) 来请求位置更新。 android 系统将根据您的请求获取位置更新,并为所有应用设置 lastKnownLocation 以供使用。
我能想到没有设置 lastKnownLocation 的唯一原因是 android 系统无法获取位置。检查请求位置更新的提供程序是否已启用。此外,您还可以使用 Passive Provider 捎带其他应用程序的位置请求,并仅在特定超时期间没有更新时才主动寻找位置(这种方法应该比不断尝试获取成本高昂的位置更新更好)。
【讨论】:
我知道我正在通过LocationListener
获取位置的其他服务中获取位置更新,因为我可以进入存储位置的数据库并查看所有不同地点
hmm... 如果收到位置更新,那么 lastKnownLocation 应该已经更新。奇怪....自己没遇到过这样的问题。
今天又玩了一点,确实是 locationmanager 没有修复我的位置。这是零星的,但当我得到修复时,getLastKnownLocation
确实返回了正确的位置
您将标准设置为正常。所以我相信locationmanager.getbestprovider 会尝试获取gps 固定的位置。 Gps 需要一些时间来修复。可能是您没有给它足够的时间来修复(在您的其他服务中)。
我启动服务并让它运行,IntentService 处于轮询间隔(每 30 秒)。我正在开车,看到它经常失去 GPS 锁定,因为在通知栏中它说正在搜索 GPS以上是关于getLastKnownLocation 不是实际位置的主要内容,如果未能解决你的问题,请参考以下文章
LocationManager 的 getLastKnownLocation 有多可靠,多久更新一次?
locationManager.getLastKnownLocation() 返回 null
locationManager.getLastKnownLocation() 返回 null
调用 getLastKnownLocation 时出现 SecurityException