Uzyskaj aktualną lokalizację użytkownika w systemie Android bez korzystania z GPS lub internetu


91

Czy możliwe jest uzyskanie aktualnej lokalizacji użytkownika bez korzystania z GPS lub internetu? Mam na myśli pomoc operatora sieci komórkowej.


1
Czy zaakceptowana odpowiedź działa idealnie? U mnie to nie działa ... !!!
Samitha Chathuranga

3
Niestety przyjęta odpowiedź jest błędna :-( Niesamowite, że otrzymała 28 głosów pozytywnych, mimo że nie odpowiada poprawnie na pytanie!
David Wasser

@DavidWasser Doceń cenne komentarze. Czy myślisz, że tak naprawdę nie ma żadnej metody uzyskania szczegółów lokalizacji bez korzystania z Internetu lub GPS? (z wyjątkiem korzystania z wiadomości
sieciowych

2
@SamithaChathuranga Pomyśl o tym: jeśli nie masz GPS i nie masz Internetu, skąd masz zamiar uzyskać te informacje? Możesz uzyskać informacje o identyfikatorze komórki z sieci. To daje tylko ID. Potrzebny byłby wówczas sposób odwzorowania identyfikatora na rzeczywistą współrzędną lub nazwę. Zawsze możesz zbudować własną bazę danych identyfikatorów komórek i dołączyć ją do swojej aplikacji, ale zebranie wszystkich tych danych wymagałoby ogromnego wysiłku, a mapowanie nie jest statyczne: zmienia się, gdy operatorzy telefonii komórkowej instalują nowe wieże komórkowe i przenumerują ich sieci. Zasadniczo praktyczna odpowiedź brzmi „nie”.
David Wasser

@DavidWasser Dzięki za odpowiedź. Miałem też duże zdziwienie, jak uzyskać lokalizację bez internetu i GPS. Mówi się, że jest to możliwe, uwzględniając przepełnienie stosu na wielu forach. Dlatego pomyślałem, że to będzie możliwe. Wygląda na to, że wielu ludzi też jest w błędzie.
Samitha Chathuranga

Odpowiedzi:


87

To, co chcesz zrobić, to uzyskać pozycję za pomocą LocationManager.NETWORK_PROVIDERzamiast LocationManager.GPS_PROVIDER. NETWORK_PROVIDERRozwiąże na GSM lub Wi-Fi, który kiedykolwiek dostępne. Oczywiście przy wyłączonym Wi-Fi będzie używany GSM. Należy pamiętać, że dokładność korzystania z sieci komórkowej wynosi zasadniczo 500 m.

http://developer.android.com/guide/topics/location/obtaining-user-location.html zawiera naprawdę świetne informacje i przykładowy kod.

Gdy skończysz z większością kodu OnCreate(), dodaj to:

// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      // Called when a new location is found by the network location provider.
      makeUseOfNewLocation(location);
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };

// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

Możesz również zlecić swoje działanie zaimplementować LocationListenerklasę, a tym samym zaimplementować onLocationChanged()w swoim działaniu.


1
pamiętaj, aby sprawdzić strategie dotyczące oszczędzania baterii. Ponadto, w zależności od aplikacji, PASSIVE_PROVIDER i użycie getLastKnownLocation może zaoszczędzić dużo pracy i baterii, jeśli inne aplikacje używają anten.
Ian,

2
Hej @Ian, użyłem tego samego kodu .. Ale w moim przypadku metoda detektora onLocationChanged () nigdy nie została wywołana. Użyłem requestLocationUpdates w metodzie onResume (). nadal nigdy nie dzwonił ... Więc co tam było?
MS.

2
Hej @lan lub inna osoba, która może mi pomóc, zaimplementowałem powyższy kod, ale metoda onLocationChanged nie jest wywoływana. Jaki byłby problem, czy ktoś może mi pomóc, proszę .....
pareshm

1
Czy można uzyskać współrzędne bez internetu? W niektórych urządzeniach wydaje się nie działać.
iammilind

20
Ta odpowiedź jest nieprawidłowa :-( OP zapytał, jak uzyskać lokalizację bez korzystania z połączenia internetowego. LOCATION_PROVIDER musi korzystać z Internetu, aby uzyskać dostęp do serwerów, aby przekształcić zbiór adresów Cell-ID i WIFI MAC we współrzędne geograficzne. Jeśli nie masz internetu nie będziesz w stanie uzyskać współrzędnych. Jeśli powiesz mi, że to działa dla Ciebie, oznacza to, że albo masz połączenie z Internetem, albo masz połączenie z Internetem (API lokalizacji pobiera i zapisuje w pamięci podręcznej pewne informacje o okolicy) lub informacje o lokalizacji są stare (i przez to niedokładne).
David Wasser

16

Otrzymując ten getLastKnownLocation, nie inicjujesz naprawy samodzielnie.

Należy pamiętać, że może to uruchomić dostawcę, ale jeśli użytkownik kiedykolwiek wcześniej uzyskał lokalizację, nie sądzę, aby tak się stało. Dokumentacja nie jest w tym zbyt jasna.

Zgodnie z dokumentacją getLastKnownLocation:

Zwraca lokalizację wskazującą dane z ostatniej znanej poprawki lokalizacji uzyskanej od danego dostawcy. Można to zrobić bez uruchamiania dostawcy.

Oto krótki fragment:

import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import java.util.List;

public class UtilLocation {
    public static Location getLastKnownLoaction(boolean enabledProvidersOnly, Context context){
        LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        Location utilLocation = null;
        List<String> providers = manager.getProviders(enabledProvidersOnly);
        for(String provider : providers){

            utilLocation = manager.getLastKnownLocation(provider);
            if(utilLocation != null) return utilLocation;
        }
        return null;
    }
}

Musisz także dodać nowe uprawnienia do AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Myślę o tym, czy można uzyskać aktualną lokalizację za pomocą sieci komórkowej
Prabhu M

Musisz przeczytać dokumenty. Dowiedz się różnice między PASSIVE_PROVIDER, NETWORK_PROVIDERi GPS_PROVIDER.
hwrdprkns

1
Chociaż jest to idealne rozwiązanie, sprawdziłbym czas ostatniej lokalizacji za pomocą getTime (). Wtedy wystarczy zdecydować, ile lat na to pozwolisz. Jeśli jest za stara, zdobądź nową pozycję za pomocą mojego postu.
Ian

1
@Ian Jak zdobyć nową lub świeżą lokalizację?
Archie.bpgc

5
Czy możemy uzyskać lokalizację, jeśli GPS jest wyłączony
Prasad

4
boolean gps_enabled = false;
boolean network_enabled = false;

LocationManager lm = (LocationManager) mCtx
                .getSystemService(Context.LOCATION_SERVICE);

gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

Location net_loc = null, gps_loc = null, finalLoc = null;

if (gps_enabled)
    gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (network_enabled)
    net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

if (gps_loc != null && net_loc != null) {

    //smaller the number more accurate result will
    if (gps_loc.getAccuracy() > net_loc.getAccuracy()) 
        finalLoc = net_loc;
    else
        finalLoc = gps_loc;

        // I used this just to get an idea (if both avail, its upto you which you want to take as I've taken location with more accuracy)

} else {

    if (gps_loc != null) {
        finalLoc = gps_loc;
    } else if (net_loc != null) {
        finalLoc = net_loc;
    }
}

4

Nie, obecnie nie można uzyskać lokalizacji bez korzystania z GPS lub internetu.

Techniki lokalizacji oparte na Wi-Fi, komórkowej lub Bluetooth działają z pomocą dużej bazy danych, która jest stale aktualizowana. Urządzenie wyszukuje identyfikatory nadajników, a następnie wysyła je w zapytaniu przez Internet do usługi takiej jak Google, Apple lub Skyhook. Ta usługa odpowiada lokalizacją na podstawie poprzednich ankiet bezprzewodowych ze znanych lokalizacji. Bez dostępu do Internetu musisz mieć lokalną kopię takiej bazy danych i aktualizować ją. W przypadku użytku globalnego jest to bardzo niepraktyczne.

Teoretycznie operator telefonii komórkowej mógłby zapewnić tylko lokalną usługę transmisji danych, ale bez dostępu do internetu, a następnie odpowiadać na zapytania o lokalizację z urządzeń mobilnych. Operatorzy komórkowi tego nie robią; nikt nie chce płacić za tego rodzaju ograniczony dostęp do danych. Jeśli masz usługę transmisji danych za pośrednictwem swojego operatora komórkowego, masz dostęp do Internetu.

Krótko mówiąc, użycie LocationManager.NETWORK_PROVIDER lub android.hardware.location.network do uzyskania lokalizacji wymaga korzystania z Internetu.

Korzystanie z ostatniej znanej pozycji wymaga posiadania GPS lub dostępu do Internetu bardzo niedawno. Jeśli dopiero co miałeś Internet, prawdopodobnie możesz dostosować swoją pozycję lub ustawienia, aby ponownie uzyskać dostęp do Internetu. Jeśli Twoje urządzenie nie miało dostępu do GPS lub internetu, funkcja ostatniej znanej pozycji nie pomoże.

Bez GPS lub internetu możesz:

  1. Rób zdjęcia nocnego nieba i wykorzystaj aktualny czas do oszacowania swojej lokalizacji na podstawie mapy gwiazd. Prawdopodobnie wymagałoby to dodatkowego sprzętu, aby zapewnić prawidłowe zmierzenie kątów na zdjęciach.
  2. Użyj akcelerometru, aby śledzić lokalizację, zaczynając od znanej pozycji. Nagromadzenie błędów w tego rodzaju podejściu sprawia, że ​​jest ono niepraktyczne w większości sytuacji.




Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.