web-dev-qa-db-fra.com

GPS Android - obtenir le positionnement une seule fois

Existe-t-il un moyen d'accéder au GPS une fois au lieu d'avoir un boucleur qui vérifie constamment les mises à jour de localisation?

Dans mon scénario, tout ce qui m'intéresse est de trouver les coordonnées actuelles et non une connexion continue avec le satellite GPS. Quelqu'un a-t-il une idée de la manière dont cela peut être fait? Merci d'avance.

30
progdoc

Vérifiez d'abord si le dernier emplacement connu est récent. Sinon, je pense que vous devez configurer l'écouteur onLocationChanged, mais une fois que vous avez obtenu votre premier emplacement valide, vous pouvez toujours arrêter le flux de mises à jour.

Ajout

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) {}
}
37
Sam

N'utilisez pas getLastKnownLocation car cela pourrait renvoyer des données nulles ou anciennes.

Ce code ne récupère l'emplacement qu'une fois qu'un bouton est enfoncé et pas à chaque fois. Les gens utilisent pour laisser l'auditeur de localisation écouter à chaque fois et que tue la durée de vie de la batterie donc utilisez l'extrait de code que j'ai publié en faisant beaucoup de recherches:

// 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);
       }
   });
22
msmukesh4