Première expérience avec le GPS Android


Introduction à cette section :

En parlant du terme GPS, je pense que tout le monde le connaît, la technologie de positionnement global GPS, enfin, la manière de se positionner dans Android. Il en existe généralement quatre types : positionnement GPS, positionnement WIFI, positionnement par station de base, positionnement AGPS (station de base + GPS)

Cette série de tutoriels explique uniquement l'utilisation de base du positionnement GPS ; Le GPS obtient la longitude et la latitude actuelles de l'appareil en interagissant avec les satellites, ce qui est précis Il est relativement élevé, mais il présente aussi quelques inconvénients. Le plus gros inconvénient est : Il est presque impossible de l'utiliser à l'intérieur... Il doit recevoir 4 satellites ou plus. Le signal peut assurer le positionnement précis du GPS ! Mais si vous êtes à l’extérieur et qu’il n’y a pas de réseau, le GPS peut toujours être utilisé !

Dans cette section, nous discuterons de l'utilisation de base du GPS dans Android~


1 Certaines API liées au positionnement


1 ) LocationManager

Document officiel de l'API : LocationManager

Cette chose vient du service système et ne peut pas être nouvelle directement. Elle nécessite :

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

. De plus, n'oubliez pas d'ajouter des autorisations lors de l'utilisation du positionnement GPS :

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

D'accord, après avoir obtenu l'objet LocationManager, nous pouvons appeler les méthodes courantes suivantes :

  • addGpsStatusListener(écouteur GpsStatus.Listener) : ajoutez un écouteur d'état GPS
  • addProximityAlert(double latitude, double longitude, rayon de flottement, longue expiration , Intention PendingIntent): Ajouter un avertissement critique
  • getAllProviders() : Obtenir toutes les listes LocationProvider
  • getBestProvider(Critères de critères, booléen activéOnly) : Retour selon le spécifié conditions Optimal LocationProvider
  • getGpsStatus(GpsStatus status): Obtenez l'état du GPS
  • getLastKnownLocation(String supplier): Obtenez le dernier emplacement connu en fonction de LocationProvider Location
  • getProvider(String name) : obtient LocationProvider en fonction du nom
  • getProviders(boolean activéOnly) : obtient tous les LocationProvider disponibles
  • getProviders(Critères de critères, boolean activéOnly) : Obtenez tous les LocationProviders qui remplissent les conditions selon les conditions spécifiées
  • isProviderEnabled(Fournisseur de chaînes) : Déterminez le LocationProvider avec le nom spécifié Available
  • removeGpsStatusListener(écouteur GpsStatus.Listener) : supprimez l'écouteur d'état GPS
  • removeProximityAlert(intention PendingIntent) : supprimez un avertissement de proximité
  • requestLocationUpdates(long minTime, float minDistance, critères Criteria, intention PendingIntent) : Obtenez périodiquement des informations de localisation via le LocationProvider spécifié et démarrez le composant correspondant via Intent
  • requestLocationUpdates(String supplier, long minTime, float minDistance, LocationListener listening) : Obtenez périodiquement des informations de positionnement via le LocationProvider spécifié et déclenchez le déclencheur correspondant à l'auditeur

2) LocationProvider (fournisseur de localisation)

Document API officiel : LocationProvider

Il s'agit d'une représentation abstraite du composant de positionnement GPS. Appelez la méthode suivante pour obtenir des informations pertinentes sur le composant de positionnement !

Les méthodes couramment utilisées sont les suivantes :

  • getAccuracy() : renvoie la précision de LocationProvider
  • getName() : renvoie le nom de LocationProvider
  • getPowerRequirement() : Obtenez les besoins en énergie du LocationProvider
  • hasMonetaryCost() : Indiquez si le LocationProvider est payant ou gratuit
  • meetsCriteria(Criteria critères) : Déterminez si le LocationProvider répond aux conditions des critères
  • requiresCell() : Déterminez si le LocationProvider doit accéder à la station de base du réseau
  • requiresNetwork() : Déterminez si le LocationProvider doit accéder à la station de base du réseau. Accéder aux données du réseau
  • requiresSatellite() : Déterminez si le LocationProvider doit accéder au système de positionnement par satellite
  • supportsAltitude() : Déterminez si le LocationProvider prend en charge les informations d'altitude
  • supportsBearing() : Déterminez si le LocationProvider prend en charge les informations de direction
  • supportsSpeed() : Déterminez si LocationProvider prend en charge les informations de vitesse

