2012-05-09 10 views
23

¿Hay alguna manera de acceder al GPS una vez en lugar de tener un looper que busca constantemente actualizaciones de ubicación?GPS Android: obtenga el posicionamiento solo una vez

En mi escenario, todo lo que me interesa es encontrar las coordenadas actuales y no una conexión continua con el satélite GPS. ¿Alguien tiene alguna idea de cómo se puede hacer esto? Gracias por adelantado.

Respuesta

31

Primero compruebe si la última ubicación conocida es reciente. De lo contrario, creo que debe configurar el oyente LocationLoaded, pero una vez que obtenga su primera ubicación válida, siempre podrá detener el flujo de actualizaciones.

adición

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

ye eso es precisamente mi pregunta, puedo configurar una onLocationChanged y me gustaría obtener solo una ubicación válida ... ¿cómo puedo detener el flujo de actualizaciones? ¿Hay algún comando? Gracias – progdoc

+0

Respuesta corta LocationManager.removeUpdates(). Respuesta larga, mira mi actualización. – Sam

+0

gracias funcionó – progdoc

7

no uso el getLastKnownLocation porque eso podría ser la devolución de datos nulos o viejos.

Este código solo recupera la ubicación una vez que se presiona un botón y no siempre. La gente usa para dejar al oyente ubicación escucha en todos los casos y que mata la vida de la batería a fin de utilizar el fragmento de código que he publicado haciendo un montón de investigación:

// 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

Esta debería ser la respuesta aceptada. Buen trabajo. – seekingStillness