Utilisation des capteurs sous Android basé sur les processeurs Intel® Atom™ pour téléphones et tablettes

Auteur

Miao Wei (Intel)

Ce guide fournit aux développeurs une introduction sur le développement de l'utilisateur des capteurs et explique comment utiliser quelques capteurs généralement disponibles sur les téléphones et tablettes basées sur le processeur Intel® Atom™. Nous verrons les capteurs de mouvements, position, et d'environnements. Le GPS n'est pas strictement classé comme un capteur sous Android, il sera également abordé dans ce tutoriel pour les services de localisation. Ce tutoriel a été basé sur Android 4.2 soit Jelly Bean.

- Titre : Utilisation des capteurs sous Android basé sur les processeurs Intel® Atom™ pour téléphones et tablettes

- Auteur : Miao Wei (Intel)

- Parution : 9 décembre 2013

- Licence : Copyright ® 2013 Intel. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Les capteurs Android basés sur les processeurs Intel ® Atom™ pour téléphones et tablettes

- I-A. Android Capteurs Framework

- I-B. Obtenir la configuration des capteurs

- I-C. Systèmes de coordonnées pour les capteurs

- I-D. Méthodes d'écoutes des changements des capteurs

- I-E. Détecteurs de mouvements

- I-E-1. Accéléromètre

- I-E-2. Gyroscope

- I-F. Capteurs de position

- I-F-1. Magnétomètre

- I-F-2. Proximité

- I-G. Capteurs d'environnement

- I-G-1. Capteur de lumière ambiante (ALS)

- I-G-2. Baromètre

- I-H. Les performance des capteurs et optimisation, meilleures pratiques

- II. GPS et Localisation

- II-A. Android services de localisation

- II-B. Obtention des données du GPS

- II-C. Performance du GPS et optimisation, meilleures pratiques

- III. Résumé

- IV. A propos de l'auteur

I - Les capteurs Android basés sur les processeurs Intel ® Atom™ pour téléphones et tablettes

Les téléphones et tablettes Android basés sur les processeurs Intel Atom peuvent supporter un large éventail de capteurs. Ces capteurs sont utilisés pour détecter les changements de mouvements et de position, ainsi que de capturer les paramètres d'environnements ambiants.

Le diagramme de la Figure 1 présente les différents capteurs que nous pouvons trouver sur un appareil Android basé sur les processeurs Intel Atom.

Figure 1. Capteurs présent sur un système Android basé sur les processeurs Intel Atom

Détecteurs de mouvement

Accéléromètre
(TYPE_ACCELEROMETER)

Mesure les accélérations s'agit d'un dispositif en m/s 2

La détection de mouvement

Gyroscope
(TYPE_GYROSCOPE)

Mesure les vitesses de rotation d'un périphérique

Détection de rotation

Capteurs de position

Magnétomètre
(TYPE_MAGNETIC_FIELD)

Mesure des intensités de champ géomagnétique de la Terre en pT

Boussole

Proximité
(TYPE_PROXIMITY)

Mesure la proximité d'un objet en cm

Détection d'objets à proximité

GPS
(Pas un type de android.hardware.Sensor)

Obtient précises géo-lieux du dispositif

Détection précise de géo-localisation

Capteurs d'environnement

SLA
(TYPE_LIGHT)

Mesure le niveau de lumière ambiante dans lx

Contrôle de la luminosité de l'écran automatique

Baromètre

Les mesures de la pression de l'air ambiant dans mbar

Détection de l'altitude

Tableau 1.
Types de capteurs pris en charge par la plate-forme Android

I-A - Android Capteurs Framework

Le framework des capteurs sous Android fournit des mécanismes pour accéder aux capteurs et ses données, à l'exception du GPS, qui est accessible par les services de localisation Android. Nous y reviendrons dans le présent document. Le framework des capteurs fait parti du package android.hardware. Le tableau 2 énumère les principales classes et interfaces du framework des capteurs.

Nom

Type

Description

SensorManager

Classe

Permet de créer une instance du service du capteur. Il fournit différentes méthodes pour accéder à des capteurs, l'enregistrement et l'annulation de l'inscription des écouteurs d'événements du capteur, et ainsi de suite.