3) Localisation (informations de localisation)

Document officiel de l'API : Localisation

Classe abstraite d'informations de localisation, Nous pouvons appeler la méthode suivante pour obtenir des informations de positionnement pertinentes !

Les méthodes couramment utilisées sont les suivantes :

  • float getAccuracy() : obtenez la précision des informations de positionnement
  • double getAltitude ( ) : Obtenez la hauteur des informations de positionnement
  • float getBearing() : Obtenez la direction des informations de positionnement
  • double getLatitude() : Obtenez les informations de positionnement Latitude
  • double getLongitude() : Obtenez la précision des informations de positionnement
  • String getProvider() : Obtenez le LocationProvider
  • qui fournit les informations de positionnement
  • float getSpeed() : La vitesse d'obtention des informations de positionnement
  • boolean hasAccuracy() : Déterminez si les informations de positionnement contiennent des informations de précision

4) Critères (conditions de filtrage)

Documentation officielle de l'API : Critères

Lors de l'obtention de LocationProvider, vous pouvez définir les conditions de filtre, c'est via cette classe que vous définissez les conditions pertinentes~

Les méthodes courantes sont les suivantes :

  • setAccuracy(int précision) : définit l'exigence de précision
  • setAltitudeRequired(boolean altitudeRequired) : définit si le LocationProvider est tenu de fournir des informations sur l'altitude
  • setBearingRequired(boolean BearingRequired) : Définissez si le LocationProvider est tenu de fournir des informations de direction.
  • setCostAllowed(boolean costAllowed) : Définissez si le LocationProvider est nécessaire pour pouvoir fournir des informations de direction. Fournir des informations de direction
  • setPowerRequirement(int level) : définir la consommation électrique requise de LocationProvider
  • setSpeedRequired (boolean speedRequired) : Définissez s'il faut exiger que LocationProvider puisse fournir des informations sur la vitesse

2. Obtenez un exemple de LocationProvider

Exécution du rendu  :

1.gif

Comme vous pouvez le voir sur l'image, il existe trois LocationProviders actuellement disponibles, à savoir :

  • passif : fourni passivement par autres programmes
  • gps : obtenez des informations de positionnement via le GPS
  • réseau : obtenez des informations de positionnement via le réseau

Code d'implémentation :

Fichier de mise en page : activity_main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_one"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获得系统所有的LocationProvider" />

    <Button
        android:id="@+id/btn_two"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="根据条件获取LocationProvider" />

    <Button
        android:id="@+id/btn_three"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获取指定的LocationProvider" />

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:background="#81BB4D"
        android:padding="5dp"
        android:textColor="#FFFFFF"
        android:textSize="20sp"
        android:textStyle="bold" /></LinearLayout>

MainActivity.java :

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_one;
    private Button btn_two;
    private Button btn_three;
    private TextView tv_result;
    private LocationManager lm;
    private List pNames = new ArrayList(); // 存放LocationProvider名称的集合

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        bindViews();
    }

    private void bindViews() {
        btn_one = (Button) findViewById(R.id.btn_one);
        btn_two = (Button) findViewById(R.id.btn_two);
        btn_three = (Button) findViewById(R.id.btn_three);
        tv_result = (TextView) findViewById(R.id.tv_result);

        btn_one.setOnClickListener(this);
        btn_two.setOnClickListener(this);
        btn_three.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_one:
                pNames.clear();
                pNames = lm.getAllProviders();
                tv_result.setText(getProvider());
                break;
            case R.id.btn_two:
                pNames.clear();
                Criteria criteria = new Criteria();
                criteria.setCostAllowed(false);   //免费
                criteria.setAltitudeRequired(true);  //能够提供高度信息
                criteria.setBearingRequired(true);   //能够提供方向信息
                pNames = lm.getProviders(criteria, true);
                tv_result.setText(getProvider());
                break;
            case R.id.btn_three:
                pNames.clear();
                pNames.add(lm.getProvider(LocationManager.GPS_PROVIDER).getName()); //指定名称
                tv_result.setText(getProvider());
                break;
        }
    }

    //遍历数组返回字符串的方法
    private String getProvider(){
        StringBuilder sb = new StringBuilder();
        for (String s : pNames) {
            sb.append(s + "\n");
        }
        return sb.toString();
    }
}

