Czy możliwe jest uzyskanie aktualnej lokalizacji użytkownika bez korzystania z GPS lub internetu? Mam na myśli pomoc operatora sieci komórkowej.
android
geolocation
gps
android-gps
Prabhu M
źródło
źródło
Odpowiedzi:
To, co chcesz zrobić, to uzyskać pozycję za pomocą
LocationManager.NETWORK_PROVIDER
zamiastLocationManager.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.źródło
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:
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" />
źródło
PASSIVE_PROVIDER
,NETWORK_PROVIDER
iGPS_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; } }
źródło
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:
źródło
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"
2. Kliknij tutaj w celach informacyjnych
źródło
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.
źródło
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ł.
źródło
Możesz to zrobić za pomocą TelephonyManager.
źródło