getLastKnownLocation возвращает null


85

Я читал несколько вопросов по этому поводу, но не нашел нужного ответа.

Итак, дело в том, что у меня настроена карта, и я хочу получить свое текущее местоположение по GPS. Я проверил, что мои переменные не равны NULL, но все же мой результат:

getLastKnownLocation(provider, false);

Но дает мне null, так что здесь мне нужна помощь. Я добавил разрешения для местоположения COARSE + FINE. Но у меня обычно отключены все виды сетевых данных для моего телефона, потому что я не очень доволен непредсказуемыми расходами на поток данных в моем счете за телефон. Поэтому для этого теста у меня был включен и подключен только Wi-Fi.

Есть ли что-то еще, что мне НЕОБХОДИМО включить, чтобы это стало возможным? Я думаю, Wi-Fi должно хватить?


вы смешиваете новый api и старый для getLastLocation, следуйте этому stackoverflow.com/a/48033659/4997704
Бинеш Кумар

Этот ответ стоит прочитать: stackoverflow.com/a/38794291/5319831
Mohd Naved

Ответы:


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 для GPS. Так что да. В любом случае спасибо =)
Александр Фимрейте

1
Отличная реализация, очень гибкая. Благодаря!
AlexVPerl

2
Работает как шарм. Благодаря!
erol yeniaras

1
включить местоположение в телефоне.
TharakaNirmana 04

18
вопрос о getLastKnownLocation returns null... этот код ничего не изменит ... если для всех поставщиков mLocationManager.getLastKnownLocation (поскольку он может возвращать null) он все равно будет возвращать null ... ответ ... извините, вы не можете этого избежать ... если вы действительно хотите местоположение не используется getLastKnownLocation
Selvin

32

вы смешиваете вместе новый и старый 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. Это должен быть принятый ответ.
Violet Giraffe

Большое спасибо, этот API намного быстрее, спасибо, чувак, я не знал, что он существует
Табиш

2
Location здесь также возвращает null. В чем может быть причина?
JollyRoger 03

1
проверить разрешение на местоположение
Бинеш Кумар

Согласен ... это должен быть принятый ответ. Спасибо.
Никола Сальваро

7

Вы пытаетесь получить кэшированное местоположение от сетевого провайдера. Вы должны подождать несколько минут, пока не получите действительное исправление. Поскольку кеш сетевого провайдера пуст, вы, очевидно, получаете там ноль.


Хорошо, мне нужно накопить мой кеш? Как я могу это сделать, когда мое приложение вылетает из-за этого?
Александр Фимрейте 07

1
вы должны использовать метод onLocationChanged прослушивателя местоположения. Получение действительного исправления требует времени (несколько минут)
Сагар Майяд

Хорошо, спасибо. Я буду возиться, пока не увижу, как он выскакивает =)
Александр Фимрейте

3
Нужно ли мне перемещаться с ним, даже если в нем ничего нет?
Александр Фимрейте

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 код будет аналогичным с некоторыми незначительными изменениями синтаксиса, например 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 включен.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.