Android - Services basés sur la localisation

Les API de localisation Android vous permettent de créer facilement des applications de localisation, sans avoir à vous concentrer sur les détails de la technologie de localisation sous-jacente.

Cela devient possible avec l'aide de Google Play services, ce qui facilite l'ajout de la détection de l'emplacement à votre application grâce au suivi automatique de l'emplacement, au géorepérage et à la reconnaissance d'activité.

Ce didacticiel vous montre comment utiliser les services de localisation dans votre APP pour obtenir l'emplacement actuel, obtenir des mises à jour périodiques de l'emplacement, rechercher des adresses, etc.

L'objet de localisation

le Locationobjet représente un emplacement géographique qui peut être constitué d'une latitude, d'une longitude, d'un horodatage et d'autres informations telles que le relèvement, l'altitude et la vitesse. Il existe des méthodes importantes suivantes que vous pouvez utiliser avec l'objet Location pour obtenir des informations spécifiques à l'emplacement -

N ° Sr. Méthode et description
1

float distanceTo(Location dest)

Renvoie la distance approximative en mètres entre cet emplacement et l'emplacement donné.

2

float getAccuracy()

Obtenez la précision estimée de cet emplacement, en mètres.

3

double getAltitude()

Obtenez l'altitude si disponible, en mètres au-dessus du niveau de la mer.

4

float getBearing()

Obtenez le relèvement, en degrés.

5

double getLatitude()

Obtenez la latitude, en degrés.

6

double getLongitude()

Obtenez la longitude, en degrés.

sept

float getSpeed()

Obtenez la vitesse si elle est disponible, en mètres / seconde au-dessus du sol.

8

boolean hasAccuracy()

Vrai si cet emplacement a une précision.

9

boolean hasAltitude()

Vrai si cet emplacement a une altitude.

dix

boolean hasBearing()

Vrai si cet emplacement a un relèvement.

11

boolean hasSpeed()

Vrai si cet emplacement a une vitesse.

12

void reset()

Efface le contenu de l'emplacement.

13

void setAccuracy(float accuracy)

Définissez la précision estimée de cet emplacement, en mètres.

14

void setAltitude(double altitude)

Réglez l'altitude, en mètres au-dessus du niveau de la mer.

15

void setBearing(float bearing)

Réglez le relèvement, en degrés.

16

void setLatitude(double latitude)

Réglez la latitude, en degrés.

17

void setLongitude(double longitude)

Réglez la longitude, en degrés.

18

void setSpeed(float speed)

Réglez la vitesse, en mètres / seconde au-dessus du sol.

19

String toString()

Renvoie une chaîne contenant une description concise et lisible par l'homme de cet objet.

Obtenir l'emplacement actuel

Pour obtenir l'emplacement actuel, créez un client d'emplacement qui est LocationClient objet, connectez-le aux services de localisation en utilisant connect() méthode, puis appelez sa getLastLocation()méthode. Cette méthode renvoie l'emplacement le plus récent sous la forme deLocationobjet contenant les coordonnées de latitude et de longitude et d'autres informations comme expliqué ci-dessus. Pour avoir des fonctionnalités basées sur la localisation dans votre activité, vous devrez implémenter deux interfaces -

  • GooglePlayServicesClient.ConnectionCallbacks
  • GooglePlayServicesClient.OnConnectionFailedListener

Ces interfaces fournissent les méthodes de rappel importantes suivantes, que vous devez implémenter dans votre classe d'activité -

N ° Sr. Méthodes de rappel et description
1

abstract void onConnected(Bundle connectionHint)

Cette méthode de rappel est appelée lorsque le service de localisation est correctement connecté au client de localisation. Vous utiliserezconnect() méthode pour se connecter au client de localisation.

2

abstract void onDisconnected()

Cette méthode de rappel est appelée lorsque le client est déconnecté. Vous utiliserezdisconnect() méthode pour se déconnecter du client de localisation.

3

abstract void onConnectionFailed(ConnectionResult result)

