2012-05-09 5 views
23

C'è un modo per accedere al GPS una volta invece di avere un looper che controlla costantemente gli aggiornamenti di posizione?GPS Android - ottieni il posizionamento una sola volta

Nel mio scenario tutto ciò che mi interessa è trovare le coordinate correnti e non una connessione continua con il satellite GPS. Qualcuno ha qualche idea su come questo possa essere fatto? Grazie in anticipo.

risposta

31

Prima verifica se l'ultima posizione conosciuta è recente. In caso contrario, credo che tu debba impostare onLocationChanged listener, ma una volta ottenuta la prima posizione valida puoi sempre interrompere il flusso di aggiornamenti.

aggiunta

public class Example extends Activity implements LocationListener { 
    LocationManager mLocationManager; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

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

     Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if(location != null && location.getTime() > Calendar.getInstance().getTimeInMillis() - 2 * 60 * 1000) { 
      // Do something with the recent location fix 
      // otherwise wait for the update below 
     } 
     else { 
      mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
     } 
    } 

    public void onLocationChanged(Location location) { 
     if (location != null) { 
      Log.v("Location Changed", location.getLatitude() + " and " + location.getLongitude()); 
      mLocationManager.removeUpdates(this); 
     } 
    } 

    // Required functions  
    public void onProviderDisabled(String arg0) {} 
    public void onProviderEnabled(String arg0) {} 
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {} 
} 
+0

voi questo è appunto la mia domanda, ho creato un onLocationChanged e mi piacerebbe avere solo una posizione valida .. come posso interrompere il flusso di aggiornamenti? C'è qualche comando? Grazie – progdoc

+0

Risposta breve LocationManager.removeUpdates(). Risposta lunga, vedi il mio aggiornamento. – Sam

+0

grazie ha funzionato – progdoc

7

Non utilizzare il getLastKnownLocation perché questo potrebbe essere la restituzione di dati nulli o vecchi.

Questo codice preleva la posizione solo dopo aver premuto un pulsante e non tutte le volte. La gente usa per lasciare l'ascoltatore posizione ascoltare in ogni caso e che uccide la durata della batteria in modo da utilizzare il frammento di codice che ho postato facendo un sacco di ricerca:

// get the text view and buttons from the xml layout 
Button button = (Button) findViewById(R.id.btnGetLocation); 
final TextView latitude = (TextView) findViewById(R.id.textview4); 
final TextView longitude = (TextView) findViewById(R.id.textview5); 
final LocationListener locationListener = new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 
      mlocation = location; 
      Log.d("Location Changes", location.toString()); 
      latitude.setText(String.valueOf(location.getLatitude())); 
      longitude.setText(String.valueOf(location.getLongitude())); 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      Log.d("Status Changed", String.valueOf(status)); 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      Log.d("Provider Enabled", provider); 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      Log.d("Provider Disabled", provider); 
     } 
    }; 

    // Now first make a criteria with your requirements 
    // this is done to save the battery life of the device 
    // there are various other other criteria you can search for.. 
    Criteria criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
    criteria.setPowerRequirement(Criteria.POWER_LOW); 
    criteria.setAltitudeRequired(false); 
    criteria.setBearingRequired(false); 
    criteria.setSpeedRequired(false); 
    criteria.setCostAllowed(true); 
    criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH); 
    criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH); 

    // Now create a location manager 
    final LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

    // This is the Best And IMPORTANT part 
    final Looper looper = null; 

    // Now whenever the button is clicked fetch the location one time 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      locationManager.requestSingleUpdate(criteria, locationListener, looper); 
     } 
    }); 
+0

Questa dovrebbe essere la risposta accettata. Ottimo lavoro. – seekingStillness