Capteur

Classe

Permet de créer une instance d'un capteur spécifique.

SensorEvent

Classe

Utilisé par le système pour publier des données de capteurs. Il comprend les valeurs brutes de capteurs de données, le type de capteur, l'exactitude des données, et un horodatage.

SensorEventListener

Interface

Fournit des méthodes de rappel pour recevoir des notifications du SensorManager lorsque les données du capteur ou la précision du capteur a changé.

Tableau 2. Framework de la plate-forme Android pour les capteurs

I-B - Obtenir la configuration des capteurs

Les fabricants de périphériques décident quels capteurs sont disponibles sur l'appareil. Vous devez découvrir quels capteurs sont disponibles lors de l'exécution en invoquant la fonction getSensorList () la classe SensorManager avec un paramètre « Sensor.TYPE_ALL ». Dans l'exemple 1, on affiche une liste des capteurs disponibles avec comme donnée le fabricant, l'énergie et la précision de chaque capteur.

Exemple 1. Un fragment qui affiche la liste des capteurs

package com.intel.deviceinfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Fragment;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class SensorInfoFragment extends Fragment {

private View mContentView;

private ListView mSensorInfoList;
SimpleAdapter mSensorInfoListAdapter;

private List<Sensor> mSensorList;

private SensorManager mSensorManager;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}

@Override
public void onPause()
{
super.onPause();
}

@Override
public void onResume()
{
super.onResume();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mContentView = inflater.inflate(R.layout.content_sensorinfo_main, null);
mContentView.setDrawingCacheEnabled(false);

mSensorManager = (SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE);

mSensorInfoList = (ListView)mContentView.findViewById(R.id.listSensorInfo);

mSensorInfoList.setOnItemClickListener( new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0, View view, int index, long arg3) {

// with the index, figure out what sensor was pressed
Sensor sensor = mSensorList.get(index);

// pass the sensor to the dialog.
SensorDialog dialog = new SensorDialog(getActivity(), sensor);

dialog.setContentView(R.layout.sensor_display);
dialog.setTitle("Sensor Data");
dialog.show();
}
});

return mContentView;
}

void updateContent(int category, int position) {
mSensorInfoListAdapter = new SimpleAdapter(getActivity(),
getData() , android.R.layout.simple_list_item_2,
new String[] {
"NAME",
"VALUE"
},
new int[] { android.R.id.text1, android.R.id.text2 });
mSensorInfoList.setAdapter(mSensorInfoListAdapter);
}

protected void addItem(List<Map<String, String>> data, String name, String value)   {
Map<String, String> temp = new HashMap<String, String>();
temp.put("NAME", name);
temp.put("VALUE", value);
data.add(temp);
}

private List<? extends Map<String, ?>> getData() {
List<Map<String, String>> myData = new ArrayList<Map<String, String>>();
mSensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);

for (Sensor sensor : mSensorList ) {
addItem(myData, sensor.getName(),  "Vendor: " + sensor.getVendor() + ", min. delay: " + sensor.getMinDelay() +", power while in use: " + sensor.getPower() + "mA, maximum range: " + sensor.getMaximumRange() + ", resolution: " + sensor.getResolution());
}
return myData;
}
}

I-C - Systèmes de coordonnées pour les capteurs

Le framework des capteurs nous donne accès aux capteurs en utilisant un système de coordonnées à trois axes où X, Y, et Z sont respectivement représentées par des valeurs [0], [1] et [2] dans l'objet SensorEvent.

Certains capteurs, tels que la lumière, la température, la proximité, et la pression, ne renvoient que des valeurs uniques. Pour ces capteurs, seule la valeur [0] dans l'objet SensorEvent est utilisée.

D'autres capteurs fournissent des données sur ce système standard à trois axes. Ce qui suit est une liste de ces capteurs :

- Accéléromètre

- Capteur de gravité

- Gyroscope

- Capteur de champ géomagnétique

.

