web-dev-qa-db-fra.com

Comment ça marche - requestLocationUpdates () + LocationRequest / Listener

Je suis nouveau Android codeur et j'ai du mal à demander des mises à jour pour ma localisation.

Je travaille avec des tutoriels de http://developer.Android.com/training/location/receive-location-updates.html .

Mon application peut gérer les exceptions, obtenir la latitude et la longévité correctement, et le géocodeur peut gérer l'affichage de l'adresse. Mais je ne demande l'emplacement qu'une seule fois - ou lorsque l'emplacement change. Je voudrais faire des intervalles de temps. Pour le moment, j'ai commencé à implémenter le code des tutoriels et ça ressemble à ça:

public class MainActivity extends Activity implements 
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener,
LocationListener {

private static final int MILLISECONDS_PER_SECOND = 1000;

public static final int UPDATE_INTERVAL_IN_SECONDS = 5;
private static final long UPDATE_INTERVAL =
          MILLISECONDS_PER_SECOND * UPDATE_INTERVAL_IN_SECONDS;

private static final int FASTEST_INTERVAL_IN_SECONDS = 1;
private static final long FASTEST_INTERVAL =
          MILLISECONDS_PER_SECOND * FASTEST_INTERVAL_IN_SECONDS;

private TextView tvStatus;
private TextView tvLatitude;
private TextView tvLongitude;

LocationRequest mLocationRequest;
LocationClient mLocationClient;
Location mCurrentLocation;

boolean bNetworkEnabled;
boolean bGPSEnabled;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    tvStatus = (TextView)findViewById(R.id.tvStatus);
    tvLatitude = (TextView)findViewById(R.id.tvLatitude);
    tvLongitude = (TextView)findViewById(R.id.tvLongitude);

    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(UPDATE_INTERVAL);
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
    mLocationClient = new LocationClient(this, this, this);

    checkProviders();
}

Donc, il y a déjà des intervalles implémentés et une demande de localisation. Mais dans le lien que j'ai donné précédemment, il y a un commentaire que je devrais utiliser quelque part requestLocationUpdates() (probablement onCreate(), onStart()) et la suppression de la requête sur onStop()), mais cela me pose problème. Donc, Eclipse me montre 3 méthodes:

requestLocationUpdates(LocationRequest request, LocationListener listener)
requestLocationUpdates(LocationRequest request, PendingIntent CallbackIntent)
requestLocationUpdates(LocationRequest request, LocationListener listener, Looper looper)

Je pense donc que le premier est celui qui convient le mieux à cet endroit. Que dois-je placer dans l'emplacement LocationListener? Je demande de l'aide avec peu d'explications sur son fonctionnement.

34
F1sher

Vous implémentez LocationListener dans votre activité MainActivity. L'appel à la mise à jour simultanée d'emplacement se présentera donc comme suit:

mLocationClient.requestLocationUpdates(mLocationRequest, this);

Assurez-vous que LocationListener que vous implémentez provient de l'API Google, c'est-à-dire importez ceci:

import com.google.Android.gms.location.LocationListener;

et pas ceci:

import Android.location.LocationListener;

et ça devrait marcher.

Il est également important que LocationClient soit réellement connecté avant de procéder. Je vous suggère de ne pas l'appeler dans les méthodes onCreate ou onStart, mais dans onResume. Tout cela est très bien expliqué dans le tutoriel pour Google Location Api: https://developer.Android.com/training/location/index.html

36
HigiPha

J'utilise celui-ci:

LocationManager.requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)

Par exemple, en utilisant un intervalle de 1 seconde:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,this);

le temps est en millisecondes, la distance en mètres.

Cela appelle automatiquement:

public void onLocationChanged(Location location) {
    //Code here, location.getAccuracy(), location.getLongitude() etc...
}

J'ai également eu ces inclus dans le script, mais ne les utilise pas réellement:

public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}

En bref:

public class GPSClass implements LocationListener {

    public void onLocationChanged(Location location) {
        // Called when a new location is found by the network location provider.
        Log.i("Message: ","Location changed, " + location.getAccuracy() + " , " + location.getLatitude()+ "," + location.getLongitude());
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}
    public void onProviderEnabled(String provider) {}
    public void onProviderDisabled(String provider) {}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,this);
    }
}
10
Josttie