Vous êtes sur la page 1sur 56

UNIVERSITÉ MOHAMMED V de Rabat

Faculté des Sciences

Département d'Informatique

Filière Licence Fondamentale

en Sciences Mathématiques et Informatique

PROJET DE FIN D'ETUDES

intitulé :

Réalisation d'une application mobile sous Android pour


la détection de l'hypovigilance chez le conducteur

Présenté par :

Anass Frikh Chaimae Elhadrani


soutenu le 22 Juin 2016 devant le Jury

Mme. Dounia LOTFI Professeur à la Faculté des Sciences - Rabat Encadrant


Mme. Hafssa BENABOUD Professeur à la Faculté des Sciences - Rabat Examinateur

Année universitaire 2015-2016


Remerciement

D'abord, nous remercions DIEU qui garde toujours un ÷il bien veillant sur nous. Avant
d'entamer ce rapport, nous protons de l'occasion pour remercier nos professeurs de nous
avoir incités à travailler en mettant à notre disposition leurs expériences et leurs compé-
tences. En particulier, Madame Dounia Lot, notre encadrant de ce projet, qui a veillé au
bon déroulement de notre travail. Nous la remercions également pour l'aide et les conseils
concernant les missions évoquées dans ce rapport, qu'elle nous a apporté lors des diérents
suivis, et la conance qu'elle nous a témoigné.

i
Dédicaces

On dédie notre Projet de Fin d'études à nos familles avec tous nos sentiments de respect,
de gratitude et de reconnaissance pour tous les sacrices déployées pour nous élever digne-
ment et assurer notre éducations dans les meilleures conditions et aussi à tous nos amis qui
nous ont soutenu de prés ou de loin.
On dédie également notre projet à nos chers professeurs sans exception, pour leurs eorts
leur encourage an de nous assurer une formation solide surtout notre encadrant Dounia
Lot qui nous aide beaucoup lors de l'élaboration de ce projet.

ii
Table des matières

Remerciement i

Dédicaces ii

Table de Figures 1

Introduction 2

1 PARTIE THÉORIQUE 4
1.1 Dénitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.1 Hypovigilance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.2 L'hypovigilance et la fatigue . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Les manifestations de la somnolence au volant . . . . . . . . . . . . . . . . . 5
1.2.1 Les causes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2.2 Les conducteurs les plus exposés à l'hypovigilance au volant . . . . . 6
1.2.3 Comment prévenir l'hypovigilance ? . . . . . . . . . . . . . . . . . . . 6
1.3 Au volant danger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.1 Téléphone au volant . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Respect des distances de sécurité . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4.1 Le temps de réaction . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4.2 La distance de sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5 Qu'est-ce qui diminue la vigilance ? . . . . . . . . . . . . . . . . . . . . . . . 8
1.5.1 Les médicaments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5.2 L'alcool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.6 Statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.6.1 Le nombre d'accident . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.6.2 Comparaison des accidents avant et après un repos . . . . . . . . . . 10
1.6.3 Étude de l'hypovigilance selon l'age . . . . . . . . . . . . . . . . . . . 11
1.7 La modélisation conceptuelle de l'application en UML . . . . . . . . . . . . . 12
1.7.1 Diagrammes modélisés . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2 PARTIE EXPÉRIMENTALE 18
2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

iii
2.2 Les outils utilisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.1 Environnement logiciel . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.2 Environnement matériel . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.3 Les langages utilisés . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3 Une exécution de l'application . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Annexe 28
2.4 Se connecter à l'application . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.5 Dénir une notication pour un temps choisi par l'utilisateur . . . . . . . . 36
2.6 Rejeter les appels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.7 L'alarme automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

Bibliographie 49

iv
Table des gures
1.1.1 La somnolence entre veille et sommeil . . . . . . . . . . . . . . . . . . . . . . 4
1.1.2 Échelle Visuelle Analogique de Somnolence . . . . . . . . . . . . . . . . . . 5
1.1.3 Échelle Visuelle Analogique de fatigue . . . . . . . . . . . . . . . . . . . . . 5
1.5.1 Médicament à éviter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.6.1 Degré de risque en fonction de diérents facteurs . . . . . . . . . . . . . . . 9
1.6.2 Accidents de circulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.6.3 Fréquence avouée de la fatigue et somnolence au volant selon l'âge du conduc-
teur (2012) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.7.1 Diagramme de cas d'utilisation . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.7.2 Diagramme de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.7.3 Diagramme de classes pour le code de l'application . . . . . . . . . . . . . . 14
1.7.4 Diagramme d'activités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3.1 Acceuil de l'application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.2 Page d'inscription . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.3 Page pour la connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.3.4 Alarme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.5 Dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.3.6 Lancement de notication . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

1
Introduction

L'une des axes les plus importants de recherche, dans le domaine de transports, a été
la détection de l'hypovigilance du conducteur automobile, car celle-ci est la première cause
directe ou indirecte d'accidents routières. Plus généralement, la somnolence reste un sujet
sous-estimé, social et culturel, qui constitue à la fois un enjeu de sécurité routière et de santé
publique.
La mortalité et l'invalidité résultant des accidents sont les conséquences les plus tragiques
de la somnolence mais son impact économique n'est pas négligeable. Mieux connaître ce phé-
nomène permettra de mettre en place de nouvelles stratégies de prévention, an de réduire
le nombre de victimes.
Il existe aussi des facteurs sur la somnolence au volant. Le comportement du conduc-
teur, avant et pendant le voyage, peut aggraver la fatigue liée à la conduite elle-même,
en particulier sur route monotone, et générer un état somnolent. L'inuence des facteurs
comportementaux des conducteurs sur leur vigilance a été étudiée. Des recherches récentes
montrent qu'une seule nuit de privation partielle de sommeil peut aecter les capacités à la
conduite.
Seuls les conducteurs sont responsables de leur état de vigilance au volant. C'est pour-
quoi, un eort est porté sur leur sensibilisation, an qu'ils changent leur comportement et
adoptent une attitude plus responsable. Des conseils leur sont dispensés notamment sur la
nécessité de préparer leur voyage, d'éviter les tranches horaires à risque, et de choisir l'atti-
tude appropriée quand la somnolence se manifeste, en particulier s'arrêter pour une courte
sieste.
Plusieurs méthodes sont utilisées actuellement pour mesurer la somnolence des conduc-
teurs. Les méthodes dites  objectives , bien que ables, sont réalisées pour la plupart en
laboratoire et ne sont pas reproductibles en conditions réelles de conduite. Les méthodes dites
 subjectives , plus faciles à mettre en place, présentent l'inconvénient de l'auto-appréciation
