Ottieni la posizione corrente dell'utente su Android senza utilizzare il GPS o Internet


91

È possibile ottenere la posizione corrente dell'utente senza utilizzare il GPS o Internet? Voglio dire con l'aiuto del provider di rete mobile.


1
La risposta accettata funziona perfettamente? Per me non funziona ... !!!
Samitha Chathuranga

3
Sfortunatamente la risposta accettata è sbagliata :-( Incredibile che abbia ottenuto 28 voti positivi anche se non risponde correttamente alla domanda!
David Wasser

@DavidWasser Apprezzo i tuoi preziosi commenti. E pensi che in realtà non esista alcun metodo per ottenere i dettagli sulla posizione senza utilizzare Internet o GPS? (diverso dall'utilizzo di messaggi di trasmissione cellulare)
Samitha Chathuranga

2
@SamithaChathuranga Pensa a questo: se non hai il GPS e non hai Internet, dove otterrai queste informazioni? È possibile ottenere le informazioni sull'ID cella dalla rete. Questo ti dà solo l'ID. Avresti quindi bisogno di un modo per mappare l'ID a una coordinata o un nome effettivi. Potresti sempre creare il tuo database di ID cellulare e includerlo nella tua applicazione, ma ci vorrebbe un sacco di lavoro per raccogliere tutti quei dati e la mappatura non è statica: cambia quando gli operatori mobili installano nuove torri cellulari e rinumerano le loro reti. Fondamentalmente, la risposta pratica è "no".
David Wasser

@DavidWasser Grazie per la risposta. Ho anche avuto una grande sorpresa su come ottenere la posizione senza Internet o GPS. Ma si dice che sia possibile includere stackoverflow in molti forum. Ecco perché ho pensato che sarebbe stato possibile. Sembra che anche molte persone siano fuorviate.
Samitha Chathuranga

Risposte:


87

Quello che stai cercando di fare è ottenere la posizione usando LocationManager.NETWORK_PROVIDERinvece di LocationManager.GPS_PROVIDER. La NETWORK_PROVIDERrisolverà 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 LocationListenerclasse e quindi implementala onLocationChanged()nella tua attività.


1
ricordati di controllare le strategie sulla conservazione della batteria. Inoltre, a seconda dell'applicazione, PASSIVE_PROVIDER e l'utilizzo di getLastKnownLocation possono farti risparmiare molto lavoro e batteria se altre applicazioni utilizzano le antenne.
Ian

2
Ehi @Ian, ho usato lo stesso codice .. Ma nel mio caso, il metodo listener onLocationChanged () non ha mai chiamato. Ho usato requestLocationUpdates sul metodo onResume (). ancora non si chiamava mai .. Allora cosa c'era stato problema lì?
MS.

2
Hey @lan o qualsiasi altra persona che può aiutarmi ho implementato il codice sopra ma il metodo onLocationChanged viene chiamato quale sarebbe il problema qualcuno può aiutarmi per favore .....
pareshm

1
È possibile ottenere le coordinate senza Internet? In alcuni dispositivi sembra non funzionare.
iammilind

20
Questa risposta è sbagliata :-( OP ha chiesto come ottenere la posizione senza utilizzare una connessione Internet. LOCATION_PROVIDER deve utilizzare Internet per accedere ai server per risolvere una raccolta di indirizzi Cell-ID e WIFI MAC in una coordinata geografica. Se non hai Internet connessione non sarai in grado di ottenere una coordinata. Se mi dici che funziona per te, significa che hai una connessione Internet o una connessione Internet (l'API di localizzazione scarica e memorizza nella cache alcune informazioni sull'area intorno a te) , oppure le informazioni sulla posizione sono vecchie (e quindi imprecise).
David Wasser

16

Ottenendo il getLastKnownLocationnon 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" />

Quello che sto pensando è: è possibile ottenere la posizione corrente utilizzando la rete mobile
Prabhu M

Devi leggere i documenti. Scopri le differenze tra PASSIVE_PROVIDER, NETWORK_PROVIDERe GPS_PROVIDER.
hwrdprkns

1
Sebbene questo sia l'ideale, controllerei l'ora dell'ultima posizione usando getTime (). Quindi, è solo questione di decidere quanti anni permetterai che abbia questo. Se è troppo vecchio, ottieni una nuova posizione utilizzando il mio post.
Ian

1
@Ian Come ottenere la posizione nuova o fresca?
Archie.bpgc

5
Possiamo ottenere la posizione se il GPS è disattivato
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

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:

  1. Scatta foto del cielo notturno e utilizza l'ora corrente per stimare la tua posizione sulla base di una mappa stellare. Ciò probabilmente richiederebbe apparecchiature aggiuntive per garantire che gli angoli delle immagini siano misurati correttamente.
  2. Utilizzare un accelerometro per monitorare la posizione a partire da una posizione nota. L'accumulo di errori in questo tipo di approccio lo rende poco pratico per la maggior parte delle situazioni.

3

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"

2. Fare clic qui per riferimento




Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.