Le système de coordonnées avec trois axes associé au capteur est défini par rapport à l'écran de l'appareil à l'état naturel (par défaut) de son orientation. Pour un téléphone, l'orientation par défaut est le portrait, pour une tablette, l'orientation naturelle est le paysage. Quand un dispositif est maintenu dans son orientation naturelle, l'axe des x est horizontal et pointe vers la droite, l'axe y est vertical et pointe vers le haut, et les points z de l'axe sont en dehors de l'écran. La figure 2 montre le système de coordonnées du capteur pour un téléphone, et la figure 3 pour une tablette.

Figure 3.

Le point le plus important en ce qui concerne ces capteurs, est que le système de coordonnées du capteur ne change pas quand l'appareil bouge ou que son orientation est changée.

I-D - Méthodes d'écoutes des changements des capteurs

Le framework des capteurs nous donne accès aux données de ces capteurs via l'objet SensorEvent. C'est une classe permettant de gérer les données spécifiques du capteur par une interface ( SensorEventListener) et de pouvoir s'enregistrer depuis la classe SensorManager pour un capteur spécifique. Ce framework nous informe des changements d'état des capteurs à travers les deux méthodes de SensorEventListener implémenté par cette interface.

onAccuracyChanged()

et

onSensorChanged()

Exemple 2 : Implémentation du SensorDalog utilisé dans l'exemple SensorInfoFragment que nous avons abordé précédemment.

Exemple 2. Un dialogue qui affiche les valeurs des capteurs Sensor Values**

package com.intel.deviceinfo;

import android.app.Dialog;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;

public class SensorDialog extends Dialog implements SensorEventListener {
Sensor mSensor;
TextView mDataTxt;
private SensorManager mSensorManager;

public SensorDialog(Context ctx, Sensor sensor) {
this(ctx);
mSensor = sensor;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDataTxt = (TextView) findViewById(R.id.sensorDataTxt);
mDataTxt.setText("...");
setTitle(mSensor.getName());
}

@Override
protected void onStart() {
super.onStart();
mSensorManager.registerListener(this, mSensor,  SensorManager.SENSOR_DELAY_FASTEST);
}

@Override
protected void onStop() {
super.onStop();
mSensorManager.unregisterListener(this, mSensor);
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}

@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != mSensor.getType()) {
return;
}
StringBuilder dataStrBuilder = new StringBuilder();
if ((event.sensor.getType() == Sensor.TYPE_LIGHT)||
(event.sensor.getType() == Sensor.TYPE_TEMPERATURE)||
(event.sensor.getType() == Sensor.TYPE_PRESSURE)) {
dataStrBuilder.append(String.format("Data: %.3fn", event.values[0]));
}
else{
dataStrBuilder.append(
String.format("Data: %.3f, %.3f, %.3fn",
event.values[0], event.values[1], event.values[2] ));
}
mDataTxt.setText(dataStrBuilder.toString());
}
}

I-E - Détecteurs de mouvements

Les détecteurs de mouvement sont utilisés pour surveiller les mouvements de l'appareil, comme le tremblement, la rotation ou l'inclinaison. L'accéléromètre et gyroscope sont deux détecteurs de mouvement disponibles sur de nombreuses tablettes et téléphones.

Les détecteurs de mouvement fournissent des données à l'aide de capteur du système, où les trois valeurs de l'objet SensorEvent, les valeurs [0], les valeurs de [1], et les valeurs de [2], représentent les x-, y-, et les valeurs z de l'axe, de coordonnées, respectivement, .

Pour comprendre les détecteurs de mouvement et appliquer les données dans une application, il faut appliquer des formules de physique liées à la force, la masse, l'accélération, les lois du mouvement de Newton, et la relation entre plusieurs de ces entités dans le temps. Pour en savoir plus sur ces formules et les relations, reportez-vous à vos manuels de physique favoris ou des sources du domaine public.

I-E-1 - Accéléromètre

L'accéléromètre mesure l'accélération appliquée sur le dispositif, et ses propriétés sont résumées dans le tableau 3.
3.

Capteur

Type

SensorEvent
Données (m / s 2)

Description

Accéléromètre

TYPE_ACCELEROMETER

Les valeurs [0]
Les valeurs [1]
Les valeurs [2]

