【问题标题】:getLastKnownLocation returns nullgetLastKnownLocation 返回 null
【发布时间】:2013-12-24 16:10:06
【问题描述】:

我已经阅读了一些关于此的问题,但我并没有找到我需要的答案。

所以,情况是我设置了我的地图,我想获取我当前的 gps 位置。 我检查了我的变量不是 NULL,但我的结果来自:

getLastKnownLocation(provider, false);

虽然给我 null,所以这是我需要帮助的地方。 我添加了 COARSE + FINE 位置的权限。但是我通常会为我的手机禁用各种网络数据,因为我对手机账单中不可预测的数据流费用不太满意。所以我只为这个测试启用并连接了 WiFi。

我还需要启用什么才能使这成为可能吗?我认为 WiFi 应该足够了?

【问题讨论】:

标签: android google-maps location


【解决方案1】:

使用此方法获取最后一个已知位置:

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

private Location getLastKnownLocation() {
    mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
    List<String> providers = mLocationManager.getProviders(true);
    Location bestLocation = null;
    for (String provider : providers) {
        Location l = mLocationManager.getLastKnownLocation(provider);
        if (l == null) {
            continue;
        }
        if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
            // Found best last known location: %s", l);
            bestLocation = l;
        }
    }
    return bestLocation;
}

【讨论】:

  • 原来我一直都是正确的,我只是注意到一个错误,我找到了解决方案。我没有将手机设置为允许使用 Google 位置进行 GPS。嗯是的。无论如何谢谢 =)
  • 很好的实现,非常灵活。谢谢!
  • 像魅力一样工作。谢谢!
  • 在手机中启用定位功能。
  • 问题是关于getLastKnownLocation returns null ...此代码不会改变任何内容...如果对于所有提供者mLocationManager.getLastKnownLocation (因为它可以返回null)它仍然会返回null ... 答案是...抱歉,您无法避免这种情况...如果您真的想要该位置,请不要使用 getLastKnownLocation
【解决方案2】:

您不应该将新旧位置 API 混合在一起。

要获取最后一个已知位置,您只需拨打电话

compile "com.google.android.gms:play-services-location:11.0.1"
mLocationClient.getLastLocation();

一旦连接了定位服务。

了解如何使用新的位置 API

http://developer.android.com/training/location/retrieve-current.html#GetLocation

 private void getLastLocationNewMethod(){
    FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    mFusedLocationClient.getLastLocation()
            .addOnSuccessListener(new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    // GPS location can be null if GPS is switched off
                    if (location != null) {
                        getAddress(location);
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d("MapDemoActivity", "Error trying to get last GPS location");
                    e.printStackTrace();
                }
            });
}

【讨论】:

  • 感谢您指出有新的 API。这应该是公认的答案。
  • 非常感谢,这个 API 更快了,谢谢,我不知道它存在
  • Location 在此处也返回 null。可能是什么原因?
  • 检查位置权限
  • 同意...这应该是公认的答案。谢谢。
【解决方案3】:

您正在尝试从网络提供商处获取缓存位置。您必须等待几分钟才能获得有效的修复。由于网络提供商的缓存是空的,你显然在那里得到了一个空值..

【讨论】:

  • 好的,所以我需要建立缓存吗?当我的应用因此而崩溃时,我该怎么做?
  • 你必须使用位置监听器的 onLocationChanged 方法。获得有效的修复需要时间(几分钟)
  • 好的,谢谢。我会摆弄直到我看到它弹出一个日志=)
  • 即使它没有存储任何东西,我是否需要随身携带?
【解决方案4】:

添加此代码

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
     return;
}

之前函数:

locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener()) 以及函数:locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)

【讨论】:

    【解决方案5】:

    试试这个,它对我很有用:-

    LocationManager mLocationManager;
    Location myLocation = getLastKnownLocation();
    
            private Location getLastKnownLocation() {
                Location oldLoc;
                while (true){
                    oldLoc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    if (oldLoc == null){
                        continue;
                    }
                    else {
                        break;
                    }
                }
                return oldLoc;
            }
    

    您可以使用 NETWORK_PROVIDER 代替 GPS_PROVIDER 以获得更快的结果..

    【讨论】:

      【解决方案6】:

      我在 Xamarin.Android 中遇到了这个问题。

      Location location = locationManager.GetLastKnownLocation(provider); 返回空值。我检查了我的代码并知道我刚刚请求了 ACCESS_COARSE_LOCATION 的权限。我添加了代码来请求 ACCESS_FINE_LOCATION 的权限,现在它没有返回 null。这是我的代码:

      void AskPermissions()
      {
          if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) != (int)Permission.Granted ||
                  CheckSelfPermission(Manifest.Permission.AccessFineLocation) != (int)Permission.Granted)
              RequestPermissions(new string[] { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation }, 0);
          else
              GetLocation();
      }
      
      public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
      {
          if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) == (int)Permission.Granted &&
                  CheckSelfPermission(Manifest.Permission.AccessFineLocation) == (int)Permission.Granted)
              GetLocation();
          else
              Log.Info(tag, "Permission not Granted: Please enter desired Location manually.");
      }
      
      void GetLocation()
      {
          locationManager = (LocationManager)GetSystemService(LocationService);
          provider = locationManager.GetBestProvider(new Criteria(), false);
          Location location = locationManager.GetLastKnownLocation(provider);
          if (location != null)
              Log.Info(tag, "Location Lat: " + location.Latitude + " Lon: " + location.Longitude);
          else
              Log.Info(tag, "Location is null");
      }
      

      万一来自 Xamarin.Android (C#) 的人会发现它很有用。对于 Java 或 Android Studio,代码将与一些小的语法更改类似,例如 GetLastKnownLocation() 将是 getLastKnownLocation(),因为 Java 中的方法名称以小写字母开头,而 C# 中的方法名称以大写字母开头。

      【讨论】:

        【解决方案7】:

        我喜欢这个更新位置的解决方案:

        Update location

        在简历中,添加条件:

        Location myLocation = getLastKnownLocation();
        if (myLocation == null) {
              locationManager.requestLocationUpdates(
              LocationManager.PASSIVE_PROVIDER,
              MIN_TIME_BW_UPDATES,
              MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
              Log.d("GPS", "GPS Enabled");
         }
        

        也许是一些基本的,但请检查 GPS 是否开启。

        【讨论】:

          【解决方案8】:
          private void getLastLocation()
          {
              LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
          
          
              LocationListener locationListener = new LocationListener() {
                  public void onLocationChanged(Location location) {
                      Log.e("location",location.getLatitude()+"");
          
                  }
          
                  public void onStatusChanged(String provider, int status, Bundle extras) {}
          
                  public void onProviderEnabled(String provider) {}
          
                  public void onProviderDisabled(String provider) {}
              };
          
              locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER,locationListener,null);
          
          }
          

          // 这将帮助您在 gps 启用后获取位置

          locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER,locationListener,null);

          【讨论】:

            【解决方案9】:

            替换你的行
            Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
            

            【讨论】:

              猜你喜欢
              • 2013-11-06
              • 2012-05-28
              • 1970-01-01
              • 2015-08-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多