3. Déterminer si le GPS est activé et les deux conditions pour activer le GPS. Cette méthode

La première chose avant d'utiliser le positionnement GPS doit être de déterminer si le GPS a été activé ou disponible s'il n'est pas activé. , nous devons Allumez le GPS pour terminer le positionnement ! AGPS n'est pas pris en compte ici~


1) Déterminer si le GPS est disponible

private boolean isGpsAble(LocationManager lm){
    return lm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)?true:false;
}

2) Détecter que le GPS n'est pas activé , allumez le GPS

Méthode 1 : Activer de force le GPS, inutile après Android 5.0....

//强制帮用户打开GPS 5.0以前可用
private void openGPS(Context context){
    Intent gpsIntent = new Intent();
    gpsIntent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
    gpsIntent.addCategory("android.intent.category.ALTERNATIVE");
    gpsIntent.setData(Uri.parse("custom:3"));
    try {
        PendingIntent.getBroadcast(LocationActivity.this, 0, gpsIntent, 0).send();
    } catch (PendingIntent.CanceledException e) {
        e.printStackTrace();
    }
}

Méthode 2 : Activer la localisation GPS La page de configuration des informations permet aux utilisateurs de l'ouvrir par eux-mêmes

//打开位置信息设置页面让用户自己设置
private void openGPS2(){
    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivityForResult(intent,0);
}

4. Obtenir dynamiquement les informations de localisation

C'est très simple, il suffit d'appeler la méthode requestLocationUpdates pour configurer un LocationListener pour détecter l'emplacement régulièrement !

L'exemple de code est le suivant :

Layout :activity_location.xml:

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

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dp"
        android:textSize="20sp"
        android:textStyle="bold" /></LinearLayout>

LocationActivity.java:

/**
 * Created by Jay on 2015/11/20 0020.
 */
public class LocationActivity extends AppCompatActivity {

    private LocationManager lm;
    private TextView tv_show;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location);
        tv_show = (TextView) findViewById(R.id.tv_show);
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        if (!isGpsAble(lm)) {
            Toast.makeText(LocationActivity.this, "请打开GPS~", Toast.LENGTH_SHORT).show();
            openGPS2();
        }
        //从GPS获取最近的定位信息
        Location lc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        updateShow(lc);
        //设置间隔两秒获得一次GPS定位信息
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 8, new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                // 当GPS定位信息发生改变时,更新定位
                updateShow(location);
            }

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

            }

            @Override
            public void onProviderEnabled(String provider) {
                // 当GPS LocationProvider可用时,更新定位
                updateShow(lm.getLastKnownLocation(provider));
            }

            @Override
            public void onProviderDisabled(String provider) {
                updateShow(null);
            }
        });
    }


    //定义一个更新显示的方法
    private void updateShow(Location location) {
        if (location != null) {
            StringBuilder sb = new StringBuilder();
            sb.append("当前的位置信息:\n");
            sb.append("精度:" + location.getLongitude() + "\n");
            sb.append("纬度:" + location.getLatitude() + "\n");
            sb.append("高度:" + location.getAltitude() + "\n");
            sb.append("速度:" + location.getSpeed() + "\n");
            sb.append("方向:" + location.getBearing() + "\n");
            sb.append("定位精度:" + location.getAccuracy() + "\n");
            tv_show.setText(sb.toString());
        } else tv_show.setText("");
    }


    private boolean isGpsAble(LocationManager lm) {
        return lm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER) ? true : false;
    }


    //打开设置页面让用户自己设置
    private void openGPS2() {
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivityForResult(intent, 0);
    }

}