Cette méthode de rappel est appelée lorsqu'une erreur s'est produite lors de la connexion du client au service.

Vous devez créer le client de localisation dans onCreate() méthode de votre classe d'activité, puis connectez-la à onStart(), afin que les services de localisation maintiennent la position actuelle pendant que votre activité est entièrement visible. Vous devez déconnecter le client dans onStop()méthode, de sorte que lorsque votre application n'est pas visible, les services de localisation ne maintiennent pas l'emplacement actuel. Cela aide à économiser l'énergie de la batterie dans une large mesure.

Obtenez l'emplacement mis à jour

Si vous êtes prêt à avoir des mises à jour de localisation, vous devrez mettre en œuvre en plus des interfaces mentionnées ci-dessus LocationListenerinterface également. Cette interface fournit la méthode de rappel suivante, que vous devez implémenter dans votre classe d'activité -

N ° Sr. Méthode de rappel et description
1

abstract void onLocationChanged(Location location)

Cette méthode de rappel est utilisée pour recevoir des notifications du LocationClient lorsque l'emplacement a changé.

Localisation Qualité de service

le LocationRequest objet est utilisé pour demander une qualité de service (QoS) pour les mises à jour de localisation à partir du LocationClient. Il existe des méthodes de définition utiles suivantes que vous pouvez utiliser pour gérer la qualité de service. Il existe des méthodes de lecture équivalentes disponibles que vous pouvez consulter dans la documentation officielle d'Android.

N ° Sr. Méthode et description
1

setExpirationDuration(long millis)

Définissez la durée de cette demande, en millisecondes.

2

setExpirationTime(long millis)

Définissez le délai d'expiration de la demande, en millisecondes depuis le démarrage.

3

setFastestInterval(long millis)

Définissez explicitement l'intervalle le plus rapide pour les mises à jour d'emplacement, en millisecondes.

4

setInterval(long millis)

Définissez l'intervalle souhaité pour les mises à jour de l'emplacement actif, en millisecondes.

5

setNumUpdates(int numUpdates)

Définissez le nombre de mises à jour d'emplacement.

6

setPriority(int priority)

Définissez la priorité de la demande.

Maintenant, par exemple, si votre application souhaite une localisation de haute précision, elle doit créer une demande de localisation avec setPriority(int) défini sur PRIORITY_HIGH_ACCURACY et setInterval(long)à 5 secondes. Vous pouvez également utiliser un intervalle plus grand et / ou d'autres priorités telles que PRIORITY_LOW_POWER pour demander une précision de niveau "ville" ou PRIORITY_BALANCED_POWER_ACCURACY pour une précision de niveau "bloc".

Les activités doivent fortement envisager de supprimer toutes les demandes de localisation lors de l'entrée en arrière-plan (par exemple à onPause ()), ou au moins d'échanger la demande sur un intervalle plus grand et de qualité inférieure pour économiser la consommation d'énergie.

Affichage d'une adresse de localisation

Une fois que tu as Location objet, vous pouvez utiliser Geocoder.getFromLocation()méthode pour obtenir une adresse pour une latitude et une longitude données. Cette méthode est synchrone et peut prendre beaucoup de temps pour faire son travail, vous devez donc appeler la méthode à partir dudoInBackground() méthode d'un AsyncTask classe.

le AsyncTask doit être sous-classée pour être utilisée et la sous-classe remplacera doInBackground(Params...) méthode pour effectuer une tâche en arrière-plan et onPostExecute(Result)est appelée sur le thread d'interface utilisateur une fois le calcul en arrière-plan terminé et au moment de l'affichage du résultat. Il existe une autre méthode importante disponible dans AyncTask qui estexecute(Params... params), cette méthode exécute la tâche avec les paramètres spécifiés.

Exemple

L'exemple suivant vous montre de manière pratique comment utiliser les services de localisation dans votre application pour obtenir l'emplacement actuel et ses adresses équivalentes, etc.

