Czy możliwe jest uzyskanie aktualnej lokalizacji użytkownika bez korzystania z GPS lub internetu? Mam na myśli pomoc operatora sieci komórkowej.
Czy możliwe jest uzyskanie aktualnej lokalizacji użytkownika bez korzystania z GPS lub internetu? Mam na myśli pomoc operatora sieci komórkowej.
Odpowiedzi:
To, co chcesz zrobić, to uzyskać pozycję za pomocą LocationManager.NETWORK_PROVIDER
zamiast LocationManager.GPS_PROVIDER
. NETWORK_PROVIDER
Rozwiąż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ć LocationListener
klasę, a tym samym zaimplementować onLocationChanged()
w swoim działaniu.
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" />
PASSIVE_PROVIDER
, NETWORK_PROVIDER
i GPS_PROVIDER
.
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;
}
}
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:
Tutaj można uzyskać aktualną lokalizację użytkownika bez użycia GPS i dostawcy sieci.
1. Convert cellLocation to real location (Latitude and Longitude), using "http://www.google.com/glm/mmap"
Czy spojrzałeś na Google Maps Geolocation Api? Geolokalizacja Map Google
To proste RestApi, wystarczy POST żądanie, usługa zwróci lokalizację z dokładnością w metrach.
Wydaje się, że możliwe jest śledzenie smartfona bez użycia GPS.
Źródła:
Primary: „PinMe: śledzenie użytkownika smartfona na całym świecie”
Dodatkowa: „Jak śledzić telefon komórkowy bez GPS-u lub zgody”
Nie znalazłem jeszcze linku do ostatecznego kodu zespołu. Kiedy to zrobię, napiszę, jeśli inny tego nie zrobił.