2012-05-09 8 views
23

Czy istnieje sposób na jednorazowy dostęp do GPS zamiast posiadania przeglądarki, która stale sprawdza dostępność aktualizacji lokalizacji?GPS Android - ustawiaj pozycję tylko raz.

W moim scenariuszu wszystko, co mnie interesuje, to znajdowanie aktualnych współrzędnych, a nie ciągłe połączenie z satelitą GPS. Czy ktoś ma jakieś pomysły, jak to zrobić? Z góry dziękuję.

Odpowiedz

31

Najpierw sprawdź, czy ostatnia znana lokalizacja jest ostatnia. Jeśli nie, to uważam, że musisz skonfigurować odbiornikLocationChanged, ale gdy już uzyskasz swoją pierwszą prawidłową lokalizację, zawsze możesz zatrzymać strumień aktualizacji.

Dodawanie

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

wy thats dokładnie moje pytanie, skonfigurawac onLocationChanged i chciałbym dostać tylko jedną prawidłową lokalizację. Jak mogę zatrzymać strumień aktualizacji? Czy jest jakieś polecenie? Dzięki – progdoc

+0

Krótka odpowiedź LocationManager.removeUpdates(). Długa odpowiedź, zobacz moją aktualizację. – Sam

+0

dzięki temu działało – progdoc

7

Dont używać getLastKnownLocation dlatego, że może być powrocie dane zerowe lub stare.

Ten kod Pobiera tylko lokalizację po naciśnięciu przycisku i nie za każdym razem. Ludzie używają zostawić słuchacza lokalizacja słuchać w każdym przypadku i że zabija żywotność baterii więc użyć fragmentu kodu Pisałem wykonując wiele badań:

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

To powinna być zaakceptowana odpowiedź. Świetna robota. – seekingStillness