M2 MBDS
2020-2021
DEVELOPPEMENT
MOBILE
DR. KABORE RAOGO
PLAN DU COURS
CM : 12 H
TP : 18H
INTRODUCTION Projet
GENERALITES
ARCHITECTURE ANDROID
DEVELOPPEMENT D’APPLICATION AVEC ANDROID
BIBLIOGRAPHIE
http://developer.android.com/
Support de cours Jean François Lalande – Développement sous Android
Développer des applications mobiles pour les Google phones :
http://kslimi.files.wordpress.com/2011/01/dunod-android.pdf
Développement d’applications Android de M. Dalmau, IUT de Bayonne
OBJECTIFS
Google a réussi à se poser en concurrent sérieux de l'Iphone.
La force d'Android : une plateforme ouverte à tous, tant à l'industrie,
aux développeurs qu'aux utilisateurs eux-mêmes.
être capable de développer une application fonctionnant sur la
plateforme Android en utilisant le SDK fournit par Google.
Connaître les spécificités du développement mobile et en
particulier d'Android
savoir utiliser les fonctionnalités spécifiques aux Smartphones et
Tablettes Android
QUI SUIS-JE?
KABORÉ Raogo
Bac E, Lycée Technique de Bouaké
Licence en Physique Pure, Institut de Mathématique et de Physique (IMP),
Ouagadougou, BF
Ingénieur Informaticien, Institut Africain d’Informatique (I.A.I)
Mastère Spécialisé en Cyber sécurité, Institut Mines-Télécom (Brest, France)
Doctorat Cyber sécurité des Infrastructures Critiques, Institut Mines-Télécom (Brest,
France)
INTRODUCTION
INTRODUCTION
Smartphones & Tablettes
INTRODUCTION
ANDROID QU’Est-ce QUE C’EST?
Système d’exploitation pour terminaux mobiles
Basé sur Linux
Open Source (licence Apache)
INTRODUCTION
FONTIONNALITES
Framework applicatif avec réutilisation et remplacement possible des
composants
ART : Android RunTime (machine virtuelle optimisée pour les
périphériques mobiles)
Navigateur intégré base sur le moteur WebKit (Open Source)
Librairie 2D dédiée
Gestion de la 3D basée sur une implémentation d’OpenGL ES 1.0 (avec
support de l’accélération matérielle)
Base de données SQLite
Gestion des écrans tactiles et du Multitouch
INTRODUCTION
FONTIONNALITES
MultiMedia : support de la plupart des formats classiques d’images, de
vidéos et audios (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
Téléphonie GSM (selon hardware)
Bluetooth, EDGE, 3G et Wi-Fi (selon hardware)
Camera, GPS, compas et accéléromètre (selon hardware)
Environnement de développement riche incluant :
Un émulateur (avec une interface de contrôle)
Des outils de débogage
Outils de profiling mémoire et performance
Un plugin pour l’IDE Eclipse
INTRODUCTION
HISTORIQUE
Développé par la startup Android Inc.
Juillet 2005 : Rachat par Google
Novembre 2007 : Open Handset Alliance (OHA)
- Texas Instruments, Broadcom Corporation, Google, HTC,
Intel, LG, Marvell Technology Group, Motorola, NVidia,
Qualcomm, Samsung Electronics, Sprint Nextel, T-Mobile
- Décembre 2008 : ARM Holdings, Atheros Communications,
Asustek Computer Inc, Garmin Ltd, Softbank, Sony Ericsson,
Toshiba Corp, Vodafone
INTRODUCTION
Concurrents
Apple iPhone OS : un des leaders en téléphonie, fermé...
Windows Phone : stagne, fermé...
Blackberry : en chute
Symbian : passage en open source octobre 2009
INTRODUCTION
PART DE MARCHE DES OS MOBILES
INTRODUCTION
PART DE MARCHE DES OS MOBILES
GENERALITES
VERSIONS D’ANDROID
GENERALITES
VERSIONS D’ANDROID
GENERALITES
Dernière version d'Android : Android 10: Android Q (API 29)
Date sortie : 3 septembre 2019
GENERALITES
PUBLICATION DES APPLICATIONS
Google Play
Marchés alternatifs
GetJar
SlideMe
Amazon App store for Android
F-Droid
AppsLib
AndroidPIT App Center
GENERALITES
GOOGLE PLAY [PLAY STORE]
Plateforme pour distribuer, vendre et faire la publicité de son
application
Il existe plusieurs Android Markets
Google Play est le plus grand et le plus visité
GENERALITES
GOOGLE PLAY [PLAY STORE]
Crée le 22 octobre 2008 sous le nom Android Market
Rebaptisé Play Store le 6 mars 2012
Mars 2009, 2 300 applications
Août 2013, plus de 1 300 000 d’applications
Janvier 2020, plus de 3 000 000 d’applications
GENERALITES
PUBLIER DES APPLICATIONS SUR PLAY STORE
Créer un compte développeur
: https://play.google.com/apps/publish .
25 $ USD de frais à payer une seule fois
70% au développeur 30% à Google
Toutes les applications doivent disposer d’une clé cryptographique
Taille maximale du fichier APK : 50 MB
Barre des 50 milliards de téléchargement franchie
GENERALITES
GOOGLE PLAY
GENERALITES
GOOGLE PLAY
GENERALITES
GOOGLE PLAY – ACHAT DAPPLICATIONS
GENERALITES
GOOGLE PLAY – ACHAT DAPPLICATIONS
ENVIRONNEMENT DE DEVELOPPMENT
OUTILS
Eclipse
SDK Android
ADT : Android Development Tools (plugin eclipse)
AVD : Android Virtual Device
ADB : Android Debug Bridge (ligne de commande)
ARCHITECTURE ANDROID
ARCHITECTURE GENERALE
ARCHITECTURE ANDROID
5 couches
Noyau
Bibliothèques natives (Librairies)
Runtime
Framework
Application
ARCHITECTURE ANDROID
LE NOYAU
ARCHITECTURE ANDROID
LE NOYAU
Android repose sur un noyau Linux version 2.6
Gestion de la sécurité
Gestion de la mémoire
Gestion des processus
Gestion réseau
Drivers
...
Ce noyau agit comme une couche d’abstraction entre le matériel et le
restes des couches applicatives.
ARCHITECTURE ANDROID
LE NOYAU
Noyau Linux 2.6 (mais modifié)
Choisi pour sa stabilité, sa maturité et l’ouverture du code
Principal Changement : Suppression des IPC SysV remplacé par Binder
Binder proche de CORBA.
Economique en ressource dédié aux architectures qui ne reposent pas activement sur
la gestion de processus.
Gestion de la mémoire différente. SHM POSIX mais simplifié.
Partage de mémoire entre processus via Binder
Système embarque oblige l’accès aux journaux ne peut pas se faire via /var/log/*
Intégration d’un logger
En standard pas de fonction pour terminer l’application
Viking Killer (Out Of Memory Management)
ARCHITECTURE ANDROID
LIBRARIES
Elles fournissent un accès direct aux ressources du système
Une couche d’abstraction au Framework Java Android
ARCHITECTURE ANDROID
LIBRARIES
Android inclus un ensemble de librairies C/C++
Utilisées par les applications Android
Accessibles au développeur via le SDK
Quelques-unes de ces librairies
Librairie Système C : une implémentation dérivée de l’implémentation BSC
des librairies standard C (libc)
LibWebCore : Un moteur de navigateur internet moderne utilisé autant pour
navigateur Android que pour les vues web intégrables
SQLite : un système de gestion de base de données relationnel léger et
puissant disponible pour toutes les applications.
ARCHITECTURE ANDROID
ANDROID RUNTIME
ARCHITECTURE ANDROID
ANDROID RUNTIME
ART : Android Runtine Depuis Android 5,0 Lollipop
Compilation AOT (Ahead-Of-Tme)
Compile une SEULE FOIS, AOT
Compilation native
Utilise moins de Threads
Garbage Collector non-bloquant
Adopte l’architecture 64 bits
ARCHITECTURE ANDROID
ANDROID RUNTIME : COMPILATION
Deux passages :
.JAVA vers .CLASS
Concaténation des .CLASS en .DEX
Une application c’est :
Le bytecode DEX
des ressources (images, sons...)
Le tout regroupe dans un package .APK
ARCHITECTURE ANDROID
ANDROID RUNTIME
Android inclus un ensemble de librairies de base proposant ainsi la
quasi-totalité des fonctionnalités disponibles dans le langage de
programmation Java.
Chaque application sous Android utilise sa propre instance d’une
ART.
- Pas de problème d’interaction entres les applications
- Espace protégé
- Pas de risque de plantage général
- D’où la nécessité d’une VM optimisée !
ARCHITECTURE ANDROID
FRAMEWORK APPLICATIF
ARCHITECTURE ANDROID
FRAMEWORK APPLICATIF
Framework écrit en Java.
Fournit tout ce dont les applications ont besoin.
API du Framework décrite dans la documentation du SDK
ARCHITECTURE ANDROID
FRAMEWORK APPLICATIF
Eléments du Framework :
Activity Manager : cycle de vie des applications (backstack).
Assure le multi tâche
Package Manager : Manipulation du format .apk
Window Manager : utilise Surface Manager.
Resource Manager : Tout ce qui n’est pas du code.
ARCHITECTURE ANDROID
FRAMEWORK APPLICATIF
Content Manager : Partage des données entre processus
View System : equivalent d’un toolkit GTK+. Gère le rendu HTML
Telephony Service : fournit l’accès aux services GSM, 3G,GPRS
Location Service : fournit l’accès `à la gestion du GPS.
Bluetooth Service
Wi-Fi Service
Sensor Service
ARCHITECTURE ANDROID
FRAMEWORK APPLICATIF
Plateforme de développement Ouverte
- Permet des applications riches et variées
- Accès au matériel
- Accès aux informations de localisation
- Lancement de services de fond
- Mise en place d’alarmes, de notifications
-.
Architecture conçue pour simplifier la réutilisation des composants
Publication des capacités des applications
Les autres applications peuvent utiliser ces capacités
Permet de charger facilement les apps.
ARCHITECTURE ANDROID
FRAMEWORK APPLICATIF
Une application est composée d’un ensemble de services et de
systèmes incluant :
Un ensemble de vues ”Views” utilisées pour construire l’application
(listes, grilles, zone de saisies, boutons ou encore navigateur web
intégrable)
”Content Provider” permettant aux applications d’accéder aux
données d’autres applications (Contacts...) ou de partager leurs
propres données.
ARCHITECTURE ANDROID
FRAMEWORK APPLICATIF
”Resource Manager” permettant d’accéder à des ressources tel que
des chaines de caractères, des images ou des ”layout” (le tout
paramétrable selon de multiples critères : taille de l’écran,
internationalisation...)
Mais aussi :
”Notification Manager” permettant à chaque application d’utiliser la
barre de statut générale pour y intégrer ses propres informations.
”Activity Manager” : composant qui gère le cycle de vie d’une
application et fournit les outils de navigation applicative.
ARCHITECTURE ANDROID
LES APPLICATIONS
ARCHITECTURE ANDROID
LES APPLICATIONS
2 parties :
Les activités : des fenêtres interactives
Les services : tâches de fond.
Les applications tournent dans leurs SandBoxes
Communications entre applications : Les ”intent”
Intent = intention : formule une demande
Plusieurs composants peuvent répondre à un ”intent” .
ARCHITECTURE ANDROID
LES APPLICATIONS
Dernière couche sur Android
Plusieurs sont intégrées dans le système :
Ecran ”Home”
Gestion des Emails
Gestion des SMS/MMS
Gestion de la téléphonie
Google Maps...
Application supplémentaires installables
Toutes les applications sont écrites via le même SDK !
DEVELOPPEMENT D’APPLICATIONS
ANDROID
GENERALITES
Les applications sont écrites en Java
Le code compilé ”dex” ainsi que les ressources (images, layout...) sont
regroupés dans une archive au format ”apk” par les outils du SDK
Cette archive ”apk” est un tout permettant la distribution et l’installation
de l’application sur n’importe quelle plateforme Android.
DEVELOPPEMENT D’APPLICATIONS
ANDROID
GENERALITES
Les applications sont écrites en Java
Le code compilé ”dex” ainsi que les ressources (images, layout...) sont
regroupés dans une archive au format ”apk” par les outils du SDK
Cette archive ”apk” est un tout permettant la distribution et l’installation
de l’application sur n’importe quelle plateforme Android.
DEVELOPPEMENT D’APPLICATIONS
ANDROID
ELEMENTS FONDAMENTAUX
Activity
Service
BroadcastReceiver
ContentProvider
Intent
DEVELOPPEMENT D’APPLICATIONS ANDROID
CYCLE DE VIE
DEVELOPPEMENT D’APPLICATIONS
ANDROID
BACK STACK
DEVELOPPEMENT D’APPLICATIONS
ANDROID
VOTRE PREMIERE APPLICATION : HELLO ANDROID !!!!
STRUCTURE DUN PROGRAMME ANDROID
ACTIVITE
CLASSE R
LES RESSOURCES
LAYOUT
LE MANIFEST
LES ACTIVITES(HelloActivity.java)
package ci.esatic.hello.helloandroid2017;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class HelloActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello);
}
}
INTERFACE UTILISATEUR (activity_hello.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_hello"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="ci.esatic.hello.helloandroid2017.HelloActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
LE MANIFEST (AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ci.esatic.hello.helloandroid2017">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".HelloActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
LE MANIFEST (Permissions)
<manifest ... >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>
GESTION DES EVENEMENTS
Interface OnClickListener
L’activité doit implémenter la méthode onClick de l’interface
OnClickListener afin de gérer les évènements
Import android.view.View.OnclickListener
public class MainActivity implements OnClickListener{
b1 = (button)findViewById(R.Id.btn1);
b1.setOnClickListener(this)
public void onClick(view v){
}
}
SPLASH SCREEN
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
public class SplashActivity extends ActionBarActivity {
pricate static int SPLASH_TIME_OUT = 3000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SPLASH SCREEN (suite)
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(getApplicationContext(),
MenuActivity.class);
startActivity(intent);
finish();
}
}, SPLASH_TIME_OUT);
}
LES INTENTS
NAVIGATION ENTRE PLUSIEURS ACTIVITES
APPEL D’ACTIONS SYSTEMES
LANCEMENT PAGE WEB (ACTION_VIEW)
A PPELER UN NUMERO (ACTION_CALL)
OUVRIR LISTE CONTACT
LOCALISER UN POINT A L’AIDE DE GOOGLE MAP
MULTIMEDIA
JOUER DE L’AUDIO
JOUER DE LA VIDEO
MULTIMEDIA - AUDIO
Créer un dossier raw dans le répertoire res qui contiendra les fichiers
audios, vidéos, …
Classe MediaPlayer (pour jouer l’audio)
import android.media.MediaPlayer;
Classe AudioManager (pour le contrôle de volume)
import android.media.AudioManager
MULTIMEDIA - AUDIO
…
Private MediaPlayer mp;
…
setContentView(R.layout.main);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
MULTIMEDIA - AUDIO
// Libérer les ressources d’un MediaPlayer antérieur
if (mp != null) {
mp.release();
}
// Créer un nouveau MediaPlayer pour jouer le son
mp = MediaPlayer.create(this, resId);
mp.start();
MULTIMEDIA - VIDEO
En plus de la classe MediaPlayer :
VideoView : Pour afficher la video
Dans le Layout :
<VideoView
android:id="@+id/video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center" />
MULTIMEDIA - VIDEO
Dans l’Activité :
Import android.widget.videoView;
Import android.net.Uri;
…
setContentView(R.layout.main);
VideoView video = (VideoView)findViewById(R.id.video);
String uriPath = "android.resource://com.android.Video/"+R.raw.small;
Uri uri = Uri.parse(uriPath);
video.setVideoURI(uri);
video.requestFocus();
video.start();
MULTIMEDIA - VIDEO
Dans l’Activité :
Import android.widget.videoView;
Import android.net.Uri;
…
setContentView(R.layout.main);
VideoView video = (VideoView)findViewById(R.id.video);
String uriPath = "android.resource://com.android.Video/"+R.raw.small;
Uri uri = Uri.parse(uriPath);
video.setVideoURI(uri);
video.requestFocus();
video.start();
BASE DE DONNEES
SQLite : Minuscule, mais puissante base de données
Créée en 2000 par Dr. Richard Hipp.
Peut être la base de données SQL la plus déployée dans le monde.
Se retrouve dans :
Android, Apple iPhone, Symbian phones, Mozilla Firefox, Skype, PHP,
Adobe AIR, MacOS X, Solaris …
Gratuit
Très petit (environ 150 KB)
Pas d’administration, pas de configuration, pas de serveur
BASE DE DONNEES
La Base de données SQLite est juste un fichier
Android stocke ce fichier dans le dossier
/data/data/nompackage/databases
Utiliser le File Explorer de Eclipse pour le voir le fichier
Android utilise des commandes SQL pour accéder aux fichiers
Un Helper Class est utilisé pour masquer la complexité
BASE DE DONNEES
Interface BaseColums
Contient la constante _id qui est la clé primaire d’une table
Classe SQLiteOpenHelper
Cette classe contient les routines de création d’une base de données
et la gestion des versions de la BD
BASE DE DONNEES
APPLICATION -Events
Application de gestion d’évènements
Stocke les différents évènements dans une DB pour les restituer plus tard
Project name: Events
Build Target: Android 2.2
Application name: Events
Package name: org.example.events
Create Activity: Events
Min SDK Version: 8
BASE DE DONNEES
Pour stocker les constantes décrivant la base de données nous
allons d’abord créer une interface Constants
Constants.java
package org.example.events;
import android.provider.BaseColumns;
public interface Constants extends BaseColumns {
public static final String TABLE_NAME = "events" ;
// Colonnes dans la BD Events
public static final String TIME = "time" ;
public static final String TITLE = "title" ;
}
BASE DE DONNEES
Chaque évènement sera stocké comme une ligne dans la table
events
Chaque ligne aura une colonne _id, time et title.
_id représente la clé primaire, déclarée dans BaseColums dont nous
nous avons héritée.
BASE DE DONNEES
CREATION DE LA BASE DE DONNEES
Nous allons créer une helper class appelée EventsData qui
représente la base de donnée elle même.
EventsData hérite de SQLiteOpenHelper
Ecrire juste le constructeur et implémenter les deux méthodes
BASE DE DONNEES
EventsData.Java
package org.example.events;
import static android.provider.BaseColumns._ID;
import static org.example.events.Constants.TABLE_NAME;
import static org.example.events.Constants.TIME;
import static org.example.events.Constants.TITLE;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
BASE DE DONNEES
EventsData.Java (suite)
;
public class EventsData extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "events.db" ;
private static final int DATABASE_VERSION = 1;
/** Create a helper object for the Events database */
public EventsData(Context ctx) {
super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
}
BASE DE DONNEES
EventsData.Java (suite)
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + _ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + TIME
+ " INTEGER," + TITLE + " TEXT NOT NULL);" );
}
BASE DE DONNEES
EventsData.Java (suite)
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
BASE DE DONNEES
Programme principal
Nous allons stocker les évènements dans une base de données locale
et il les rendra sous forme de chaine de caractères dans un TextView
BASE DE DONNEES
Main.xml
Nous allons stocker les évènements dans une base de données locale
et il les rendra sous forme de chaine de caractères dans un TextView
BASE DE DONNEES
Main.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</ScrollView>
BASE DE DONNEES
Events.java
package org.example.events;
import static android.provider.BaseColumns._ID;
import static org.example.events.Constants.TABLE_NAME;
import static org.example.events.Constants.TIME;
import static org.example.events.Constants.TITLE;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;
BASE DE DONNEES
Events.java (suite)
public class Events extends Activity {
private EventsData events;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
events = new EventsData(this);
BASE DE DONNEES
Events.java (suite)
try {
addEvent("Hello, Android!" );
Cursor cursor = getEvents();
showEvents(cursor);
}
finally {
events.close();
}
}
BASE DE DONNEES
Events.java (suite) [Ajout d’une ligne – méthode addEvent()]
private void addEvent(String string) {
// Insère un nouvel enregistrement dans la source de données Events
SQLiteDatabase db = events.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(TIME, System.currentTimeMillis());
values.put(TITLE, string);
db.insertOrThrow(TABLE_NAME, null, values);
}
BASE DE DONNEES
Events.java (suite) [Exécuter une requête– méthode getEvents()]
private static String[] FROM = { _ID, TIME, TITLE, };
private static String ORDER_BY = TIME + " DESC" ;
private Cursor getEvents() {
SQLiteDatabase db = events.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, FROM, null, null, null,
null, ORDER_BY);
startManagingCursor(cursor);
return cursor;
}
BASE DE DONNEES
Events.java (suite) [Afficher les résultats– méthode showEvents()]
private void showEvents(Cursor cursor) {
// On les met tous dans une grosse chaine de caractères
StringBuilder builder = new StringBuilder(
"Evènements enregistrés:\n" );
while (cursor.moveToNext()) {
//On peut utilizer getColumnIndexOrThrow() pour récupérer les indexes
long id = cursor.getLong(0);
long time = cursor.getLong(1);
String title = cursor.getString(2);
BASE DE DONNEES
Events.java (suite) [Afficher les résultats– méthode showEvents()]
builder.append(id).append(": " );
builder.append(time).append(": " );
builder.append(title).append("\n" );
}
//Afficher à l’écran
TextView text = (TextView) findViewById(R.id.text);
text.setText(builder);
}
GEOLOCALISATION
Le système Global Positioning System (GPS) a été développé pour
un usage militaire par les américains et converti à un usage civil.
Le GPS envoi un faisceau de signaux très précis à des récepteurs sur
la terre tel que les téléphones Android.
La puce GPS peut déterminer votre position à 15 mètres près !
A part le GPS, Android utilise aussi les informations des pylônes pour
calculer votre position ainsi que les Hotspots Wifi.
GEOLOCALISATION
LES PERMISSIONS
Pour avoir accès aux informations de localisation, il faut indiquer les
permissions dans AndroidManifest.xml
Avant le tag <Application> mettre :
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
ACCESS_FINE_LOCATION GPS
ACCESS_COARSE_LOCATION Pylônes
GEOLOCALISATION
LES CLASSES UTILISEES
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
GEOLOCALISATION
Méthode getSystemService()
Le point de départ des services de géolocatlisation est la méthode
getSystemService()
getSystemService() est appelé avec l’argument LOCATION_SERVICE
Il retourne une classe LocationManager qui permet de gérer la
géolocalisation
GEOLOCALISATION
Mise à jour localisation
Pour mettre à jour les information de localisation, on appelle la
méthode requestLocationUpdates() de l’objet instance de
LocationManager
requestLocationUpdates() utilise 4 paramètres :
- Nom du provider
- le délai pour limiter les MAJ trop fréquentes
- une distance minimale (changement inférieures ignorés)
- Objet LocationListener
GEOLOCALISATION
Interface LocationListener (4 méthodes)
public void onLocationChanged(Location location)
public void onProviderDisabled(String provider)
public void onProviderEnabled(String provider)
public void onStatusChanged(String provider, int status, Bundle
extras)
GEOLOCALISATION
Interface LocationListener (4 méthodes)
Méthode onLocationChanged()
C’est la méthode la plus importante
Appelée chaque fois que le provider remarque un changement de
position de l’appareil
GEOLOCALISATION
Interface LocationListener (4 méthodes)
Méthodes onProviderDisabled( ), onProviderEnabled(), et
onStatusChanged( )
Peuvent être utilisées pour changer de provider au cas ou le
premier choix devient indisponible.
GEOLOCALISATION
EXEMPLE : Application LocationTest
GEOLOCALISATION
EXEMPLE : Application LocationTest
Project name: LocationTest
Build Target: Android 2.2
Application name: LocationTest
Package name: org.example.locationtest
Create Activity: LocationTest
Min SDK Version: 8
Access to location information
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier AndroidManifest.xml
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier mainLayout.xml
Nous allons imprimer toutes les information de géolocalisation dans un gros scrolling
TextView
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier mainLayout.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/output"
android:layout_width=« match_parent"
android:layout_height="wrap_content" />
</ScrollView>
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
package org.example.locationtest;
import java.util.List;
import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.widget.TextView;
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
public class LocationTest extends Activity implements
LocationListener {
private LocationManager mgr;
private TextView output;
private String best;
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
// définition de constantes
private static final String[] A = {"invalid","n/a","fine","coarse"};
private static final String[] P = {"invalid","n/a","low","medium","high"};
private static final String[] S = {"out of service","temporarily unavailable","available"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-setContentView(R.layout.main);
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
mgr = (LocationManager) getSystemService(LOCATION_SERVICE);
output = (TextView) findViewById(R.id.output);
log("Location providers:" );
dumpProviders();
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
Criteria criteria = new Criteria();
best = mgr.getBestProvider(criteria, true);
log("\nBest provider is: " + best);
log("\nLocations (starting with last known):" );
Location location = mgr.getLastKnownLocation(best);
dumpLocation(location);
}
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
private void log(String string){
output.append(string + "\n");
}
private void dumpProviders(){
List<String> providers = mgr.getAllProviders();
for(String provider:providers)
{
dumpProvider(provider);
}
}
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
private void log(String string){
output.append(string + "\n");
}
private void dumpProviders(){
List<String> providers = mgr.getAllProviders();
for(String provider:providers)
{
dumpProvider(provider);
}
}
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
private void dumpProvider(String provider){
LocationProvider info = mgr.getProvider(provider);
StringBuilder builder = new StringBuilder();
builder.append("\nLocationProvider [")
.append("name = ")
.append(info.getName())
.append(", enabled = ")
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java (suite dumpProviders)
.append(mgr.isProviderEnabled(provider))
.append(", getAccuracy = ")
.append(A[info.getAccuracy()+1])
.append(", getPowerRequirement ")
.append(P[info.getPowerRequirement()+1])
.append("name = ")
.append(",hasMonetaryCost=" )
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java (suite dumpProviders)
.append(info.hasMonetaryCost())
.append(",requiresCell=" )
.append(info.requiresCell())
.append(",requiresNetwork=" )
.append(info.requiresNetwork())
.append(",requiresSatellite=" )
.append(info.requiresSatellite())
.append(",supportsAltitude=" )
.append(info.supportsAltitude())
.append(",supportsBearing=" )
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java (suite et fin dumpProviders)
append(info.supportsBearing())
.append(",supportsSpeed=" )
.append(info.supportsSpeed())
.append("]" );
log(builder.toString());
}
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
private void dumpLocation(Location location){
if (location == null)
log("\nLocation[unknown]");
else{
log("\n" + location.toString());
log("\nLatitude = " + location.getLatitude());
log("\nLongitude = " + location.getLongitude());
}
}
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
@Override
protected void onResume(){
super.onResume();
// Débute les mises à jour (la documentation recommande un délai >=60 000 ms)
mgr.requestLocationUpdates(best, 15000, 1, this);
}
@Override
protected void onPause(){
super.onPause();
// Arrête les mises à jour pour économiser la batterie quand l’appli est en pause
mgr.removeUpdates(this);
}
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
public void onLocationChanged(Location location) {
dumpLocation(location);
}
@Override
public void onProviderDisabled(String provider) {
log("\nProvider disabled :"+ provider);
}
GEOLOCALISATION
EXEMPLE : Application LocationTest
Fichier LocationTest.java
@Override
public void onProviderEnabled(String provider) {
log("\nProvider enabled :"+ provider);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
log("\nProvider status changed :"+ provider + ", status ="
+S[status] + ", extras =" + extras);
}
PUBLIER SON APPLICATION
SIGNER SON APPLICATION
GOOGLE PLAY