Android 打开GPS后,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

我在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();
}
我目前测试的手机运行的是安卓棉花糖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)){