Pour expérimenter cet exemple, vous aurez besoin d'un appareil mobile équipé du dernier système d'exploitation Android, sinon vous devrez lutter avec un émulateur qui pourrait ne pas fonctionner.

Créer une application Android

Étape La description
1 Vous allez utiliser l'IDE de studio Android pour créer une application Android et la nommer Tutorialspoint sous un package com.example.tutorialspoint7.myapplication .
2 ajoutez le fichier src / GPSTracker.java et ajoutez le code requis.
3 Modifiez le fichier src / MainActivity.java et ajoutez le code requis comme indiqué ci-dessous pour prendre soin d'obtenir l'emplacement actuel et son adresse équivalente.
4 Modifiez le fichier XML de mise en page res / layout / activity_main.xml pour ajouter tous les composants de l'interface graphique qui incluent trois boutons et deux vues de texte pour afficher l'emplacement / l'adresse.
5 Modifiez res / values ​​/ strings.xml pour définir les valeurs constantes requises
6 Modifiez AndroidManifest.xml comme indiqué ci-dessous
sept Exécutez l'application pour lancer l'émulateur Android et vérifier le résultat des modifications effectuées dans l'application.

Voici le contenu du fichier d'activité principal modifié MainActivity.java.

package com.example.tutorialspoint7.myapplication;

import android.Manifest;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.test.mock.MockPackageManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

   Button btnShowLocation;
   private static final int REQUEST_CODE_PERMISSION = 2;
   String mPermission = Manifest.permission.ACCESS_FINE_LOCATION;

   // GPSTracker class
   GPSTracker gps;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
		
      try {
         if (ActivityCompat.checkSelfPermission(this, mPermission)
            != MockPackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, new String[]{mPermission}, 
               REQUEST_CODE_PERMISSION);

            // If any permission above not allowed by user, this condition will
               execute every time, else your else part will work
         }
      } catch (Exception e) {
         e.printStackTrace();
      }

      btnShowLocation = (Button) findViewById(R.id.button);

      // show location button click event
      btnShowLocation.setOnClickListener(new View.OnClickListener() {

         @Override
         public void onClick(View arg0) {
            // create class object
            gps = new GPSTracker(MainActivity.this);

            // check if GPS enabled
            if(gps.canGetLocation()){

               double latitude = gps.getLatitude();
               double longitude = gps.getLongitude();

               // \n is for new line
               Toast.makeText(getApplicationContext(), "Your Location is - \nLat: "
                  + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
            }else{
               // can't get location
               // GPS or Network is not enabled
               // Ask user to enable GPS/network in settings
               gps.showSettingsAlert();
            }

         }
      });
   }
}

Voici le contenu du fichier d'activité principal modifié GPSTracker.java.