L'accélération le long de l'axe x
L'accélération le long de l'axe y
L'accélération le long de l'axe z

Tableau 3.
L'accéléromètre

Le concept de l'accéléromètre est dérivé de la deuxième loi de Newton :

a = F/m

L'accélération d'un objet est le résultat de la force extérieure nette appliquée à l'objet. Les forces externes comprennent celui qui s'applique à tous les objets sur la Terre, la gravité. Elle est proportionnelle à la force nette
F
appliquée à l'objet et inversement proportionnelle à
la
masse
m
de l'objet.

Dans notre code, au lieu d'utiliser directement l'équation ci-dessus, nous sommes plus préoccupés par le résultat de l'accélération pendant une période de temps sur la vitesse et la position de l'appareil. L'équation suivante décrit le rapport de
la
vitesse
v
de l'objet 1, sa vitesse initiale
v
0, l'accélération
a
et l'instant
t :

v1 = v0 + at

Pour calculer la position
de
déplacement
s
de l'objet, nous utilisons l'équation suivante :

s = v0t + (1/2)at 2

Dans de nombreux cas, nous commençons par la condition
v
0 égal à 0 (avant que le dispositif commence à se déplacer), ce qui simplifie l'équation :

s = at 2 /2

En raison de la gravité, l'accélération de la pesanteur, représentée par le symbole
g,
est appliquée à tous les objets de la Terre. Indépendamment de la masse de l'objet,
g
ne dépend que de la latitude de l'emplacement de l'objet avec une valeur de l'ordre de 9,78 à 9,82 (m / s2). Nous prendrons la valeur standard pour la gravité g.

g = 9.80665 (m/s2)

Parce que l'accéléromètre renvoie les valeurs en utilisant un dispositif à système de coordonnées multidimensionnel, dans notre code, nous pouvons calculer les distances le long des x, y et z axes à l'aide des équations suivantes:

Sx = AxT2/2

Sy=AyT2/2

Sz=AzT2/2

Où
S

x,

S

y,
et
S

z
sont, respectivement, les déplacements sur l'axe des x, l'axe y et l'axe z, et
A

x,

A

y
et
A

z
sont, respectivement, les accélérations sur l'axe x, axe y, et z axe.
T
est la durée de la période de mesure.

Exemple 3. Instanciation d'un accéléromètre

public class SensorDialog extends Dialog implements SensorEventListener {
&#8230;
private Sensor mSensor;
private SensorManager mSensorManager;

public SensorDialog(Context context) {
super(context);
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
&#8230;
}

Parfois, nous n'utilisons pas les trois valeurs de données de dimension. D'autres fois, nous pouvons également prendre l'orientation de l'appareil en considération. Par exemple, pour une application de labyrinthe, on utilise seulement l'axe des x,l'axe y et l'accélération de la pesanteur pour calculer des directions et des distances de mouvement de la balle sur la base de l'orientation de l'appareil. Le code suivant (exemple 4) décrit cette logique.

Exemple 4. Prise en compte de l'orientation de l'appareil lors de l'utilisation des données d'accéléromètre dans un jeu de labyrinthe

@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) {
return;
}
float accelX, accelY;
&#8230;
//detect the current rotation currentRotation from its &#8220;natural orientation&#8221;
//using the WindowManager
switch (currentRotation) {
case Surface.ROTATION_0:
accelX = event.values[0];
accelY = event.values[1];
break;
case Surface.ROTATION_90:
accelX = -event.values[0];
accelY = event.values[1];
break;
case Surface.ROTATION_180:
accelX = -event.values[0];
accelY = -event.values[1];
break;
case Surface.ROTATION_270:
accelX = event.values[0];
accelY = -event.values[1];
break;
}
//calculate the ball's moving distances along x, and y using accelX, accelY and the time delta
&#8230;
}
}

I-E-2 - Gyroscope