du conducteur et ne permettent pas de diagnostic en soi.[1]
Chacun de ces outils apporte des éléments d'information complémentaires mais présente
aussi des limites, soit de coût, soit de mise en ÷uvre. En dénitive, la somnolence en tant
que telle est compliquée à mesurer au volant et il est donc dicile de connaître l'état exact
d'un conducteur avant un accident de la circulation.
Dans ce rapport, nous allons détailler la conception de notre projet qui consiste à eec-
tuer une application Android dont l'objectif est de représenter un soutien pour lutter contre
ce phénomène. Pour traiter ce sujet, nous avons respecté un certain planning : qui présente

2
le fonctionnement global du programme.
 Dans le premier chapitre, nous allons présenter une explication sur hypovigilance : la
dénition, les Statistiques et même une modélisation conceptuelle en UML.
 Dans Le deuxième chapitre nous allons décrire les diérents outils utilisés avec une
petite démonstration sur l'application.

3
Chapitre 1
PARTIE THÉORIQUE

1.1 Dénitions
1.1.1 Hypovigilance

Hypovigilance : État intermédiaire entre la veille et le sommeil durant lequel l'organisme


a ses facultés d'observation et d'analyse très réduites[2].
Bien Eectivement, il s'agit ici de la transition entre les deux états fondamentaux que sont
l'éveil et le sommeil. Cette transition est involontaire et accompagnée d'une baisse de vigi-
lance, c'est-à-dire de la capacité à porter son attention sur une tâche. Il faut faire attention
à diérencier l'hypovigilance de la fatigue. Le terme de fatigue correspond à un épuisement
du corps après une activité soutenue trop longue. Elle existe sous deux formes : physique
et mentale. Ces deux formes ne sont d'ailleurs pas forcément liées. La fatigue nécessite du
repos, ce qui n'est pas forcément synonyme de sommeil. Elle engendre cependant une baisse
de la capacité à maintenir son attention et à se concentrer car comme le corps a besoin de
repos, il y a moins de ressources disponibles. L'hypovigilance n'est donc qu'une conséquence
de la fatigue. On préférera donc parler de niveau d'éveil.
La somnolence est un sommeil rapidement invincible, mais peu profond, qui se manifeste en
dehors des heures habituelles. L'alternance veille-sommeil est soumise à un rythme chrono
biologique. Ce rythme nous impose des périodes de veille et de sommeil au cours d'une
journée, avec 2 moments favorables au sommeil :
 La nuit : la somnolence est maximale entre 1h et 5h du matin.
 En début d'après-midi, entre 13h et 17h. C'est l'heure de la sieste !

Figure 1.1.1  La somnolence entre veille et sommeil

4
Figure 1.1.2  Échelle Visuelle Analogique de Somnolence

1.1.2 L'hypovigilance et la fatigue

La fatigue est une sensation d'aaiblissement physique ou moral qui survient à la suite
d'un eort soutenu. Seul le repos permet de répondre ecacement à ce besoin en restaurant
un bon niveau de forme et de performance (qui est donc le contraire de la fatigue). [3] La
fatigue nerveuse, par exemple, se manifeste par une baisse de l'attention et de la concentration
qui survient toutes les deux heures. C'est à l'origine du rythme des récréations à l'école, et
de la distance entre deux aires de repos sur l'autoroute.

Figure 1.1.3  Échelle Visuelle Analogique de fatigue

1.2 Les manifestations de la somnolence au volant


L'hypovigilance lors de la conduite automobile se manifeste par :
 Une lenteur de réaction face à un obstacle.
 Des dicultés à maintenir une vitesse constante.
 Des erreurs de coordination.
 Une inattention à la signalisation.
 Une incapacité à pouvoir maintenir la trajectoire du véhicule (écarts successifs).
 Des changements de voie involontaire.

5
 Des périodes d'absence (aucun souvenir des derniers kilomètres parcourus).
 Des bâillements, une diculté à garder les yeux ouverts et la tête droite, un désir de
changer fréquemment de position.
 Des hallucinations ou illusions (par exemple : percevoir faussement la présence d'un
animal sur la route.).
 Des périodes de  micro-sommeils  (de 1 à 5 secondes).

1.2.1 Les causes

Les accidents liés à l'hypovigilance pendant la conduite se produisent souvent sur les
autoroutes (monotonie), mais aussi sur les routes principales voire à l'intérieur des localités.
Ils surviennent aussi bien de jour que de nuit.
Un véhicule dont le conducteur s'est endormi quitte la route sans être freiné, percute des
obstacles, dérape ou fait un tonneau.
L'hypovigilance au volant est liée à deux principales causes. La fatigue excessive ou la som-
nolence est l'une d'entre elles. Elle concerne en particulier les conducteurs jeunes qui sortent
pendant le week-end et reprennent le volant au petit matin après une nuit blanche, peut-être
sous l'eet de l'alcool. Elle touche cependant aussi des personnes ayant des horaires irrégu-
liers, dont le cycle sommeil/veille est perturbé. [4]
La seconde cause de l'hypovigilance au volant concerne plutôt des personnes d'âge moyen.
La statistique montre que les accidents surviennent surtout dans le courant de l'après-midi.
Dans ce cas, des troubles du sommeil, en particulier l'apnée du sommeil ou maladie de rone-
ment, peuvent jouer un rôle. Cette dernière se traduit par des pauses respiratoires répétées et
plus ou moins longues au cours du sommeil, d'où une perturbation de la qualité du sommeil
et une fatigue diurne chronique. On estime qu'en Suisse, l'apnée du sommeil touche quelque
150000 personnes.

1.2.2 Les conducteurs les plus exposés à l'hypovigilance au volant

 Les conducteurs de moins de 25 ans, particulièrement les hommes, parvenant rarement


à satisfaire un plus grand besoin de sommeil.
 Les travailleurs à horaires irréguliers, en permanence en manque de sommeil. Une
