【问题标题】:LocationManager still cant find last known location after GPS is turned on打开 GPS 后,LocationManager 仍然无法找到最后一个已知位置
【发布时间】: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)){缺少右括号

标签: android geolocation gps android-location locationmanager


【解决方案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 坐标方面似乎要可靠得多。

      【讨论】:

        猜你喜欢
        • 2013-03-29
        • 1970-01-01
        • 2014-02-22
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        • 2013-04-29
        相关资源
        最近更新 更多