Le gyroscope (ou simplement gyro) mesure le taux du dispositif de rotation autour des axes x, y et z, comme indiqué dans le tableau 4. Les valeurs de données de gyroscope peuvent être positives ou négatives. En regardant à l'origine à partir d'une position le long de la moitié positive de l'axe, si la rotation est dans le sens antihoraire autour de l'axe, la valeur est positive, si la rotation autour de l'axe est dans le sens horaire, la valeur est négative. Nous pouvons également déterminer la direction d'une valeur de gyroscope en utilisant la « règle de droite », illustré à la figure 4.

Figure 4.

Capteur

Type

SensorEvent
Données (rad / s)

Description

Gyroscope

TYPE_GYROSCOPE

Les valeurs [0]
Les valeurs [1]
Les valeurs [2]

taux de rotation autour de l'axe x
taux de rotation autour de l'axe y
taux de rotation autour de l'axe z

Tableau 4.

L'Gyroscope

L'exemple 5 montre comment instancier un gyroscope :

Exemple 5. Instanciation d'un gyroscope

public class SensorDialog extends Dialog implements SensorEventListener {
&#8230;
private Sensor mGyro;
private SensorManager mSensorManager;

public SensorDialog(Context context) {
super(context);
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
mGyro = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
&#8230;
}

I-F - Capteurs de position

Un nombre important de tablettes Android supportent deux capteurs de position : le magnétomètre et les capteurs de proximité. Le magnétomètre mesure les forces de champ magnétique de la Terre le long des axes x, y et z, tandis que le capteur de proximité détecte la distance du dispositif à partir d'un autre objet.

I-F-1 - Magnétomètre

L'utilisation la plus importante du magnétomètre (décrit dans le tableau 5) dans les systèmes Android sert à implémenter la boussole.

Capteur

Type

SensorEvent
Données (pT)

Description

Magnétomètre

TYPE_MAGNETIC_FIELD

Les valeurs [0]
Les valeurs [1]
Les valeurs [2]

L'intensité du champ magnétique terrestre suivant l'axe x
L'intensité du champ magnétique terrestre suivant l'axe y
L'intensité du champ magnétique de la Terre le long de l'axe z

Tableau 5.

Magnétomètre

L'exemple 6 montre comment instancier un magnétomètre.

Exemple 6. Instanciation d'un magnétomètre

public class SensorDialog extends Dialog implements SensorEventListener {
&#8230;
private Sensor mMagnetometer;
private SensorManager mSensorManager;

public SensorDialog(Context context) {
super(context);
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
&#8230;
}

I-F-2 - Proximité

Le capteur de proximité fournit la distance entre l'appareil et un autre objet. L'appareil peut être utilisé pour détecter s'il est tenu à proximité de l'utilisateur (voir le tableau 6), ce qui détermine si l'utilisateur est sur un appel téléphonique pour éteindre par exemple l'écran pendant un appel téléphonique.

Tableau 6: Le détecteur de proximité :

Capteur

Type

SensorEvent
Données

Description

Proximité

TYPE_PROXIMITY

Les valeurs [0]

Distance à partir d'un objet en cm. Certains capteurs de proximité ne déclarent une valeur booléenne pour indiquer si l'objet est assez proche.

L'exemple 7 montre comment instancier un capteur de proximité.

Exemple 7. Instanciation d'un détecteur de proximité

public class SensorDialog extends Dialog implements SensorEventListener {
&#8230;
private Sensor mProximity;
private SensorManager mSensorManager;

public SensorDialog(Context context) {
super(context);
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
&#8230;
}

I-G - Capteurs d'environnement

Les capteurs d'environnement détectent et informent les paramètres de l'environnement ambiant de l'appareil, comme la lumière, la température, la pression ou l'humidité. Le capteur de lumière ambiante (ALS) et le capteur de pression (baromètre) sont disponibles sur de nombreuses tablettes Android.

I-G-1 - Capteur de lumière ambiante (ALS)

Le capteur de lumière ambiante, est décrit dans le tableau 7, il est utilisé par le système pour détecter l'illumination du milieu environnant et pour régler automatiquement la luminosité de l'écran en conséquence.

Tableau 7: Le capteur de lumière ambiante.

Capteur

Type

SensorEvent
Données (lx)

Description

SLA

TYPE_LIGHT

Les valeurs [0]

L'éclairage autour de l'appareil

L'exemple 8 montre comment instancier la SLA.

Exemple 8. Instanciation d'un capteur de lumière ambiante

&#8230;
private Sensor mALS;
private SensorManager mSensorManager;

&#8230;
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
mALS = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
&#8230;

I-G-2 - Baromètre

Les applications peuvent utiliser le capteur de pression atmosphérique (baromètre), décrit dans le Tableau 8, pour le calcul de l'altitude de l'emplacement actuel du dispositif.

Tableau 8: Le capteur de pression de l'atmosphère

Capteur

Type

SensorEvent
Données (lx)

Description

Baromètre

TYPE_PRESSURE

Les valeurs [0]

La pression de l'air ambiant dans mbar

L'exemple 9 montre comment instancier le baromètre.

Exemple 9. Instanciation d'un baromètre

&#8230;
private Sensor mBarometer;
private SensorManager mSensorManager;

&#8230;
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
mBarometer = mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
&#8230;

I-H - Les performance des capteurs et optimisation, meilleures pratiques

Pour utiliser des capteurs dans vos applications, vous devez suivre ces meilleures pratiques :

- Toujours vérifier la disponibilité du capteur spécifique avant de l'utiliser

La plate-forme Android ne nécessite pas l'inclusion ou l'exclusion d'un capteur spécifique sur l'appareil. Avant d'utiliser un capteur à votre demande, toujours vérifier d'abord pour voir si elle est effectivement disponible.

- Désinscrire toujours les listeners des capteurs

Si l'activité qui implémente le listener du capteur devient invisible, ou le dialogue s'arrête, désinscrire le listener du capteur. Il peut être fait par l'intermédiaire de la fonction onPause () de l'activité, ou dans la fonction onStop () du dialogue. Dans le cas contraire, le capteur continue à acquérir des données et, par conséquent décharge la batterie.

- Ne bloquez pas la méthode onSensorChanged ()

La méthode onSensorChanged () est souvent appelée par le système pour informer des données du capteur. Vous devriez mettre aussi peu logique à l'intérieur de cette méthode autant que possible. Des calculs compliqués avec les données des capteurs doivent être déplacés en dehors de cette méthode.

- Toujours tester vos applications de capteurs sur les appareils réels

Tous les capteurs décrits dans cette section sont des capteurs de matériel. L'émulateur Android peut ne pas être capable de simuler les fonctions et les performances d'un capteur particulier.

II - GPS et Localisation

GPS (Global Positioning System) est un système par satellite qui fournit des informations précises de géolocalisation dans le monde. Le GPS est disponible sur de nombreux téléphones Android et tablettes. Dans de nombreuses perspectives, le GPS se comporte comme un capteur de position. Il peut fournir des données de localisation précises pour les applications exécutées sur les appareils. Sur la plate-forme Android, le GPS n'est pas directement géré par le framework du capteur. Mais, le service de localisation Android accède et transfère les données du GPS à une application via des listeners.

Cette section ne traite que les GPS et les services de localisation d'un point de vue du capteur de matériel. Les stratégies complètes de localisation offertes par Android 4.2 basé sur des processeurs Intel Atom est un sujet beaucoup plus vaste et se trouve hors de la portée de cet article.

II-A - Android services de localisation

L'utilisation du GPS n'est pas le seul moyen d'obtenir des informations de localisation sur un appareil Android. Le système peut également utiliser la connexion Wi-Fi , les réseaux cellulaires ou d'autres réseaux sans fil pour obtenir l'emplacement actuel de l'appareil. Le GPS et les réseaux sans fil (y compris le Wi-Fi et les réseaux cellulaires) agissent comme des « fournisseurs d'emplacement » pour les services de localisation Android. Le tableau 9 répertorie les principales classes et interfaces utilisées pour accéder à des services de localisation Android.

Table 9: The Android Platform Location Service

Tableau 9: Le service de localisation plateforme Android

Nom

Type

Description

LocationManager

Classe

Permet d'accéder à des services de localisation. Fournit différentes méthodes pour demander des mises à jour de localisation périodiques pour une application, ou d'envoyer des alertes de proximité

LocationProvider

Classe abstraite

La classe super abstraite pour les fournisseurs d'emplacement

Emplacement

Classe

Utilisée par les fournisseurs d'emplacement pour encapsuler des données géographiques

LocationListener

Interface

Permet de recevoir des notifications de localisation de la LocationManager

II-B - Obtention des données du GPS

Similaire au mécanisme de l'aide du framework du capteur pour accéder aux données, l'application implémente plusieurs méthodes définies dans l'interface LocationListener pour recevoir des mises à jour de localisation du GPS. La classe LocationManager envoie des notifications du GPS, lors des mises à jour des données via ces interfaces (la règle «Ne nous appeler pas, nous vous appellerons »).

Pour accéder aux données de localisation GPS depuis une application, vous devez demander l'autorisation d'accès de l'emplacement bien dans votre fichier manifeste Android (Exemple 10).

Exemple 10. Demander à la fin Accès Situation autorisation dans le fichier manifeste

<manifest &#8230;>
&#8230;
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
&#8230;
</manifest>

Exemple 11 montre comment obtenir des mises à jour du GPS et d'afficher la latitude et de la longitude sur un dialogue.

Exemple 11. Une boîte de dialogue qui affiche la position GPS de données

package com.intel.deviceinfo;

import android.app.Dialog;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;

public class GpsDialog extends Dialog implements LocationListener {
TextView mDataTxt;
private LocationManager mLocationManager;

public GpsDialog(Context context) {
super(context);
mLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDataTxt = (TextView) findViewById(R.id.sensorDataTxt);
mDataTxt.setText("...");

setTitle("Gps Data");
}

@Override
protected void onStart() {
super.onStart();
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0, this);
}

@Override
protected void onStop() {
super.onStop();
mLocationManager.removeUpdates(this);
}

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

@Override
public void onProviderEnabled(String provider) {
}

@Override
public void onProviderDisabled(String provider) {
}

@Override
public void onLocationChanged(Location location) {
StringBuilder dataStrBuilder = new StringBuilder();
dataStrBuilder.append(String.format("Latitude: %.3f,   Logitude%.3fn", location.getLatitude(), location.getLongitude()));
mDataTxt.setText(dataStrBuilder.toString());

}
}

II-C - Performance du GPS et optimisation, meilleures pratiques

Le GPS fournit les informations de position les plus précises sur l'appareil. D'autre part, en tant que dispositif matériel, il consomme un surplus l'énergie.Il faut aussi du temps pour que le GPS obtienne le premier emplacement fixe. Voici quelques directives que vous devez suivre lors de l'élaboration du GPS et des applications de géolocalisation :

- Tenez compte de tous les fournisseurs d'emplacement disponibles

En plus de la GPS_PROVIDER, il y a NETWORK_PROVIDER. Si vos applications ont besoin de seulement de données de localisation approximatives, vous pouvez envisager d'utiliser la NETWORK_PROVIDER.

- Utilisez les emplacements en mémoire cache

Il faut du temps pour que le GPS puisse obtenir le premier emplacement fixe. Lorsque votre application est en attente pour que le GPS puisse obtenir une mise à jour de localisation précise, vous pouvez d'abord utiliser les emplacements prévus par la méythode getlastKnownLocation () de la classe LocationManager pour effectuer une partie du travail.

- Réduire la fréquence et la durée des demandes de mise à jour d'emplacement

Vous devez demander la mise à jour de l'emplacement que lorsque cela est nécessaire et sans délai vous désenregistrer une fois que vous n'avez plus besoin de mises à jour de localisation.

III - Résumé

La plate-forme Android fournit des API pour les développeurs afin d'accéder aux capteurs intégrés dans un appareil. Ces capteurs sont capables de fournir des données brutes sur le mouvement de l'appareil actuel, la position et les conditions de l'environnement ambiant avec une grande précision et exactitude. Dans le développement d'applications de capteurs, vous devez suivre les meilleures pratiques pour améliorer la performance et l'efficacité énergétique.

IV - A propos de l'auteur

Miao Wei est un ingénieur logiciel dans le groupe Intel Software and Services.