somnolence excessive au volant multiplie par 8 le risque de survenue d'accident.
 Les adultes de plus de 50 ans, qui sourent souvent de troubles du sommeil pouvant
altérer leur vigilance.[5]

1.2.3 Comment prévenir l'hypovigilance ?

Avant de prendre la route : dormir susamment et manger convenablement


L'être humain est un animal diurne, la nuit est faite pour dormir. Il est donc préférable de
respecter son rythme biologique pour satisfaire son besoin naturel de sommeil. Qu'elle soit

6
due à une mauvaise qualité ou à une quantité insusante de sommeil, la  dette de sommeil
 favorise les états de somnolence. Plusieurs nuits consécutives écourtées de 2 heures de
sommeil ont le même résultat que si vous preniez le volant après une nuit blanche.
Nos conseils : levez-vous à l'heure habituelle, choisissez un horaire de départ adapté à vos
habitudes de sommeil et alimentez-vous sainement (légumes, fruits, viande...).[6]
Pendant le trajet : faire des pauses régulières
Faites des pauses toutes les deux heures sur une aire de repos ou de service. Protez-en pour
marcher, vous aérer et vous restaurer légèrement, si nécessaire. Hydratez-vous régulièrement,
en buvant de l'eau ou une boisson stimulante, comme le thé ou le café. Une idée à retenir,
même si vous êtes proche de votre destination ! En eet, 65% des accidents corporels ont lieu
à moins de 15 kilomètres du domicile et la plupart des accidents liés à la fatigue surviennent
sur des trajets de moins de 2h.

1.3 Au volant danger


Rien de plus fondamental en sécurité que la vigilance au volant. Retenons que les troubles
de la vigilance sont maximum en début d'après-midi, juste après le déjeuner, et au milieu de
la nuit lors d'une conduite, et qu'ils peuvent être lourds de conséquences.

1.3.1 Téléphone au volant

Que ce soit pour des trajets domicile/travail ou des missions professionnelles, sur au-
toroute, les conducteurs utilisent leur téléphone en conduisant, pour passer des appels, y
répondre ou rédiger des SMS.

Les conducteurs en mission professionnelle déclarent :


 Pour huit sur dix (80, 4%) téléphoner au volant.
 Plus d'un sur deux (53, 8%) lire les SMS reçus.
 Plus d'un tiers (34, 2%) envoyer des SMS en conduisant.
Les conducteurs sur les trajets domicile/travail déclarent :
 Pour six sur dix (60, 6%) téléphoner au volant.
 Près d'un tiers (28, 6%) lire les SMS reçus.
 Plus d'un sur dix (12, 4%) envoyer des SMS en conduisant.[7]

1.4 Respect des distances de sécurité


1.4.1 Le temps de réaction

Un conducteur surpris par un événement ne modie pas immédiatement la conduite de son


véhicule, il le fait toujours avec un certain retard : la durée moyenne du temps de réaction est
évaluée à 1 seconde pour un conducteur vigilant, durée pendant laquelle le véhicule continue
d'avancer à la même vitesse. Ainsi un véhicule parcourt-il chaque seconde 15 m à 50 km/h,

7
27 m à 90 km/h ou encore 39 m à 130 km/h.[8]
L'÷il voit le danger et transmet l'information au cerveau qui analyse la situation et qui doit
prendre une décision. La fatigue, la somnolence et les produits psycho actifs (stupéants,
alcool, médicaments) augmentent le temps de réaction.

1.4.2 La distance de sécurité

Il faut donc toujours conserver une distance de sécurité égale à celle qui est parcourue en
2 secondes. De la sorte, en ne se rapprochant jamais trop des autres, on conserve un espace
confortable qui laisse le temps de modier l'allure ou la trajectoire en cas de besoin.[9]

1.5 Qu'est-ce qui diminue la vigilance ?


Plusieurs facteurs peuvent altérer la vigilance que ce soit au volant ou en toutes circons-
tances (travail, vélo). La fatigue, l'alcool, certains médicaments et les stupéants, ne sont
pas à négliger.

1.5.1 Les médicaments

Même prescrits par un médecin, certains médicaments tels les somnifères, tranquillisants,
entraînent des troubles de la vigilance. Ces derniers sont signalés sur les boîtes des médica-
ments concernés par le pictogramme suivant :

Figure 1.5.1  Médicament à éviter

1.5.2 L'alcool

Conduire un véhicule est exigeant. Nous devons en tout temps être attentifs et capables
de bien percevoir tout ce qui bouge autour de nous et d'anticiper certains événements. Nous
devons également savoir juger, prendre des décisions rapidement et surtout savoir coordonner
nos actions ecacement. Cela implique donc d'être en pleine possession de toutes nos facultés.
Voilà pourquoi il est si important de ne pas associer l'alcool à la conduite d'un véhicule. Les
eets de l'alcool sont progressifs et commencent dès les premières consommations. Avec
seulement 30 mg d'alcool dans le sang, le comportement de l'individu change et après 50 mg,
les eets sur la conduite d'un véhicule sont déjà signicatifs.[10]

8
1.6 Statistiques
Il est très dicile d'eectuer une mesure directe de la prévalence de la conduite en état
d'hypovigilance car il n'est pas un état facilement observable. Il s'agit d'un phénomène
complexe dont les manifestations physiques vont varier d'un individu à l'autre. D'après ces
diérentes études basées :

1.6.1 Le nombre d'accident

Figure 1.6.1  Degré de risque en fonction de diérents facteurs


Description

Ce graphe met en évidence qu'un taux d'alcoolémie de 0,5 g/l multiplie par deux le risque
d'accident comparé au taux zéro d'un conducteur à jeun. Le risque d'accident est 10 fois plus
élevé avec un taux de 1,1 g/l et 40 fois plus élevé avec un taux de 1,6 g/l. Les conducteurs
masculins de 25 ans et moins présentent également un risque d'accident signie activement
plus élevé.

9
1.6.2 Comparaison des accidents avant et après un repos

Figure 1.6.2  Accidents de circulation

Description

