2012-05-09 9 views
23

Gibt es eine Möglichkeit, einmal auf das GPS zuzugreifen, anstatt einen Looper zu haben, der ständig nach Ortsupdates sucht?GPS Android - nur einmal positionieren

In meinem Szenario interessiert mich nur die Suche nach den aktuellen Koordinaten und keine kontinuierliche Verbindung mit dem GPS-Satelliten. Hat jemand eine Idee, wie das gemacht werden kann? Danke im Voraus.

Antwort

31

Überprüfen Sie zuerst, ob der letzte bekannte Standort aktuell ist. Wenn nicht, müssen Sie einen locationChanged-Listener einrichten, aber sobald Sie Ihren ersten gültigen Speicherort haben, können Sie den Aktualisierungsstrom immer stoppen.

Zusatz

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

ihr das ist genau meine Frage, habe ich ein bis OnLocationChanged und ich möchte nur einen gültigen Speicherort bekommen .. wie kann ich den Strom von Updates stoppen? Gibt es einen Befehl? Danke – progdoc

+0

Kurze Antwort LocationManager.removeUpdates(). Lange Antwort, siehe mein Update. – Sam

+0

danke es funktionierte – progdoc

7

Dont verwenden, um die getLastKnownLocation weil das null oder alte Daten zurückkehrt sein könnte.

Dieser Code Ruft nur den Standort ab, sobald eine Taste gedrückt wird und nicht jedes Mal. Die Menschen in jedem Fall zu verlassen, verwenden hören die Lage Hörer und dass tötet die Lebensdauer der Batterie so das Code-Snippet verwenden ich tun viel Forschung Beiträge geschrieben haben:

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

Dies sollte die akzeptierte Antwort sein. Gute Arbeit. – seekingStillness