È possibile ottenere la posizione corrente dell'utente senza utilizzare il GPS o Internet? Voglio dire con l'aiuto del provider di rete mobile.
È possibile ottenere la posizione corrente dell'utente senza utilizzare il GPS o Internet? Voglio dire con l'aiuto del provider di rete mobile.
Risposte:
Quello che stai cercando di fare è ottenere la posizione usando LocationManager.NETWORK_PROVIDER
invece di LocationManager.GPS_PROVIDER
. La NETWORK_PROVIDER
risolverà sul GSM o sul wifi, che mai disponibile. Ovviamente con wifi spento verrà utilizzato il GSM. Tieni presente che l'utilizzo della rete cellulare è accurato fondamentalmente fino a 500 m.
http://developer.android.com/guide/topics/location/obtaining-user-location.html contiene alcune informazioni e un codice di esempio davvero eccezionali.
Dopo aver finito con la maggior parte del codice OnCreate()
, aggiungi questo:
// 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);
Potresti anche fare in modo che la tua attività implementi la LocationListener
classe e quindi implementala onLocationChanged()
nella tua attività.
Ottenendo il getLastKnownLocation
non si avvia effettivamente una correzione da soli.
Tieni presente che questo potrebbe avviare il provider, ma se l'utente ha mai ottenuto una posizione prima, non credo che lo farà. I documenti non sono molto chiari su questo.
Secondo i documenti getLastKnownLocation:
Restituisce una posizione che indica i dati dall'ultima correzione della posizione nota ottenuta dal provider specificato. Questo può essere fatto senza avviare il provider.
Ecco un breve snippet:
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;
}
}
Devi anche aggiungere una nuova autorizzazione a AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
PASSIVE_PROVIDER
, NETWORK_PROVIDER
e 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;
}
}
No, al momento non puoi ottenere la posizione senza utilizzare il GPS o Internet.
Le tecniche di localizzazione basate su WiFi, Cellulare o Bluetooth funzionano con l'aiuto di un ampio database che viene costantemente aggiornato. Un dispositivo esegue la scansione degli ID del trasmettitore e quindi li invia in una query tramite Internet a un servizio come Google, Apple o Skyhook. Quel servizio risponde con una posizione basata su precedenti sondaggi wireless da posizioni note. Senza accesso a Internet, è necessario disporre di una copia locale di tale database e mantenerla aggiornata. Per l'utilizzo globale, questo è molto poco pratico.
Teoricamente, un provider di telefonia mobile potrebbe fornire solo un servizio dati locale ma nessun accesso a Internet, quindi rispondere alle domande sulla posizione dai dispositivi mobili. I provider di telefonia mobile non lo fanno; nessuno vuole pagare per questo tipo di accesso limitato ai dati. Se disponi di un servizio dati tramite il tuo provider di telefonia mobile, hai accesso a Internet.
In breve, l'utilizzo di LocationManager.NETWORK_PROVIDER o android.hardware.location.network per ottenere la posizione richiede l'uso di Internet.
L'utilizzo dell'ultima posizione nota richiede di aver avuto accesso a Internet o GPS molto recentemente. Se hai appena avuto Internet, presumibilmente puoi regolare la tua posizione o le impostazioni per tornare a Internet. Se il tuo dispositivo non ha il GPS o l'accesso a Internet, l'ultima funzione di posizione nota non ti aiuterà.
Senza GPS o Internet, potresti:
Qui è possibile ottenere la posizione corrente dell'utente senza l'uso di GPS e provider di rete.
1. Convert cellLocation to real location (Latitude and Longitude), using "http://www.google.com/glm/mmap"
Hai dato un'occhiata a Google Maps Geolocation Api? Geolocalizzazione di Google Map
Questo è semplice RestApi, è sufficiente POST una richiesta, il servizio restituirà una posizione con precisione in metri.
Sembra che sia possibile monitorare uno smartphone senza utilizzare il GPS.
Fonti:
Primaria: "PinMe: monitoraggio di un utente di smartphone in tutto il mondo"
Secondario: "Come monitorare un cellulare senza GPS o consenso"
Non ho ancora trovato un collegamento al codice finale della squadra. Quando lo farò posterò, se un altro non l'ha fatto.