l'étude a montré que le nombre de collisions, dues ou non à l'hypovigilance, diminue sur les
tronçons autoroutiers disposant d'aires de repos. La réduction du nombre d'accidents non
liés à la fatigue est moindre et non signicative. Ces conclusions prouvent l'utilité des aires
de repos sur les autoroutes et la nécessité d'en augmenter le nombre.

10
1.6.3 Étude de l'hypovigilance selon l'age

Figure 1.6.3  Fréquence avouée de la fatigue et somnolence au volant selon l'âge du conduc-
teur (2012)

Description

L'âge a aussi été identié comme un facteur important. Les conducteurs entre 18 et 49 ans
déclarent signicativement plus souvent avoir conduit en état de fatigue/de somnolence que
les +50 ans. De plus, les 2 groupes les plus âgés dièrent également signicativement l'un
de l'autre.

11
1.7 La modélisation conceptuelle de l'application en
UML
1.7.1 Diagrammes modélisés

Diagramme de cas d'utilisation

Figure 1.7.1  Diagramme de cas d'utilisation

Description
Ce système permet à l'utilisateur de stocker ses dates importantes concernent sa voiture, et
pour que cette opération soit sécurisée, elle nécessite par conséquent une authentication.

12
Diagramme de Classes

Figure 1.7.2  Diagramme de classes

Description
Une personne est identiée par un login et un mot de passe, il peut être un appelant ou
bien un conducteur. L'appelant utilise son Smartphone pour passer des appels par exemple.
Le conducteur utilise l'application qui est caractérisée par son nom pour stocker ses dates
concernant sa voiture, les autres méthodes de l'application sont automatiques.

13
Diagramme de classes pour le code de l'application

14

Figure 1.7.3  Diagramme de classes pour le code de l'application


Description de diagramme
- HomeActivity est une activité qui possède deux boutons un pour SignIn et l'autre pour
SignUp .
- SignInActivity est une activité qui vérie depuis la BDAssistant les données saisies et lance
le MainActivity.
- SignUpActivity est une activité qui stocke les données dans BDAssistant.
- BDassistant est une classe qui hérite de SQLiteOpenHelper et qui permet de créer une
nouvelle base de donnée on se basons sur les opérations de base de données qui sont dans la
classe BDconnexion.
- MainActivity est une activité qui permet d'arrêté l'alarme et redirigé vers la classe Noti-
fActivity.
- NotifActivity est une activité qui permet de stocké les dates et congure une alarme depuis
la TacheAlarm.
- Lorsque la date arrive la classe NotifService qui est un service lance une notication.
- Lorsque la notication est cliquée la classe secondActivity qui est une activité aussi est
lancée.

15
Diagramme d'activités

Figure 1.7.4  Diagramme d'activités

Description
En considérant que le processus de connexion et de stockage des dates dans notre application
se fait de la façon suivante :
- L'utilisateur demande à l'application la page d'authentication.
- Cette dernière ache la page.
- L'utilisateur saisit son nom et son mot de passe, puis il clique sur le bouton.
- Application vérie les données, s'ils sont incorrects, l'utilisateur est invité à créer un
compte.
- Dans ce cas là, l'utilisateur demande la page de création d'un nouveau compte.
- Application ache cette page.
- L'utilisateur entre ses données.
- Application stocke ces dernières dans la base de données.
- Si les données saisies par l'utilisateur sont correctes, l'application lance la page d'accueil.
- Ce dernier stock les dates.
- L'application congure une alarme pour cette date.
- Lorsque cette dernière arrive l'application ache une notication.
16
Diagramme de séquence système

Figure 1.7.5  Diagramme de séquence


Description
L'utilisateur se connecte à l'aide de l'interface de connexion (login page), cette dernière
envoie les données saisies vers la base de données pour les vérier, s'ils ne sont pas correctes
la base de données informe la page login que les données sont fausses, puis la page notie
l'utilisateur, dans le cas contraire l'utilisateur est redirigé vers la page d'accueil, donc il peut
sélectionner une date pour la stocker, l'application congure alors une alarme ,dès que cette
date arrive l'application ache une notication.

17
Chapitre 2
PARTIE EXPÉRIMENTALE

2.1 Introduction
Dans ce chapitre, on va entamer les outils utilisés dans le développement de notre appli-
cation, les langages de programmation orienté objet et de balisage utilisées, et leur fonction-
nement en utilisant des captures d'écran.

2.2 Les outils utilisés


2.2.1 Environnement logiciel

Dans le développement de notre application on a utilisé les logiciels suivants :


Android Studio : est basé sur IntelliJ IDEA de JetBrains de version 1.5.1. Il permet princi-
palement d'éditer les chiers Java et les chiers de conguration d'une application Android.
Photoshop : un logiciel de retouche,de traitement et de dessin assisté par ordinateur édité
par Adobe.

2.2.2 Environnement matériel

On a développé notre application dans un PC portable ayant les caractéristiques sui-


vantes :
-Disque dur : 700 Gb.
-RAM : 4Gb.
-Processeur : Intel Core i3 CPU 2.30 GHz (4CPUs).
-Plat forme Windows 10.

2.2.3 Les langages utilisés

-Java et XML.

18
2.3 Une exécution de l'application

Figure 2.3.1  Acceuil de l'application

Description
La page d'accueil de notre application se compose de deux boutons principaux (un pour la
connexion et l'autre pour la création d'un nouveau compte). Dans le cas d'une première
utilisation de l'application ou pour un nouvel enregistrement, l'utilisateur doit cliquer sur le
deuxième bouton qui permet de créer un nouveau compte. Si l'utilisateur a déjà un compte,
il sut de cliquer sur le premier bouton pour se connecter.

19
Figure 2.3.2  Page d'inscription

Description
Lorsque l'utilisateur clique sur le bouton  créer un compte  il lance l'interface d'inscription,
elle est pour la première utilisation de l'application, de sorte que pour un nouvel enregistre-
ment, nous allons utiliser cette interface. Elle se compose de 5 champs de texte et un bouton.
Le premier champ concerne le nom d'utilisateur, le deuxième concerne le mot de passe, et
le troisième c'est pour la conrmation de mot de passe d'utilisateur ; ce dernier est obligé
de remplir ces 3 champs de texte, le quatrième et le cinquième champ sont optionnelles, ils
servent à la marque de voiture et le type de carburant. Lorsque tous les champs sont remplis
l'utilisateur clique sur le bouton  créer son compte , les données d'utilisateur seront stocker
dans la base des données SQLite d'android.

