Android 打开GPS后,LocationManager仍无法找到最后一个已知位置
我在android上遇到了一个问题,即使用户打开了他们的位置服务,LocationManager仍然找不到用户的位置 在启动需要使用用户位置的活动之前,我调用以下命令:Android 打开GPS后,LocationManager仍无法找到最后一个已知位置,android,geolocation,gps,android-location,locationmanager,Android,Geolocation,Gps,Android Location,Locationmanager,我在android上遇到了一个问题,即使用户打开了他们的位置服务,LocationManager仍然找不到用户的位置 在启动需要使用用户位置的活动之前,我调用以下命令: //Menu Activity LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); if(lm.isProviderEnabled(LocationManager.GPS_PROVIDER){ Intent n
//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();
}
我目前测试的手机运行的是安卓棉花糖6.0.1。如果GPS在应用程序通过android studio运行之前已经打开,那么我获取最后一个已知位置没有问题。只有当GPS在我运行应用程序之前关闭,并在应用程序运行时打开时,我才会遇到问题。那么LocationManager是什么原因造成的呢
编辑:在清单中,我同时拥有精细和粗略的位置权限。由于需要额外的权限检查,我不知道这是否是API 23及以上版本的问题,但我必须想象它们仍然由安全异常处理。有两种不同的方法检索位置,一种是基于网络,另一种是基于GPS服务。当然,基于GPS服务的定位总是更准确。 根据文件,使用GPS服务接收位置可能需要一些时间。在这种情况下,可以使用getLastKnownLocation()方法使用最后一个已知位置来获取最近可用的位置。 在这里,要获取最后一个可用位置,您应该更改 LocationManager.GPS\提供程序到LocationManager.NETWORK\提供程序 如果您希望接收基于GPS服务的准确实时位置,我建议您使用FusedLocationApi。 你可以在这里找到它
干杯 检索位置有两种不同的方法,一种是基于网络,另一种是基于GPS服务。当然,基于GPS服务的定位总是更准确。 根据文件,使用GPS服务接收位置可能需要一些时间。在这种情况下,可以使用getLastKnownLocation()方法使用最后一个已知位置来获取最近可用的位置。 在这里,要获取最后一个可用位置,您应该更改 LocationManager.GPS\提供程序到LocationManager.NETWORK\提供程序 如果您希望接收基于GPS服务的准确实时位置,我建议您使用FusedLocationApi。 你可以在这里找到它
干杯 这正是它应该如何工作的。当提供者被禁用时,Android将清除该提供者的最后一个已知位置,并将返回null,直到轮询该提供者的新点
在您的情况下,我建议如果您使用GPS获得最后一个已知位置的空位置点,只需请求一次更新。这正是它应该如何工作的。当提供者被禁用时,Android将清除该提供者的最后一个已知位置,并将返回null,直到轮询该提供者的新点
在您的情况下,我建议,如果您使用GPS获取最后一个已知位置的空位置点,只需请求一次更新。我发现,与Pablo的回答类似,getLastKnownLocation()将被清除,因为它是一个相当随意的函数,可以经常返回空值。如果对GPS坐标的要求更高,那么在尝试获取GPS坐标时,您应该更努力地使用RequestLocationUpdate()或Google的FusedLocationApi,而不是getLastKnownLocation() 因此,现在我将FusedLocationApi与GoogleAppClient一起使用,我使用:
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坐标时,这似乎更可靠。我发现,与Pablo的答案类似,getLastKnownLocation()将被清除,因为它是一个相当随意的函数,因此经常返回null。如果对GPS坐标的要求更高,那么在尝试获取GPS坐标时,您应该更努力地使用RequestLocationUpdate()或Google的FusedLocationApi,而不是getLastKnownLocation() 因此,现在我将FusedLocationApi与GoogleAppClient一起使用,我使用:
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坐标时更加可靠。如果(lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){您在第三行代码中缺少一个右括号
if(lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){