getLastKnownLocation返回null

时间:2013-12-07 06:54:11

标签: android google-maps location

我已经读过一些关于此的问题,但我找不到我需要的答案。

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

getLastKnownLocation(provider, false);

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

为了实现这一目标,还有什么我需要启用的功能吗?我认为WiFi应该足够了吗?

8 个答案:

答案 0 :(得分:166)

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

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;
}

答案 1 :(得分:22)

当你不应该将新的和旧的位置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();
                }
            });
}

答案 2 :(得分:5)

您正尝试从网络提供商处获取缓存位置。您需要等待几分钟才能获得有效的修复。由于网络提供程序的缓存为空,因此显然在那里得到空值。

答案 3 :(得分:1)

尝试一下对我有用:-

LocationManager mLocationManager;
Location myLocation= getLastKnownLocation();

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

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

答案 4 :(得分:0)

添加此代码

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 :(得分:0)

我在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#中的方法名称以大写字母开头。

答案 6 :(得分:0)

我喜欢此解决方案来更新位置:

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是否已打开。

答案 7 :(得分:-4)

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