20
Figure 2.3.3  Page pour la connexion

Description
La page de connexion dans notre application se compose de deux champs de texte et un
bouton,le premier pour le nom d'utilisateur qui est déjà stocké dans la base de données,le
deuxième c'est pour le mot de passe. Après avoir entrer le nom et le mot de passe,l'utilisateur
clique sur le bouton  CONNEXION ,si les données sont correctes,l'interface principale
de notre application se lance automatiquement, sinon l'utilisateur est obligé de réécrire de
nouveau son nom et son mot de passe.

21
Figure 2.3.4  Alarme

Description
Lorsque le conducteur est connecté, il va utilisé l'interface principale de notre application qui
se compose de trois boutons, le premier bouton permet d'arrêter l'alarme qui se déclenche
de façon automatique chaque 2h, le deuxième c'est pour stocker les dates, et le dernier c'est
un raccourci vers les contacts stocké sur le Smartphone.

22
Figure 2.3.5  Dates

Description
Pour faire un rappel sur une date importante l'utilisateur est invité à choisir une date depuis
cette interface, elle se compose d'une DatePicker et de deux boutons, un pour sélectionner
la date et l'autre pour se diriger vers la page suivante. Après avoir choisi la date un toast
s'ache pour informer l'utilisateur qu'une notication va se lancer lorsque la date arrive.

23
Figure 2.3.6  Lancement de notication

Description
Une notication dans la barre d'état s'ache. Lorsque l'utilisateur clique sur la notication
une nouvelle interface est ouverte.

24
Figure 2.3.7  Détails sur la notication

Description
Lorsque l'utilisateur appuie sur la notication dans la barre d'état il lance cette interface.
Dans l'arrière plan il y'a un texte qui donne plus de détails sur la notication. Et il y'a un
bouton qui permet de lancer l'interface principale de l'application.

25
Figure 2.3.8  Message envoyé par l'application

Description
Si l'utilisateur reçoit un appel au moment où l'application est déjà lancée, cette dernière
va rejeté et envoyé un message d'une façon automatique à l'appelant pour l'informer que
l'utilisateur est en train de conduire sa voiture.

26
Conclusion et Perspectives
Dans cette mémoire nous avons abordé les diérents facteurs de l'hypovigilance, ses
causes, ainsi des statistiques qui montrent le danger de ce phénomène, et pour lutter contre
ce problème, nous avons proposé une application nommé  inyourcar  pour présenter un
soutien pour les conducteurs mais pas une solution et elle ne remplace jamais un état d'éveil
permis par un bon sommeil réparateur.
Pour améliorer notre application nous pensons à ajouter des nouveaux méthodes pour
que notre application par exemple sera capable de détecter l'÷il, et saura se faire remarquer
s'il constate que les paupières se font lourdes. L'inconvénient de cette méthode réside dans
le fait que le Smartphone doit pouvoir être installé sur le pare-brise pour qu'il soit en visuel
total avec les yeux.

Figure 2.3.9  Détection faciale d'un conducteur

27
Annexe

2.4 Se connecter à l'application


Nous avons utilisé 5 classes pour la connexion dans notre application.
HomeActivity.java

Dans cette classe on a implémenté la fonction de boutons onClik, qui est utilisé pour
l'option 'Connexion' et 'Créer un compte', aussi on a créé une instance de la base de donnée
SQLite.

package com.pfe.inyourcar;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class HomeActivity extends AppCompatActivity {

Button btnSignIn,btnSignUp;
BDconnexion bdconnexion;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// créer une instance de base de données SQLite


bdconnexion=new BDconnexion(this);
bdconnexion=bdconnexion.ouvrir();

28
// Obtenez la référence des boutons
btnSignIn=(Button)findViewById(R.id.buttonSignIN);
btnSignUp=(Button)findViewById(R.id.buttonSignUP);

btnSignUp.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
//intent permet la communication entre deux classes
/// Créer Intent pour Activité SignUP et démarrer cette activité
Intent intent = new Intent(HomeActivity.this,SignUPActivity.class);
startActivity(intent);
}
});
btnSignIn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
//Créer Intent pour Activité SignIN et démarrer cette activité
Intent intent = new Intent(HomeActivity.this,SignINActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// Fermer la base de données
bdconnexion.fermer();
}
}

SignUPActivity.java

Après le clic sur l'option 'créer un compte' depuis la page d'accueil.

package com.pfe.inyourcar;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

29
import android.widget.Toast;

public class SignUPActivity extends Activity {


EditText editTextUserName,editTextPassword,editTextConfirmPassword,marque,carburant;
Button btnCreateAccount;

BDconnexion bdconnexion;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.signup);

// obtenir instance de base de données de connexion


bdconnexion=new BDconnexion(this);
bdconnexion=bdconnexion.ouvrir();

editTextUserName=(EditText)findViewById(R.id.editTextUserName);
editTextPassword=(EditText)findViewById(R.id.editTextPassword);
editTextConfirmPassword=(EditText)findViewById(R.id.editTextConfirmPassword);
marque= (EditText) findViewById(R.id.textView);
carburant= (EditText) findViewById(R.id.textView2);

btnCreateAccount=(Button)findViewById(R.id.buttonCreateAccount);
btnCreateAccount.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {


// TODO Auto-generated method stub

String userName=editTextUserName.getText().toString();
String password=editTextPassword.getText().toString();
String confirmPassword=editTextConfirmPassword.getText().toString();
String Marque=marque.getText().toString();
String Carburant=carburant.getText().toString();

// vérifier si l'un des champs sont vide


if(userName.equals("")||password.equals("")||confirmPassword.equals(""))
{
Toast.makeText(getApplicationContext(), "Champ vide", Toast.LENGTH_LONG).show();
return;

30
}
// vérifier si les deux mot de passes correspond
if(!password.equals(confirmPassword))
{
Toast.makeText(getApplicationContext(), "Le mot de passe ne correspond pas", Toast
.LENGTH_LONG).show();
return;
}
else
{
// Save the Data in Database
bdconnexion.insererEntree(userName, password,Marque,Carburant);
Toast.makeText(getApplicationContext(), "Compte créé avec succès ", Toast.LENGTH_LONG)
.show();
}
}
});
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();

