打开GPS后,LocationManager仍然无法找到最后的已知位置

时间:2017-04-04 05:03:26

标签: android geolocation gps android-location locationmanager

我遇到了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及更高版本的问题,因为需要额外的权限检查,但我必须想象它们仍然由安全例外处理。

3 个答案:

答案 0 :(得分:0)

检索位置有两种不同的方法,一种是基于网络,另一种是基于GPS服务。当然,基于GPS服务的位置总是更准确。 根据文档,使用GPS服务接收位置可能需要一些时间。在这种情况下,可以使用最后一个已知位置通过使用getLastKnownLocation()方法获取最近可用的位置。 在这里,要获得最后一个可用位置,您应该更改 LocationManager.GPS_PROVIDER到LocationManager.NETWORK_PROVIDER。

如果您希望收到基于GPS服务的准确实时位置,我建议您使用FusedLocationApi。 你可以在这里找到它 https://developer.android.com/training/location/receive-location-updates.html

干杯.. !!

答案 1 :(得分:0)

这正是它应该如何运作的。 Android在禁用时清除提供程序的最后一个已知位置,并且在为该提供程序轮询新点之前将返回null。

在您的情况下,我建议如果您使用GPS获取最后一个已知位置的空位置点,只需请求单次更新。

答案 2 :(得分:0)

我发现类似于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坐标方面似乎更加可靠。