getLastKnownLocation返回null


83

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

因此,情况是我已经设置了地图,并且想要获取当前的GPS位置。我检查过我的变量不是NULL,但是我的结果是:

getLastKnownLocation(provider, false);

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

为了使之成为可能,我还需要启用更多功能吗?我认为WiFi应该足够了吗?


您正在为getLastLocation混合新旧api,请遵循以下 stackoverflow.com/a/48033659/4997704
Binesh Kumar

这个答案值得一读:stackoverflow.com/a/38794291/5319831
Mohd Naved

Answers:


194

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

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
原来,我一直都正确无误,只是发现了一个错误,找到了解决方案。我没有将手机设置为允许Google Position for GPS。是的。
仍然

1
伟大的实现,非常灵活。谢谢!
AlexVPerl

2
奇迹般有效。谢谢!
erol yeniaras 2015年

1
启用手机中的位置。
TharakaNirmana '16

16
问题是关于getLastKnownLocation returns null...此代码将什么都不会改变...如果对于所有提供程序mLocationManager.getLastKnownLocation (因为它可以返回null), 它仍将返回null ...答案是...对不起,您无法避免...如果您确实想要该位置不使用getLastKnownLocation
Selvin

32

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

4
感谢您指出有新的API。这应该是公认的答案。
紫罗兰色长颈鹿

非常感谢您,这个API更快了,谢谢,我不知道它的存在
塔比什(Tabish)

1
位置在这里也返回null。可能是什么原因?
JollyRoger

1
检查位置权限
Binesh Kumar

同意...这应该是公认的答案。谢谢。
尼古拉·萨瓦罗

6

您正在尝试从网络提供商获取缓存的位置。您必须等待几分钟,直到获得有效的修复。由于网络提供商的缓存为空,因此您显然在其中为空。


好了,所以我需要建立缓存吗?当我的应用程序因此而崩溃时,该怎么办?
Aleksander Fimreite

1
您必须使用位置侦听器的onLocationChanged方法。获得有效的修复程序需要时间(几分钟)
Sagar Maiyad 2013年

好的,谢谢。我会一直摆弄直到我看到它弹出一个日志=)
Aleksander Fimreite

3
即使它什么也没有存储,我是否还需要四处走动?
Aleksander Fimreite

1

添加此代码

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)


1

试试这个对我有用:-

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以获得更快的结果。


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中的代码将是类似withs一些小的语法更改,如GetLastKnownLocation()getLastKnownLocation()在Java方法的名称以小写字母开始,而在C#方法名以大写字母开头。


0

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

更新位置

在简历中,添加条件:

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.