bdconnexion.fermer();
}
}

SignINActivity.java

Après le clic sur l'option 'connexion' depuis la page d'accueil.


package com.pfe.inyourcar;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class SignINActivity extends Activity {

31
EditText editTextUserName, editTextPassword;
Button btnSignIn;
BDconnexion bdconnexion;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);

// obtenir instance de base de données


bdconnexion = new BDconnexion(this);
bdconnexion = bdconnexion.ouvrir();

editTextUserName = (EditText) findViewById(R.id.editTextUserNameToLogin);


editTextPassword = (EditText) findViewById(R.id.editTextPasswordToLogin);

btnSignIn = (Button) findViewById(R.id.buttonSignIn);


btnSignIn.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {


// obtenir le nom d'utilisateur et mot de passe
String userName = editTextUserName.getText().toString();
String password = editTextPassword.getText().toString();

// Recuperation du mot de passe stocké dans la base de données


String storedPassword = bdconnexion.getSinlgeEntry(userName);

// vérifier si le mot de passe stocké dans la base


de données correspond à celui
entré par l'utilisateur
if (password.equals(storedPassword)) {
Toast.makeText(SignINActivity.this, "Redirection...",
Toast.LENGTH_LONG).show();
Intent i = new Intent(SignINActivity.this, MainActivity.class);
startActivity(i);
} else {
Toast.makeText(SignINActivity.this,
"Nom d'utilisateur ou mot de passe ne correspond pas",
Toast.LENGTH_LONG).show();
}
}
});

32
}

@Override
protected void onDestroy () {
// TODO Auto-generated method stub
super.onDestroy();

bdconnexion.fermer();
}
}

BDassistant.java

Cette classe est utilisé pour créer une nouvelle base de données, aussi cette classe permet
de faire la Mise à jour de la version de base de données si nécessaire.

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class BDassistant extends SQLiteOpenHelper {


public BDassistant(Context context, String name,
CursorFactory factory, int version)
{
super(context, name, factory, version);
}
// Appelée lorsque aucune base de données existe dans le disque
// et la classe d'assistance doit être créer un nouveau.
@Override
public void onCreate(SQLiteDatabase _db)
{
_db.execSQL(BDconnexion.DATABASE_CREATE);

@Override
public void onUpgrade(SQLiteDatabase _db,
int _oldVersion, int _newVersion)
{

33
Log.w("TaskDBAdapter", "Upgrading from version "
+ _oldVersion + " to " + _newVersion + ",
which will destroy all old data");
_db.execSQL("DROP TABLE IF EXISTS " + "TEMPLATE");
onCreate(_db);
}
}

BDconnexion.java

Dans cette classe il y'a toutes les opérations de base de données comme(création de la
base de données, insertion des données, Mise à jour des données, suppression des données,
fermeture de la base).

package com.pfe.inyourcar;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
public class BDconnexion
{
static final String DATABASE_NAME = "login.db";
static final int DATABASE_VERSION = 1;
public static final int NAME_COLUMN = 1;
// Créer champ public pour chaque colonne de votre table.
// Déclaration SQL pour Créer une nouvelle base de données
static final String DATABASE_CREATE = "create table "+"LOGIN"+
"( " +"ID"+" integer primary key autoincrement,"+
"USERNAME text,PASSWORD text,MARQUE text,CARBURANT text); ";
public SQLiteDatabase db;
// Contexte de l'application en utilisant la base de données
private final Context context;
private BDassistant bdassistant;
public BDconnexion(Context _context)
{
context = _context;
bdassistant = new BDassistant(context, DATABASE_NAME,
null, DATABASE_VERSION);
}
public BDconnexion ouvrir() throws SQLException
{

34
db = bdassistant.getWritableDatabase();
return this;
}
public void fermer()
{
db.close();
}
public SQLiteDatabase getDatabaseInstance()
{
return db;
}
public void insererEntree(String userName,String password,
String marque,String carburant)
{
ContentValues newValues = new ContentValues();
// Affectez des valeurs pour chaque ligne.
newValues.put("USERNAME", userName);
newValues.put("PASSWORD",password);
newValues.put("MARQUE", marque);
newValues.put("CARBURANT", carburant);

// insérer la ligne dans la table


db.insert("LOGIN", null, newValues);
Toast.makeText(context, "Reminder Is Successfully Saved",
Toast.LENGTH_LONG).show();
}
public int supprimerEntree(String UserName)
{
//String id=String.valueOf(ID);
String where="USERNAME=?";
int numberOFEntriesDeleted= db.delete("LOGIN", where,
new String[]{UserName}) ;
// Toast.makeText(context,
"Number fo Entry Deleted Successfully :
"+numberOFEntriesDeleted, Toast.LENGTH_LONG).show();
return numberOFEntriesDeleted;
}
public String getSinlgeEntry(String userName)
{
Cursor cursor=db.query("LOGIN", null,
" USERNAME=?", new String[]{userName},
null, null, null);

35
if(cursor.getCount()<1) // Nom d'utilisateur n'existe pas
{
cursor.close();
return "NOT EXIST";
}
cursor.moveToFirst();
String password= cursor.getString(cursor
.getColumnIndex("PASSWORD"));
cursor.close();
return password;
}
public void updateEntry(String userName,String password)
{
// Définir le contenu de la ligne mise à jour.
ContentValues updatedValues = new ContentValues();
// Affecter des valeurs pour chaque ligne.
updatedValues.put("USERNAME", userName);
updatedValues.put("PASSWORD",password);

String where="USERNAME = ?";


db.update("LOGIN",updatedValues, where, new String[]{userName});
}
}

2.5 Dénir une notication pour un temps choisi par


l'utilisateur
Ici on va faire une notication pour une date précise lorsqu'elle est sélectionnée par l'uti-
lisateur.

Pour cela on va :
* Créer une activité pour sélectionner une date.
* Créer une alarme pour la date sélectionnée.
* Lorsque cette alarme est déclenchée une notication apparaître dans la barre de système.
* En cliquant sur la notication l'utilisateur est apporté à notre application.

NotifActivity.java

NotifActivity, montre à l'utilisateur une datepicker qui va permettre à ce dernier de choi-


sir une date dans le future qu'on va utiliser comme date de rappel d'alarme.

36
package com.pfe.inyourcar;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.Toast;

import java.util.Calendar;

public class NotifActivity extends AppCompatActivity {

Button btn;

private DatePicker picker;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Obtenez une référence à date picker


picker = (DatePicker) findViewById(R.id.scheduleTimePicker);

btn=(Button)findViewById(R.id.button2);

btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub

Intent intent = new Intent(NotifActivity.this, NotifActivity2.class);


startActivity(intent);
}
});
}

