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.
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.
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.
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.
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.
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.
@
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
“natural
orientation”
//
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.
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 :
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.
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é.
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.
&
#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.
&
#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).
<
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.
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.