Przeczytałem kilka pytań na ten temat, ale nie znalazłem odpowiedzi, której potrzebowałem.
Tak więc sprawa jest taka, że mam skonfigurowaną mapę i chcę pobrać aktualną lokalizację GPS. Sprawdziłem, czy moje zmienne nie są NULL, ale mój wynik z:
getLastKnownLocation(provider, false);
Daje mi jednak zero, więc tutaj potrzebuję pomocy. Dodałem uprawnienia do lokalizacji COARSE + FINE. Ale zwykle mam wyłączone wszystkie rodzaje danych sieciowych w moim telefonie, ponieważ nie jestem zadowolony z nieprzewidywalnych wydatków na przepływ danych na moim rachunku telefonicznym. Więc mam tylko WiFi włączone i podłączone do tego testu.
Czy jest coś więcej, co MUSZĘ włączyć, aby było to możliwe? Myślę, że WiFi powinno być wystarczające?
android
google-maps
location
Aleksander Fimreite
źródło
źródło
Odpowiedzi:
Użyj tej metody, aby uzyskać ostatnią znaną lokalizację:
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; }
źródło
getLastKnownLocation returns null
... ten kod nic nie zmieni ... jeśli dla wszystkich dostawcówmLocationManager.getLastKnownLocation
(ponieważ może zwrócić wartość null) nadal zwróci wartość null ... odpowiedź brzmi ... przepraszam, nie możesz tego uniknąć ... jeśli naprawdę chcesz lokalizacja nie używa getLastKnownLocationmieszasz razem nowe i stare interfejsy API lokalizacji, a nie powinieneś.
aby uzyskać ostatnią znaną lokalizację, wystarczy zadzwonić
compile "com.google.android.gms:play-services-location:11.0.1" mLocationClient.getLastLocation();
po podłączeniu usługi lokalizacyjnej.
przeczytaj, jak korzystać z nowego interfejsu API lokalizacji
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(); } }); }
źródło
Próbujesz uzyskać buforowaną lokalizację od dostawcy sieci. Musisz poczekać kilka minut, aż otrzymasz prawidłową poprawkę. Ponieważ pamięć podręczna dostawcy sieci jest pusta, oczywiście otrzymujesz tam wartość null.
źródło
Dodaj ten kod
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; }
przed funkcją:
locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener())
a także funkcję:locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)
źródło
Spróbuj tego, to działa dobrze dla mnie: -
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; }
Możesz użyć NETWORK_PROVIDER zamiast GPS_PROVIDER, aby uzyskać szybsze wyniki.
źródło
Miałem ten problem w Xamarin.Android.
Location location = locationManager.GetLastKnownLocation(provider);
zwracał wartość null. Sprawdziłem swój kod i dowiedziałem się, że właśnie poprosiłem o pozwolenie na ACCESS_COARSE_LOCATION. Dodałem kod, aby poprosić o pozwolenie na ACCESS_FINE_LOCATION i teraz nie zwracał null. Oto mój kod: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"); }
Na wypadek, gdyby ktoś pochodzący z platformy Xamarin.Android (C #) uznałby to za przydatne. Java lub Android Studio kod byłby podobny withs niektóre drobne Składnia zmienia jak
GetLastKnownLocation()
będziegetLastKnownLocation()
jako nazwy metod w Javie zacząć od małych liter podczas gdy w C # metoda nazwy zaczynają się literami wielkimi literami.źródło
Podobało mi się to rozwiązanie do aktualizacji lokalizacji:
Zaktualizuj lokalizację
W wznowieniu dodaj warunek:
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"); }
I może jest trochę podstawowe, ale sprawdź, czy GPS jest włączony.
źródło
Zamień linię na
źródło