37
/**
* Ceci est le onClick appelé à partir du XML pour définir une nouvelle notification
*/
public void selectionnerDate(View v){
// Obtenir la date depuis notre datepicker
int jour = picker.getDayOfMonth();
int mois = picker.getMonth();
int annee = picker.getYear();
// Créer un nouveau calendrier mis à la date choisie
// nous avons mis le temps à midi
Calendar c = Calendar.getInstance();
c.set(annee, mois, jour);
c.set(Calendar.HOUR_OF_DAY, 12);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);

new TâcheAlarm1(this, c).run();

Toast.makeText(this, "Notification pour : " + jour + "/" + (mois + 1) + "/" + annee,


Toast.LENGTH_SHORT).show();
}

TâcheAlarm.java

Lorsque le système Android déclenche notre alarme, l'intente que nous xons démarre
notre NotifService. La notication apparaîtra dans le menu système pour informer l'utilisa-
teur.

package com.pfe.inyourcar;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;

import java.util.Calendar;

38
public class TâcheAlarm1 implements Runnable {

// La date choisie pour l'alarme


private final Calendar date;
private final AlarmManager am;
private final Context context;

public TâcheAlarm1(Context context, Calendar date) {


this.context = context;
this.am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
this.date = date;
}

@Override
public void run() {

Intent intent = new Intent(context, NotifService.class);


intent.putExtra(NotifService.INTENT_NOTIFY, true);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);
am.set(AlarmManager.RTC, date.getTimeInMillis(), pendingIntent);
}
}

NotifService.java

Ce service est démarré lorsqu'une alarme a été déclenchée. Une notication dans la barre
d'état s'ache. Lorsque l'utilisateur clique sur la notication une nouvelle activité est ou-
verte.

package com.pfe.inyourcar;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

39
public class NotifService extends Service {

// ID unique pour identifier la notification.


private static final int NOTIFICATION = 123;
public static final String INTENT_NOTIFY = "com.pfe.inyourcar.INTENT_NOTIFY";
// Le gestionnaire de notification système
private NotificationManager mNM;

@Override
public void onCreate() {
Log.i("NotifyService", "onCreate()");
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("LocalService", "Received start id " + startId + ": " + intent);

//Si ce service a été lancé par l'intent de la tâcheAlarme alors nous voulons montrer
notre notification
if(intent.getBooleanExtra(INTENT_NOTIFY, false))
showNotification();

// Nous ne nous soucions pas si ce service est arrêté comme nous l'avons déjà livré
notre notification
return START_NOT_STICKY;
}

/**
* Créer une notification et montrer dans la barre d'état du système d'exploitation
glisser vers le bas
*/

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

40
// C'est l'objet qui reçoit les interactions des clients
//private final IBinder mBinder = new ServiceBinder();

private void showNotification() {


// définir son URI, le son est joueé quand il y a une notification
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
// Ceci est le titre de la notification
CharSequence title = "Visite technique!!";
// Ceci est l'icône à utiliser sur la notification
int icon = R.drawable.inc_off_2;
// Ceci est le texte de défilement de la notification
CharSequence text = "Vous devez faire la visite technique de votre voiture aujourd'hui."
// What time to show on the notification
long time = System.currentTimeMillis();

Notification notification ;

// Le PendingIntent pour lancer l'activité si l'utilisateur sélectionne


cette notification
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, SecondActivity1.class), 0);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);


notification = builder.setContentIntent(contentIntent).setSmallIcon(icon)
.setTicker(text)
./*setWhen(time).*/setAutoCancel(true).setContentTitle(title).setContentText(text)
.setSound(soundUri).build();
// Désactivez la notification quand il est pressé
notification.flags |= Notification.FLAG_AUTO_CANCEL;

// Envoyer la notification au système.


mNM.notify(NOTIFICATION, notification);

// Arrêtez le service quand nous avons terminé


stopSelf();
}
}

41
SecondActivity.java

Ceci est l'activité qui est lancée lorsque l'utilisateur appuie sur la notication dans la
barre d'état.
package com.pfe.inyourcar;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class SecondActivity1 extends Activity{

Button btn ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second1);

btn=(Button)findViewById(R.id.butt1);

btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {

Intent intent = new Intent(SecondActivity1.this,


MainActivity.class);
startActivity(intent);
}
});
}

42
2.6 Rejeter les appels
Dans cette partie, on va montrer comment notre application peut rejeter les appels.

ITelephony.java

Dans cette interface il y'a des méthodes utilisables dans la classe TelephonyManager .

package com.pfe.inyourcar;

public interface ITelephony {


boolean endCall();

void answerRingingCall();

void silenceRinger();
}

Appel

Cette classe permet d'une façon automatique de rejeter un appel, et d'envoyer un mes-
sage au appelant pour l'informer que le conducteur est occupé, on utilise ici deux classes
principales TelephonyManager et SmsManager chacune est basée sur un service qui travaille
en arrière plan.Elle hérite de la classe broadcastRaceiver qu'on l'utilise lorsque on obtient
un message a partir de l'extérieur. En donnant des permissions au niveau de manifest.

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.widget.Toast;

import java.lang.reflect.Method;

public class Appel extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {

43
// instancier la classe
TelephonyManager telephone = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
try{
// controller les appel
Class c = Class.forName(telephone.getClass().getName());
// obtenir la classe
Method method = c.getDeclaredMethod("getITelephony");
method.setAccessible(true);// rendre la methode accessible
ITelephony telephony = (ITelephony)method.invoke(telephone);
// obtenir ITelephony interne
Bundle bundle = intent.getExtras();
String Number = bundle.getString(TelephonyManager
.EXTRA_INCOMING_NUMBER);
if(Number!=null)
{
telephony.endCall();
try { SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(Number,
null,"Désolée,je suis entrain de conduire",
null, null);

Toast.makeText(context, "SMS sent.", Toast.LENGTH_LONG).show();


} catch (Exception e) {
Toast.makeText(context,"SMS echouer .", Toast.LENGTH_LONG).show();
e.printStackTrace(); }
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context,"probleme dans systeme .",
Toast.LENGTH_LONG).show();

}
}}

