2010-05-27 14 views
13

Ho questo codice per ottenere il miglior provider disponibileAndroid posizione ottenere dal miglior fornitore disponibili

lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

locationListener = new MyLocationListener(); 
Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_FINE); 
String provider = lm.getBestProvider(criteria, true); 
Location mostRecentLocation = lm.getLastKnownLocation(provider); 
if(mostRecentLocation != null) { 
    latid=mostRecentLocation.getLatitude(); 
    longid=mostRecentLocation.getLongitude(); 
} 
lm.requestLocationUpdates(provider, 1, 0, locationListener); 

e poi l'ascoltatore

private class MyLocationListener implements LocationListener { 

@Override 
public void onLocationChanged(Location loc) { 
    if (loc != null) { 
    latid = loc.getLatitude(); 
    longid = loc.getLongitude(); 
    // if(loc.hasAccuracy()==true){ 
    accuracyd = loc.getAccuracy(); 
    String providershown = loc.getProvider();  
    accuracy.setText("Location Acquired. Accuracy:" 
     + Double.toString(accuracyd) + "m\nProvider: "+providershown); 
    accuracy.setBackgroundColor(Color.GREEN); 
    // } 
    userinfo=usernamevalue+"&"+Double.toString(latid)+"&"+Double.toString(longid); 
    submituserlocation(userinfo); 
    } 
} 

Quando ho provato ad un dispositivo (HTC Magic) I ho scoperto che quando gps è disabilitato si blocca immediatamente dalla rete. Quando abilito il GPS non prende alcun dato dalla rete e aspetta che si blocchi dal GPS.
Mi piacerebbe bloccare la posizione come le mappe di google che fino a quando non hanno un buon segnale GPS usano la rete per determinare la mia posizione.
Anche se i criteri migliori lo farebbero, ma quello che fanno è scegliere un fornitore una volta.
C'è qualcosa di sbagliato nel mio codice o devo fare thread e timeouts ecc per farlo accadere?

+0

spagi il codice mi ha aiutato notevolmente - da nessuna parte sul sito dev Android è spiegato come ottenere il miglior fornitore possibile. Alcuni dispositivi potrebbero avere gps, alcuni GSM, alcuni wifi. –

+0

Ecco un articolo di Google molto interessante: http://developer.android.com/training/basics/location/currentlocation.html – shkschneider

risposta

14

Forse è possibile provare ad ascoltare sia il provider di rete che il provider di GPS per un certo periodo di tempo e quindi controllare i risultati dai due. Se non si hanno risultati dal gps, utilizzare invece i risultati della rete. È così che l'ho fatto.

+0

Quindi creo due listener di località, uno per Gps e uno per la rete e li inizialo entrambi con requestLocationUpdates. Posso ascoltarli entrambi allora con uno onLocationChanged? – spagi

+0

Sì, dovresti ascoltare entrambi. È anche possibile utilizzare lastKnownLocation prima che l'aggiornamento provenga da qualsiasi provider. – Fedor

+1

È possibile aggiungere una variabile di posizione in MyLocationListener e impostarne il valore all'interno di onLocationChanged(). Nell'attività principale, creare due istanze di MylocationListener, una per il gps e una per il provider di rete. Ascoltare entrambi da un certo periodo di tempo (è possibile implementare questo creando un thread del timer) e quando il tempo è scaduto, interrompere l'ascolto e controllare prima la variabile posizione nel gpslistener se ce n'è, altrimenti controllare il listener di rete. – capecrawler

3

Forse è possibile utilizzare getBestProvider (Criteria criteria, boolean enabledOnly) di LocationManager con i criteri come in this other thread. Vedere official documentation.

Speranza che aiuta

Problemi correlati