getLastKnownLocation повертає нуль


84

Я прочитав декілька запитань з цього приводу, але не знайшов відповіді, яка мені потрібна.

Отже, справа в тому, що у мене налаштована карта, і я хочу отримати своє поточне місцезнаходження GPS. Я перевірив, що мої змінні не NULL, але все ж мій результат від:

getLastKnownLocation(provider, false);

Хоча мені нуль, тож саме тут мені потрібна допомога. Я додав дозволи на розташування COARSE + FINE. Але зазвичай у мене на телефоні відключені всі види мережевих даних, оскільки я не дуже задоволений непередбачуваними витратами на потоки даних у моєму телефонному рахунку. Отже, для цього тесту у мене включений і підключений лише WiFi.

Чи є щось ще, що ПОТРІБНО ввімкнути, щоб це стало можливим? Я думаю, WiFi повинен бути достатнім?


ви змішуєте нові API і старі для getLastLocation слідувати цій stackoverflow.com/a/48033659/4997704
Binesh Kumar

Цю відповідь варто прочитати: stackoverflow.com/a/38794291/5319831
Мохд

Відповіді:


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

17
питання стосується getLastKnownLocation returns null... цей код нічого не змінить ... якщо для всіх постачальників mLocationManager.getLastKnownLocation (оскільки він може повернути null) він все одно поверне null ... відповідь ... вибачте, ви не можете цього уникнути ... якщо ви дійсно хочете місцезнаходження не використовує getLastKnownLocation
Селвін

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. Це має бути прийнятою відповіддю.
Вайолет Жираф

велике спасибі, цей API набагато швидший, дякую, я не знав, що він існує
Табіш

1
Розташування також повертає нуль. Що може бути причиною?
JollyRoger

1
перевірити дозвіл на місцезнаходження
Бінеш Кумар,

Згоден ... це повинна бути прийнята відповідь. Дякую.
Nicola Salvaro

7

Ви намагаєтесь отримати кешоване місце від постачальника мережі. Вам доведеться почекати кілька хвилин, поки ви отримаєте дійсне виправлення. Оскільки кеш мережі постачальника порожній, ви, очевидно, отримуєте там нуль.


Гаразд, значить, мені потрібно створити кеш? Як я можу це зробити, коли моя програма через це аварійно завершує роботу?
Aleksander Fimreite

1
Ви повинні використовувати метод onLocationChanged слухача розташування. Отримання дійсного виправлення вимагає часу (кілька хвилин)
Сагар Маяд,

Добре, дякую. Я возитимусь, поки не побачу, як це вискакує журнал =)
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 код буде схожий з деякими незначними змінами синтаксису, як, наприклад 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.