打开 GPS 后,LocationManager 仍然无法找到最后一个已知位置
Posted
技术标签:
【中文标题】打开 GPS 后,LocationManager 仍然无法找到最后一个已知位置【英文标题】:LocationManager still cant find last known location after GPS is turned on 【发布时间】:2017-08-29 03:32:28 【问题描述】:我在使用 android 时遇到问题,即使用户打开了他们的位置服务,LocationManager 仍然无法找到用户的位置。
在启动需要使用用户位置的活动之前,我会调用以下代码:
//Menu Activity
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
if(lm.isProviderEnabled(LocationManager.GPS_PROVIDER)
Intent nearby = new Intent(mActivityContext, NearbyActivity.class);
startActivity(nearby);
else
alertNoGps();
打开 GPS 后,可以启动附近的活动,但 LocationManager 仍然无法找到用户最后一个已知位置。我的相关代码是:
//Nearby Activity
try
LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(location != null)
...
else
Toast.makeText ...
catch(SecurityException e)
e.printStackTrace();
我目前正在测试的手机运行的是 Android Marshmallow 6.0.1。如果在应用程序通过 android studio 运行之前 GPS 已经打开,那么我可以毫无问题地获取最后一个已知位置。只有在我运行应用程序之前关闭 GPS 并在应用程序运行时打开它时才会出现问题。 LocationManger 是怎么回事?
编辑:在清单中,我同时拥有精细和粗略的位置权限。由于需要额外的权限检查,我不知道这是否是 API 23 及更高版本的问题,但我不得不想象它们仍然由安全异常处理。
【问题讨论】:
第三行代码if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER))
缺少右括号
【参考方案1】:
检索位置有两种不同的方法,一种是基于网络,另一种是基于 GPS 服务。当然,基于 GPS 服务的定位总是更准确。 根据文档,使用 GPS 服务接收位置可能需要一些时间。在这种情况下,可以使用最后一个已知位置来获取最近可用的位置,方法是使用 getLastKnownLocation() 方法。 在这里,要获取最后一个可用位置,您应该更改 LocationManager.GPS_PROVIDER 到 LocationManager.NETWORK_PROVIDER。
如果您希望接收基于 GPS 服务的准确实时位置,我建议您使用 FusedLocationApi。 你可以在这里找到它 https://developer.android.com/training/location/receive-location-updates.html
干杯..!!
【讨论】:
【参考方案2】:这正是它应该如何工作的。禁用时,Android 会清除提供程序的最后一个已知位置,并将返回 null,直到轮询该提供程序的新点。
在您的情况下,我建议如果您使用 GPS 获得最后一个已知位置的空位置点,只需请求一次更新。
【讨论】:
【参考方案3】:我发现与 Pablo 的回答类似,getLastKnownLocation() 将被清除,因为它是一个相当随意的函数,可以经常返回 null。如果更需要 GPS 坐标,那么在尝试获取 GPS 坐标并使用 requestLocationUpdates() 或 Google 的 FusedLocationApi 之类的东西而不是 getLastKnownLocation() 时,您应该更加有力。
所以现在我将 FusedLocationApi 与我构建的 GoogleApiClient 一起使用:
client = new GoogleApiClient.Builder(mActivityContext)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
客户端连接后,我在 onConnected() 方法覆盖中找到 GPS 位置,如下所示:
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = LocationServices.FusedLocationApi.getLastLocation(client);
这在查找 GPS 坐标方面似乎要可靠得多。
【讨论】:
以上是关于打开 GPS 后,LocationManager 仍然无法找到最后一个已知位置的主要内容,如果未能解决你的问题,请参考以下文章
不适用于 Android Studio-locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this)
我如何知道LocationManager GPS检索的提供者?
LocationManager、GPS 和网络提供商.. 都被触发了吗?
当 gps 关闭时,.isProviderEnabled(LocationManager.NETWORK_PROVIDER) 总是返回 false?