OK , très simple, car le GPS doit être utilisé à l'extérieur, alors j'en ai profité pour courir au dépanneur et acheter une tasse de thé au lait. Prenez la capture d'écran ci-dessous ~

2.png3..png

4.png

requestLocationUpdates (fournisseur de chaînes, long minTime, float minDistance, LocationListener auditeur)

Lorsque le temps dépasse minTime (unité : millisecondes) ou que la position se déplace dépasse minDistance (unité : mètres), la méthode dans l'écouteur sera appelée pour mettre à jour les informations GPS. Il est recommandé que le minTime ne soit pas inférieur à. 60 000, soit 1 minute, ce qui sera plus efficace et économisera de l'énergie, ajoutez-en autant que vous en avez besoin. Pour mettre à jour le GPS en temps réel, vous pouvez régler minTime et minDistance sur 0

D'ailleurs, n'oubliez pas, vous avez également besoin d'une autorisation :

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

5. avertissement (geofence) )

Eh bien, cela signifie fixer un point Lorsque la distance entre le téléphone et le point est inférieure à la plage spécifiée, le traitement correspondant peut être déclenché ! Un peu comme le géofencing... nous pouvons appeler la méthode addProximityAlert de LocationManager pour ajouter une alerte de proximité ! La méthode complète est la suivante :

addProximityAlert(double latitude,double longitude,float radius,long expiration,PendingIntent intent)

Description de l'attribut :

  • latitude : Précisez la longitude du point fixe
  • longitude : Précisez la latitude du point fixe
  • rayon  : Spécifiez la longueur du rayon
  • expiration : spécifie le nombre de millisecondes après lequel l'avertissement de proximité expirera -1 signifie qu'il n'expirera jamais
  • <🎜. >intent : ce paramètre précise Le composant correspondant à l'intent est déclenché à l'approche du point fixe

L'exemple de code est le suivant :

ProximityActivity.java:

/**
 * Created by Jay on 2015/11/21 0021.
 */
public class ProximityActivity extends AppCompatActivity {
    private LocationManager lm;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_proximity);
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //定义固定点的经纬度
        double longitude = 113.56843;
        double latitude = 22.374937;
        float radius = 10;     //定义半径,米
        Intent intent = new Intent(this, ProximityReceiver.class);
        PendingIntent pi = PendingIntent.getBroadcast(this, -1, intent, 0);
        lm.addProximityAlert(latitude, longitude, radius, -1, pi);
    }
}

Vous devez également enregistrer un récepteur de diffusion :

ProximityReceiver.java:

/**
 * Created by Jay on 2015/11/21 0021.
 */
public class ProximityReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        boolean isEnter = intent.getBooleanExtra( LocationManager.KEY_PROXIMITY_ENTERING, false);
        if(isEnter) Toast.makeText(context, "你已到达南软B1栋附近", Toast.LENGTH_LONG).show();
        else Toast.makeText(context, "你已离开南软B1栋附近", Toast.LENGTH_LONG).show();
    }
}

N'oubliez pas de vous inscrire :

<receiver android:name=".ProximityReceiver"/>

Lancer le rendu :

PS : Ok, j'ai mis 10m, mais quand j'ai marché de B1 à D1, c'était plus de 10m... C'est arrivé il pleut

6.png6.png


6. Téléchargez l'exemple de code de cette section

GPSDemo.zip


Résumé de cette section :

D'accord, cette section vous présente quelques utilisations de base du positionnement GPS dans Android. C'est très simple. Veuillez vous référer à la partie contenu. "Android Crazy Lecture Notes" du professeur Li Gang vient d'apporter quelques modifications aux exemples et d'effectuer des tests d'utilisabilité ! C'est tout pour cette rubrique, merci~

6.jpg