2013-03-09 17 views
5

Sto costruendo un'applicazione GPS Android che ottiene i luoghi più vicini in base alla posizione corrente dell'utente.Come posso impedire all'utente di attendere a lungo per ottenere una correzione della posizione?

Questo è ciò che la mia applicazione fa:

  • Controllare se GPS o rete è disponibile
  • Se nessuno dei due è disponibile, allora non fare nulla. Altrimenti, prima controlliamo il GPS se è lì, se no, controlliamo la rete.
  • Dopo aver utilizzato uno di questi, otteniamo la posizione corrente e quindi la inviamo al server.
  • Una volta recuperati i dati dal server e aggiornato l'interfaccia utente, smettiamo di ascoltare ulteriori aggiornamenti di posizione. Una volta è sufficiente, fino a quando non premono il pulsante di aggiornamento che ricomincia da capo.

quello che spero di fare:

  • Se il GPS o la rete non riesce a recuperare una posizione, ad esempio, 2 minuti, poi si passa fornitori. Non vogliamo che l'utente attenda troppo a lungo.

  • Sarebbe anche bello poter utilizzare entrambi i provider e quindi ottenere il più preciso da quello. Ho dato un'occhiata a http://developer.android.com/guide/topics/location/strategies.html e ho visto il metodo isBetterLocation. Come integrare questo metodo nella mia applicazione? Ho difficoltà a capire come, dove e quando dovrebbe essere chiamato. Suppongo che isBetterLocation() richieda di chiamare sia la rete che il GPS allo stesso tempo. Sarebbe bello che la mia applicazione ascoltasse entrambi per la precisione. Come faccio a fare questo? Cosa succede se uno di loro non è disponibile?

Ecco le parti del mio codice:

if(!GPSEnabled && !networkEnabled) 
{ 
    Toast.makeText(this, "Error: This application requires a GPS or network connection", 
      Toast.LENGTH_SHORT).show(); 
} 
else 
{ 
    if(GPSEnabled) 
    { 
     locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
    } 
    else if(networkEnabled) 
    { 
     System.out.println("Getting updates from network provider"); 
     locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); 
    } 
} 

Questo è il metodo onLocationChanged. Ottengo i valori lat/lng e poi li mando sul mio server e poi faccio cose appropriate con esso.

public void onLocationChanged(Location location) 
{ 
    //Get coordinates 
    double lat = (location.getLatitude()); 
    double lng = (location.getLongitude()); 
    Log.d("MainActivity", "got location: " + lat + ": " + lng); 
    //get nearest locations 
    new GetLocations().execute(SharedVariables.root + SharedVariables.locationsController + SharedVariables.getNearestMethod + lat + "/" + lng); 

    // Zoom in, animating the camera after the markers have been placed 
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 10)); 
    System.out.println("lat = " + lat + ", lng = " + lng); 

    //Stop listening for updates. We only want to do this once. 
    locManager.removeUpdates(this); 
} 
+0

Hai visto questo ?: http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html. E l'app di esempio per le protezioni ?: https://code.google.com/p/android-protips-location/ –

+0

Il provider di rete non è preciso, ma restituisce la posizione in meno di un secondo – Reno

+0

Ciao Reno, grazie. Comprendo che il GPS e la rete differiscono in termini di accuratezza e velocità e questo mi porta alla mia domanda, come faccio a implementare una funzione in base alla quale, se entrambi i provider sono disponibili, ottengo la posizione in base a uno dei provider, preferibilmente GPS perché è il più preciso, quindi se una correzione non viene trovata dopo x quantità di tempo, provo a passare al provider di rete, se è acceso. –

risposta

0

O tramite GPS o la rete, non è possibile ridurre drasticamente i tempi di attesa per ottenere la vostra eventuale posizione.

Entrambi questi metodi di localizzazione hanno i loro svantaggi e vantaggi:

  • GPS di solito richiede più tempo per conoscere la vostra posizione, perché trovare e calibrare i satelliti GPS è un compito tremendo (trovando almeno 3 sono richiesti satelliti correttamente allineati). Oltre a ciò, aggiungi l'eventuale oggetto/ambiente ostruente che blocca i segnali. A meno che non attivi il GPS prima/all'avvio dell'app, l'attesa è obbligatoria. Dall'altro lato, si ottiene una posizione a grana fine.

  • Se è necessaria solo una posizione approssimativa, l'utilizzo della rete è una soluzione: restituisce i dati in pochi secondi. Tuttavia,, la precisione della posizione varia a seconda delle reti disponibili/utilizzate; Non ho esempi pratici, ma suppongo che la precisione possa variare a molto. Il GPS sarà SEMPRE con una posizione migliore della rete.

Capire non c'è scelta predefinita. Qualunque cosa dipende da cosa fa la tua app con questi dati.

Utilizzare il GPS, se disponibile, mentre si effettua la richiesta di posizione sulla rete e ricollegarsi alla rete se non è presente un dispositivo GPS. Poi prendere uno:

  • il primo a venire risultato se avete solo bisogno di una posizione
  • il risultato preferito se si desidera che i dati più precisi

Se il GPS o la rete non riesce a recuperare un posizione, ad esempio, 2 minuti, quindi passiamo ai provider. Non vogliamo che l'utente attenda troppo a lungo.

In entrambi i casi, non effettuare un timer di fallback: si allungherà semplicemente il tempo di attesa nel caso in cui il primo provider non riesca; quindi entrambe le richieste contemporaneamente, a meno che l'API di Android non consenta richieste di posizione asincrone.

+0

Grazie. Come ho affermato prima nella mia risposta al commento di Reno, comprendo le differenze tra GPS e provider di rete. Come abbiamo entrambi alluso alla mia domanda e alla tua risposta sull'uso simultaneo di entrambe le richieste, volevo sapere come sarebbe stato implementato. Come selezioniamo la posizione più precisa quando usiamo due provider? Inoltre, nell'ultima parte della mia domanda, cosa facciamo se uno dei provider non è abilitato? –

+0

Come ho detto, il GPS avrà sempre la migliore precisione. Ma a meno che non si sappia quanto sia precisa una rete (richiedendo la sua precisione o memorizzando nella cache la precisione di questa specifica rete quando è disponibile anche il GPS (fare la differenza tra i 2 fornitori)), non è possibile determinare quale provider deve essere scelto Calcolando la media dei valori dei diversi fornitori di posizione forse? – ElementW