package com.example.tutorialspoint7.myapplication;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {

   private final Context mContext;

   // flag for GPS status
   boolean isGPSEnabled = false;

   // flag for network status
   boolean isNetworkEnabled = false;

   // flag for GPS status
   boolean canGetLocation = false;

   Location location; // location
   double latitude; // latitude
   double longitude; // longitude

   // The minimum distance to change Updates in meters
   private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

   // The minimum time between updates in milliseconds
   private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

   // Declaring a Location Manager
   protected LocationManager locationManager;

   public GPSTracker(Context context) {
      this.mContext = context;
      getLocation();
   }

   public Location getLocation() {
      try {
         locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

         // getting GPS status
         isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

         // getting network status
         isNetworkEnabled = locationManager
            .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

         if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
         } else {
            this.canGetLocation = true;
            // First get location from Network Provider
            if (isNetworkEnabled) {
               locationManager.requestLocationUpdates(
                  LocationManager.NETWORK_PROVIDER,
                  MIN_TIME_BW_UPDATES,
                  MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
						
               Log.d("Network", "Network");
               if (locationManager != null) {
                  location = locationManager
                     .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
							
                  if (location != null) {
                     latitude = location.getLatitude();
                     longitude = location.getLongitude();
                  }
               }
            }
				
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
               if (location == null) {
                  locationManager.requestLocationUpdates(
                     LocationManager.GPS_PROVIDER,
                     MIN_TIME_BW_UPDATES,
                     MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
							
                  Log.d("GPS Enabled", "GPS Enabled");
                  if (locationManager != null) {
                     location = locationManager
                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
								
                     if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                     }
                  }
               }
            }
         }

      } catch (Exception e) {
         e.printStackTrace();
      }

      return location;
   }

   /**
      * Stop using GPS listener
      * Calling this function will stop using GPS in your app
   * */
	
   public void stopUsingGPS(){
      if(locationManager != null){
         locationManager.removeUpdates(GPSTracker.this);
      }
   }

   /**
      * Function to get latitude
   * */
	
   public double getLatitude(){
      if(location != null){
         latitude = location.getLatitude();
      }

      // return latitude
      return latitude;
   }

   /**
      * Function to get longitude
   * */
	
   public double getLongitude(){
      if(location != null){
         longitude = location.getLongitude();
      }

      // return longitude
      return longitude;
   }

   /**
      * Function to check GPS/wifi enabled
      * @return boolean
   * */
	
   public boolean canGetLocation() {
      return this.canGetLocation;
   }

   /**
      * Function to show settings alert dialog
      * On pressing Settings button will lauch Settings Options
   * */
	
   public void showSettingsAlert(){
      AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

      // Setting Dialog Title
      alertDialog.setTitle("GPS is settings");

      // Setting Dialog Message
      alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

      // On pressing Settings button
      alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog,int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mContext.startActivity(intent);
         }
      });

      // on pressing cancel button
      alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
         }
      });

      // Showing Alert Message
      alertDialog.show();
   }

   @Override
   public void onLocationChanged(Location location) {
   }

   @Override
   public void onProviderDisabled(String provider) {
   }

   @Override
   public void onProviderEnabled(String provider) {
   }

   @Override
   public void onStatusChanged(String provider, int status, Bundle extras) {
   }

   @Override
   public IBinder onBind(Intent arg0) {
      return null;
   }
}

Voici le contenu de res/layout/activity_main.xml fichier -

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
   android:layout_width = "fill_parent"
   android:layout_height = "fill_parent"
   android:orientation = "vertical" >


   <Button
      android:id = "@+id/button"
      android:layout_width = "fill_parent"
      android:layout_height = "wrap_content"
      android:text = "getlocation"/>

</LinearLayout>

Voici le contenu de res/values/strings.xml pour définir deux nouvelles constantes -

<?xml version = "1.0" encoding = "utf-8"?>
<resources>
   <string name = "app_name">Tutorialspoint</string>
</resources>

Voici le contenu par défaut de AndroidManifest.xml -

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
   package = "com.example.tutorialspoint7.myapplication">
   <uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" />
   <uses-permission android:name = "android.permission.INTERNET" />
   <application
      android:allowBackup = "true"
      android:icon = "@mipmap/ic_launcher"
      android:label = "@string/app_name"
      android:supportsRtl = "true"
      android:theme = "@style/AppTheme">
		
      <activity android:name = ".MainActivity">
         <intent-filter>
            <action android:name = "android.intent.action.MAIN" />

            <category android:name = "android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>

</manifest>

Essayons d'exécuter votre Tutorialspointapplication. Je suppose que vous avez connecté votre appareil mobile Android à votre ordinateur. Pour exécuter l'application à partir d'Android Studio, ouvrez l'un des fichiers d'activité de votre projet et cliquez sur l' icône Exécuter dans la barre d'outils. Avant de démarrer votre application, le programme d'installation d'Android Studio affichera la fenêtre suivante pour sélectionner une option dans laquelle vous souhaitez exécuter votre application Android.

Maintenant, pour voir l'emplacement, sélectionnez le bouton Obtenir l'emplacement qui affichera les informations de localisation comme suit -