44
2.7 L'alarme automatique
Ici, on va montrer comment programmer une alarme automatique.

AlarmService

Ici, on va établir une communication entre la classe AlarmService et MainActivity,car on


a utilisé une classe AlarmManager qui est basée sur le composant service.

package com.pfe.inyourcar;

import android.app.Service;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.IBinder;

public class AlarmService extends Service {


static Ringtone ringtone;

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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager
.TYPE_ALARM);
ringtone = RingtoneManager
.getRingtone(getApplicationContext(), alarmUri);
ringtone.play();
return START_STICKY;// si le systeme tue le service en relance intent
}
@Override
public IBinder onBind(Intent intent) {
return null;
}// interaction avec service

@Override

45
public void onDestroy() {
super.onDestroy();
}}

MyReceiver

Cette classe java hérite de la classe BroadcastReceiver. La méthode OnReceive() doit


être mis en ÷uvre pour faire certaines tâches. Dans cet exemple, nous démarrons le service
d'alarme.
package com.pfe.inyourcar;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Intent service1 = new Intent(context, AlarmService.class);
context.startService(service1);

}
}

MainActivity

Dans cette classe, on a utilisé la méthode  setRepeating()  qui permet de programmé


une alarme qui se répète d'une façon automatique dans un intervalle de temps régulier.

package com.pfe.inyourcar;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

46
import android.view.View;
import android.widget.AnalogClock;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

Button btn,btn2,bouton1;
AnalogClock analogClock;
AlarmManager alarmManager;
private PendingIntent pendingIntent;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

analogClock = (AnalogClock) findViewById(R.id.analogClock);

btn=(Button)findViewById(R.id.button8);

btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub

Intent intent = new Intent(MainActivity.this, NotifActivity1.class);


startActivity(intent);
}
});

Button button1 = (Button) findViewById(R.id.bco);


button1.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
String myData = "content://contacts/people/";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(myData));

47
startActivity(intent);
}

});

bouton1 = (Button) findViewById(R.id.button5);


alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(
this.getApplicationContext(), 234324243, myIntent, 0);

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
+ (10 * 1000), (AlarmManager.INTERVAL_HALF_HOUR) / 30, pendingIntent);

bouton1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
//alarmManager.cancel(pendingIntent);
//pendingIntent.cancel();
AlarmService.ringtone.stop();
}
});
}
}

48
Bibliographie
[1] Mullens, E. (1998). Somnolence au volant : danger. Neurophysiologie Clinique/Clinical
Neurophysiology, 28(2), 178-179.
[2] Picot, A. (2009). Détection d'hypovigilance chez le conducteur par fusion d'informa-
tions physiologiques et vidéo (Doctoral dissertation, Institut National Polytechnique de
Grenoble-INPG).
[3] Sharabaty, H. (2007). Diagnostic de la somnolence d'un opérateur : analyse automatique
de signaux physiologiques (Doctoral dissertation, Université Paul Sabatier-Toulouse III).
[4] El Ftouh, M., Derradji, A., Jniene, A., Fihry, M. T. E. F. (2013). Étude de la prévalence
et les facteurs de risque de la somnolence au volant dans une population marocaine.
Médecine du Sommeil, 10(4), 141-145.
[5] Gruau, S., et al. "Role de l'entrainement sur la conduite automobile chez le sujet age."
NEUROLOGIE PSYCHIATRIE GERIATRIE 2 (2002).
[6] Arbus, L., Tiberge, M., Serres, A., Rouge, D. (1991). Somnolence et accidents de
la circulation routière. Importance du diagnostic. Neurophysiologie Clinique/Clinical
Neurophysiology, 21(1), 39-43.
[7] Pachiaudi, G. (2001). Les risques de l'utilisation du téléphone mobile en
conduisant(existe-t-il des solutions technologiques adaptatives ?). Synthèse IN-
RETS(Arcueil).
[8] Arbus, L., Tiberge, M., Serres, A., Rouge, D. (1991). Somnolence et accidents de
la circulation routière. Importance du diagnostic. Neurophysiologie Clinique/Clinical
Neurophysiology, 21(1), 39-43.
[9] D'Onghia, F., Delhomme, P., Dubois, N. (2008). Comment persuader les automobilistes
de respecter les limitations de vitesse ? Eets du cadrage et de la présence d'une image
sur les attitudes à l'égard du respect des limitations de vitesse et l'intention de les
respecter. Bulletin de psychologie, (6), 561-576.
[10] Brault, M., Dussault, C., Bouchard, J., Lemire, A. M. (2004, August). Le rôle de l'alcool
et des autres drogues dans les accidents mortels de la route au Québec : Résultats naux.
In Proceedings of the 17th conference on Alcohol, Drugs and Trac Safety (pp. 8-13).

49
50
Résumé :

Ce rapport s'inscrit dans le cadre du projet de n d'études dans la Faculté des Sciences
Rabat, lière science Mathématiques et Informatique.

L'objectif de ce travail consiste à développer une application mobile sous Android pour
la détection de l'hypovigilance chez le conducteur.

Cette application permet de résoudre le problème posé par hypovigilance. Le document


actuel rapporte l'essentiel de la mission accomplie dans le cadre de ce projet.
Ce projet est composé de deux parties :
 Une vue globale sur HYPOVIGILANCE.
 Une démonstration de l'application à l'aide d'Android Studio l'environnement de dé-
veloppement des applications mobiles.

abstract :

This report is part of the end of study project in the Rabat Faculty of Science, SMI sector.

The object of this work is to develop an Android mobile application for hypovigilance
detection in the driver.

The present paper reports the essence of the mission accomplished under this project. So
our project consists of two parts :
 An overall view of hypovigilance.
 A demonstration of the application using Android Studio the ocial integrated deve-
lopment environment (IDE) for Android platform development.

Vous aimerez peut-être aussi