You are on page 1of 64

Terminaux Mobiles Communicants

Programmation Android
TMC

P-F. Bonnefoi
Version du 4 avril 2011

Table des matires 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Open Handset Alliance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Android : matriel et logiciel combins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les applications natives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ce quAndroid nest pas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le terminal Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Notre terminal Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Les avantages de la plateforme Android et de ses APIs . . . . . . . . . . . . . . . . . . . La pile logicielle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modle de scurit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Une application Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cycle de vie dune activity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Installation de lenvironnement de dveloppement . . . . . . . . . . . . . . . . . . . . . . . Le contenu du SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Crer un terminal Android virtuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Connexion lmulateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Crer une application Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lactivity Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Si vous avez une erreur lors de la compilation. . . . . . . . . . . . . . . . . . . . . . . . . . . Linterface de lActivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 6 7 8 9 10 11 12 13 14 18 21 26 27 28 29 30 31 32

TMC

TMC

20 Le chier AndroidManifest.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Le chier AndroidManifest.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Application Android : dirents chiers et rpertoires . . . . . . . . . . . . . . . . . . . . 23 Accs aux ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Les prfrences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Finaliser lapplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Journalisation des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Intent(ion) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Indiquer les intent(ions) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Linterface BroadcastReceiver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Linterface graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Utilisation dXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Utilisation dEclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Le chier XML correspondant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Accs linterface depuis le code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Dautres Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Un interfaage rapide : les dialogues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Notications Toast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Gestion du Bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Bluetooth : mise en activit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33 34 37 38 39 40 42 43 45 46 47 48 49 50 51 52 53 54 55 56 57

41 42 43 44 45

Surveiller la dcouverte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utiliser la bibliothque de simulation Bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . Utilisation des fonctions de hashage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilisation de cls RSA nouvellement cres . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilisation de cls RSA dj cres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60 61 62 63 64

TMC

1 Open Handset Alliance


LOHA est un consortium regroupant plus de 70 socits comprenant : des fabricants de terminaux Motorola, HTC, Dell, Garmin. . . ; des fabricants de composants Atheros, ARM, Gemalto, Broadcom, Intel, NVIDIA. . . des oprateurs de tlphonie Bouygues Telecom, Vodaphone, . . . ; des socits de dveloppement logiciel Google, . . . ; ...
Motto

A commitment to openness, a shared vision for the future, and concrete plans to make the vision a reality. To accelerate innovation in mobile and oer consumers a richer, less expensive, and better mobile experience. Together we have developed Android TM, the rst complete, open, and free mobile platform. http://www.openhandsetalliance.com/oha_faq.html

TMC

2 Android : matriel et logiciel combins

TMC

un document de rfrence exprime les contraintes matrielles ncessaires au support de la pile logicielle ; un noyau Linux qui fournie les interfaces de bas-niveau vers le matriel, la gestion de la mmoire, la gestion des processus, optimis pour les appareils mobiles ; des bibliothques opensource pour le dveloppement dapplication incluant SQLite, WebKit, OpenGL et un gestionnaire multimdia ; un logiciel de dmarrage, runtime : de petite taille, ecace pour une plateforme mobile pour excuter et hberger les applications Android ; pour dmarrer et grer la machine virtuelle Dalvik ; pour grer et mettre disposition les bibliothque des fonctionnalits de base ; un framework qui expose tous les services la couche applicative sans privilgier une application suivant son origine (diteur tiers ou non) : gestionnaire de fentre, fournisseur de contenu, gestionnaire de position gographique, tlphonie et service de communication p2p ; un framework dinterface utilisateur utilis pour hberger et lancer les applis ; des applications pr-installes ; un kit de dveloppement logiciel pour crer des applications : outils, plug-ins et documentation.

3 Les applications natives

Il existe un certain nombre dapplications disponibles dans Android : un client de messagerie compatible Gmail mais aussi avec dautres messageries ; une application de gestion des SMS ; un gestionnaire de contacts et dagenda, un PIM Personal Information Management, intgr avec les services onlines de Google ; une application de gestion de Google Maps incluant StreetView, la navigation guide par GPS, les vues satellites et lobtention des conditions de trac ; un navigateur web bas sur WebKit ; un client de messagerie instantane ; un lecteur multimdia et un acheur de photo ; un client lAndroid Marketplace pour tlcharger des applications dditeur tiers ; un client pour la boutique dachat de musique Amazon . Ces applications sont programmes en Java avec le SDK et sexcutent sur la Dalvik. Mais Les donnes utilises par toutes ces applications sont rendues disponibles aux applications tierces. Les applications tierces peuvent recevoir et grer des vnements comme la rception dappel tlphonique et celle de SMS.

TMC

4 Ce quAndroid nest pas. . .

une implmentation de Java ME, Micro Edition : une application android est crite en Java, mais ne sexcutent pas dans une machine virtuelle Java ME. Les classes Java compiles et les excutables ne peuvent tourner directement sous android ; une partie du Linux Phone Standards Forum (LiPS) ou du Open Mobile Alliance (OMA) : android tourne sur un noyau Linux opensource, mais lapproche dAndroid est plus global ; juste une couche applicative : Android recouvre la pile logiciel complte :systme dexploitation, bibliothques et les applications galement ; un tlphone mobile : Android inclus un document de rfrence pour la conception de tlphone, mais il nexiste pas un seul tlphone Android mais au contraire de nombreux tlphones fabriqus par dirents constructeurs ; la rponse de Google liPhone : Android est issu dun consortium et non dun seul constructeur.

TMC

5 Le terminal Android

Cest un smartphone, caractris par : un processeur autour de 1Ghz, comme le Snapdragon de Qualcomm sur architecture ARM ; une batterie de capacit limite, 1 ou 2 journes dutilisation ; un cran de rsolution variable suivant les modles limite en dimension, QVGA : 320x240, WVGA : 800x480, etc. une mmoire intgre importante : 512Mo de RAM, 512Mo de ash ; un espace de stockage renouvelable et extensible (SDCard) ; cran tactile, capacitif multi-touch , ou encore rsistif ; capacits multimdia 2D, 3D, vido et son : dirents CODECs : MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF, direntes APIs : OpenGL, FreeType, SGL ; laccs Internet en mobilit : accs au WiFi, au GSM, au EDGE, la 3G pour la tlphonie et lchange de donnes ; un environnement de dveloppement riche, bas sur le langage Java permettant de crer facilement des applications mobiles connectes !

TMC

6 Notre terminal Android

10

TMC

? ?

7 Les avantages de la plateforme Android et de ses APIs

11

pas de license obtenir, pas de dpense pour la distribution et le dveloppement Cool pour lUniversit ! dvelopper des applications location-based en utilisant le GPS ; utiliser des cartes gographiques avec Google Maps ; recevoir et mettre des SMS, envoyer et recevoir des donnes sur le rseau mobile ; enregistrer et lire image, son et vido ; utiliser compas, acclromtre, gyroscope ; des IPC, inter process communication, avec les Notications et Intents pour une relation event-driven avec lutilisateur et lchange de messages entre applis ; desoutils de stockage de donnes partags (SQLite en version Sandbox) ; Content Provider pour partager laccs ses donnes ; un navigateur que lon peut inclure bas sur WebKit ; une acclration matrielle pour la 2D et la 3D ; des services et des applications qui peuvent tourner en tche de fond : qui peuvent ragir au cours dune action, votre position dans la ville, lheure quil est, suivant lidentit de lappelant. . . une plateforme de dveloppement qui favorise la rutilisation de composants logiciels et le remplacement des applications fournies.

TMC

8 La pile logicielle
Application Layer Native Apps
(Contacts, Maps, Browser, etc.)

Chapter 1: Hello, Android

12

Third Party Apps

Developer Apps

Application Framework Location-Based Services Telephony Content Providers P2P/IM Window Manager Notifications Activity Manager Views Package Manager Resource Manager Android Runtime Media SSL & WebKit Android Libraries Dalvik Virtual Machine

Libraries Graphics
(OpenGL, SGL, FreeType)

libc Linux Kernal Hardware Drivers


(USB, Display, Bluetooth, etc.)

SQLite

Surface Manager

Power Management

Process Management

Memory Management

TMC

Figure 1-1 K Linux Kernel Core services (including hardware drivers, process and memory management,

9 Modle de scurit

Managing Application Permissions

89 13

Chaque application Android est associe un compte utilisateur Linux dirent.


ANDROID PLATFORM SECURITY MODEL
Android Application #1 DroidWars com.androidbook.DroidWars
DALVIK Virtual Machine

FIGURE 5.6

Android Application #2 Chippys Revenge! com.androidbook.Chipmunk


DALVIK Virtual Machine

Simplified Android platform architecture from a security perspective.

Linux User com.androidbook.DroidWars

Linux User com.androidbook.Chipmunk

Private App Files and Databases

Linux Operating System

Private App Files and Databases

Android Platform Security Enforcement


Access Shared Data Contacts, Calendars, Owner Information, Phone Data, etc. Access Handset Hardware Phone Dialer, WiFi, Bluetooth, Camera, Audio, Telephony, Device Sensors, etc.

TMC

Le partage daccsYourself Try It se fait ensuite suivant un systme de permissions .


To give your application permission to access the built-in camera, use the following steps:

10 Une application Android

14

Une application Android est constitue de composants faiblement coupls. Ces composants sont dcrits dans un mme document : le manifest , un chier au format XML AndroidManifest.xml qui dcrit : chaque composant : Activities, Services, Content Providers, Broadcast Receivers ; les interactions de ces composants : Intent Filters et Notications ; les accs ncessaires au matriel et logiciel (bibliothques) :Permissions ; Les composants pour dnir une application : les Activits ou activity : correspondent des applications sur un ordinateur de bureau. elles sont dmarres la demande de lutilisateur ou du systme ; elles tournent aussi longtemps quelles sont utiles : le systme peut tuer une activit pour rcuprer de la mmoire ; elles peuvent interagir avec lutilisateur, demander des donnes ou des services dautres activits ou des services , au travers de requtes et d intentions , intents ; en gnral, une activit = un cran dinterface, appel View.

TMC

10.1 Une application Android

15

les Services : similaires aux dmons sous Unix et aux services sous Windows : du code tournant en tche de fond. ils travaillent mme lorsque lorsque lactivit de lapplication nest plus active ou visible (par exemple, un lecteur MP3 qui peut jouer de la musique mme si linterface de contrle ne tourne plus) ; ils peuvent transmettre des notications. les notications : cest un moyen de signaler lutilisateur sans interrompre lactivit courante, ni prendre le focus. la meilleur mthode pour attirer lattention de lutilisateur depuis un service ou un rcepteur de diusion ; exemple : lutilisateur reoit un SMS ou un appel et il est alert par des voyants qui clignotent, lcoute dun son, lachage du message ou une icone.

TMC

10.2 Une application Android

16

les fournisseurs de contenu ou Content providers : ils ont t dnis pour partager des donnes avec dautres applications. ils utilisent une interface standardise sous la forme dURI, Uniform Resource Identier, pour rpondre des requtes en provenance dautres applications. Ces applications nont mme pas besoin de connaitre le fournisseur de contenu qui leur rpond. exemple : content://contacts/people permet de dnir une requte pour laccs la liste des contacts de lutilisateur ; le systme dexploitation recherche si une application sest enregistre comme fournisseur de contenu pour cette URI ; sil trouve une application, il la dmarre si elle ne sexcute pas dj, et lui transmet la requte ; sil trouve plus dune application, il demande lutilisateur laquelle il veut utiliser.

TMC

10.3 Une application Android

17

les intents ou notications : ils dnissent un modle par passage de message entre les applications. Ces messages peuvent tre diuss, broadcast, tout le systme ou bien tre envoys une activit ou un service particulier (le systme dcide des cibles) ; un message a pour but de dclencher une action. les rcepteurs de diusion , ou broadcast receivers. Ils senregistrent dans le systme et reoivent les messages diuss qui correspondent un ltre prdni. ils peuvent dclencher une application en rponse la rception dun message ; ils permettent dutiliser un modle pilot par les vnements , event-driven. les widgets : des composants visuels qui peuvent tre ajouts lcran de dmarrage, home screen. Il correspondent une variation du broadcast receiver. Lintrt de ces composants est de permettre de les partager avec dautres applications (en particulier les services et fournisseurs de contenu).

TMC

11 Cycle de vie dune activity

18

Dans Android, il ny a quune activit active la fois, c--d. en avant-plan ou foreground. Le systme dexploitation est libre de terminer une activit qui est en arrire-plan, lorsque la quantit de mmoire libre du systme est trop basse. Ainsi, une application Android, lorsquelle nest plus en avant-plan, doit tre capable de maintenir son tat pour garantir un fonctionnement seamless lutilisateur (retrouver les valeurs et achage prcdents lorsquil remet lapplication en avant-plan). Cest lapplication de grer son tat, ses donnes, et ses ressources an dtre prte tre interrompue ou bien termine tout moment. Pour rpondre ses vnements, des mthodes de rponse, callback, sont dnies : onCreate(), onResume(), onPause(), onDestroy()

TMC

11.1 Cycle de vie dune activity

19

Description des dirents callback et des actions entreprendre lors de leur rception : onCreate() : est appel quand lapplication dmarre ou redmarre. Initialiser les donnes statiques, tablir des liens vers les donnes et les ressources, positionner linterface avec setContentView(). onResume() : appel quant une activit passe en avant-plan. Reprendre le contrle des ressources exclusives. Continuer les lectures audio et vido ou les animations. onPause() : appel quand lactivit quitte lavant plan. Sauvegarder les donnes non encore sauvegardes, librer laccs aux ressources exclusives, stopper la lecture audio, vido et les animations. onDestroy() : appel quand lapplication est ferme. Nettoyer les donnes statiques de lactivit, librer toutes les ressources obtenues. Il est ncessaire de limiter le temps pris pour traiter la rception de ces callbacks : la thread principale de lapplication est celle soccupant de linterface :UI thread ; elle ne doit pas tre bloque plus de 5 secondes sous peine de voir le Application Not Responding .

TMC

blocked. If the main UI thread is blocked for too long, the Android system will shut down the activity due to a lack of response. This is especially important to respond quickly during the onPause() callback, when a higher-priority task (for example, an incoming phone call) is entering the foreground.

11.2 Cycle de vie


FIGURE 3.2
Important callback methods of the activity life cycle.

Figure 3.2 shows the order in which activity callbacks are called.

20

Request Activity Start

onCreate()

onStart()

onRestart()

Activity Brought to Foreground

onResume()

Activity Sent to Background Activity Brought to Foreground Activity Brought to Foreground

Activity Killed For Memory

Activity Running In Foreground Activity Sent To Background onPause()

onStop()

onDestroy()

TMC

Saving Activity State


An activity can have private preferencesmuch like shared application preferences. You can access these preferences by using the getPreferences() method of the

12 Installation de lenvironnement de dveloppement

21

Pour pouvoir dvelopper une application Android, on utilise : le kit de dveloppement fourni par Google ; un des dirents simulateurs de terminaux communicants. Ces dirents lments peuvent tre intgrs et utiliss dans lIDE, Integrated Development Environment , Eclipse. Pour pouvoir utiliser lAPI Bluetooth sur le simulateur, on utilise une bibliothque permettant de simuler son fonctionnement en utilisant la pile de communication TCP/IP de la machine hte. En eet, le simulateur ne prends pas en charge la prsence ventuelle dun composant bluetooth sur la machine hte. Pour cela, on va installer : Eclipse ; le SDK dAndroid ; une bibliothque pour lutilisation du Bluetooth ;

TMC

12.1 Installation de lIDE Eclipse

22

Sous Ubuntu, on peut utiliser le gestionnaire de paquets Synaptic :

On slectionne Eclipse, pour procder son installation. On peut galement utiliser la commande :
$ sudo apt-get install eclipse

TMC

12.2 Rcupration du SDK Android


Le SDK dAndroid est disponible ladresse : http://developer.android.com/sdk/index.html

23

TMC

On choisira larchive android-sdk_r06-linux_86.tgz.

12.3 Installation du SDK et intgration dans Eclipse


rcuprer larchive android-sdk_r06-linux_86.tgz crer un rpertoire ANDROID :
$ mkdir ~/ANDROID $ tar xvfz android-sdk_r06-linux_86.tgz $ cd android-sdk-linux_86

24

Il faut ajouter la ligne export PATH=${PATH}:${HOME}/ANDROID/android-sdk-linux_86/tools la n du chier ~/.bashrc, pour laccs aux commandes du SDK. il faut ajouter le plugin Android Developement Tools (ADT) dans Eclipse : Allez dans le menu Help install new software , et rajoutez le site https://dl-ssl.google.com/android/eclipse/ slectionnez les Developper Tools ; acceptez linstallation dlments non signs. Allez dans le menu Window Preferences : slectionnez Android ; indiquez dans le zone de saisie le chemin daccs au SDK : /home/pef/ANDROID/android-sdk-linux_86/ Vous mettrez votre nom de compte la place de pef . . .

TMC

12.4 Rcupration de la plate-forme Android

25

Allez dans le menu Window Android SDK and AVD Manager : slectionnez la plate-forme 2.2 vous pouvez retourner dans le menu Window Preferences pour vrier la prsence de cette plate-forme. installer une bibliothque pour lutilisation du Bluetooth : http://github.com/cheng81/Android-Bluetooth-Simulator
$ sudo apt-get install git-core $ cd ANDROID $ git clone git://github.com/cheng81/Android-Bluetooth-Simulator.git $ cd Android-Bluetooth-Simulator

TMC

13 Le contenu du SDK

26

TMC

les APIs Android ; les outils de dveloppement (dans le rpertoire tools) : DDMS, Dalvik Debug Monitoring Service : le dbogueur ; AAPT, Android Asset Packaging Tool : outil de construction des packages dapplication (.apk) ; ADB, Android Debug Bridge : copier des chiers, dployer des applications ; SQLite3 : pour la gestion des BDs ; MkSDCard : pour crer une SDCard virtuelle ; dx : convertir les .class Java en bytecode Android .dex. lmulateur android : interactif, avec possibilit de simuler la gestion dappel tlphonique et de SMS ; plusieurs skins pour tester dirents form factors (cran, orientation, etc.) ; chaque application est excute dans une VM Dalvik, ce qui permet de tester et de dboguer les applications dans un environnement rel . une documentation : http://developer.android.com/guide/index.html une communaut de dveloppeur : http://developer.android.com/resources/community-groups.html et sur Stack Overow : http://stackoverflow.com/ des exemples de code.

14 Crer un terminal Android virtuel

27

Allez dans le menu Window Android SDK and AVD Manager , puis prendre Virtual Devices (avec les choix par dfaut) :

TMC

15 Connexion lmulateur
pef@pef-desktop:~/ANDROID/android-sdk-linux_86/tools$ telnet localhost 5554 Trying 127.0.0.1... Connected to localhost. Escape character is ^]. Android Console: type help for a list of commands OK help Android console command help: help|h|? event geo gsm kill network power quit|exit redir sms avd window OK print a list of commands simulate hardware events Geo-location commands GSM related commands kill the emulator instance manage network settings power related commands quit control session manage port redirections SMS related commands manager virtual device state manage emulator window

28

Il est possible de se connecter au terminal virtuel laide de la commande telnet sur le port indiqu dans le nom de la fentre de lmulateur :

try help <command> for command-specific help

TMC

16 Crer une application Android

29

On choisit le menu File New Project

Puis on dnit les options de lapplication : Package Name ; Activity ; Application name ; la version de la plateforme.

TMC

17 Lactivity Hello World


On obtient le code ci-dessous dans le chier HelloWorld.java :
package edu.cryptis.tmc.helloworld; import android.app.Activity; import android.os.Bundle; public class HelloWorld extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }

30

Ce code : dnit une activity, par hritage de la classe Activity ; positionne son interface utilisateur par lutilisation de setContentView().

TMC

18 Si vous avez une erreur lors de la compilation. . .


Menu ProjectProperties , vriez que :

31

TMC

19 Linterface de lActivity

32

Elle est dnie par : lutilisation dun container vertical qui remplit tout lcran qui contient une tiquette faisant rfrence au contenu dune chane dnie dans les ressources (rpertoire res/).
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>

et celui du chier res/values/strings.xml :


<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, HelloWorld!</string> <string name="app_name">Hello World</string> </resources>

TMC

20 Le chier AndroidManifest.xml
Le contenu du chier res/layout/main.xml :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="edu.cryptis.tmc.helloworld" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".HelloWorld" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

33

TMC

21 Le chier AndroidManifest.xml

34

Un namespace est dnie xmlns:android qui est uniquement utilis pour les attributs du chier XML et non pour les lments, avec lexception de lattribut package de llment manifest. . . Dautres lments : uses-permissions : les permissions ncessaires lapplication ; permission : dclarer des permissions ncessaires aux autres applications dans le but davoir accs au donnes de lapplication ; instrumentation : indiquer le code appeler lors de la rception dvnements systmes comme le lancement dune activit, pour monitoring ou du logging ; uses-library : utiliser dautres composants, comme le service de localisation ; uses-sdk : <uses-sdk minSdkVersion="2"/> pour des sous-versions du SDK ; application : dnir lapplication elle-mme.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="edu.cryptis.tmc.monappli"> <uses-permission android:name="android.permission.ACCESS_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_GPS" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission <application> ... </application>

TMC

</manifest>

21.1 Utiliser Eclipse

35

Il est possible pour dnir le contenu du chier AndroidManifest.xml dutilis lditeur spcialis fourni par Eclipse :

TMC

21.2 Utiliser Eclipse


Par exemple pour rajouter une permission :

36

TMC

22 Application Android : dirents chiers et rpertoires

37

TMC

AndroidManifest.xml ; R.java : contient les rfrences, ID , dirents lments de lapplication ; build.xml et default.properties : utilis par Ant ; bin/ : contient lapplication une fois compile ; bin/classes/ : les classes Java compiles ; bin/classes.dex : lexcutable cr partir de ces classes ; bin/appli.ap_ : contient les ressources de lapplication en chier Zip ; bin/appli-debug.apk ou bin/appli-unsigned.apk : lapplication Android ; Ce chier .apk est sign lectroniquement par une cl avec jarsigner. libs/ : les bibliothques tierces ncessaires lapplication ; assets/ : les chiers multimdias et autres chiers ncessaires lapplication ; src/ : les sources de lapplication ; res/ pour les ressources : res/layout/ : les chiers au format XML pour dnir linterface. res/drawable/ : les chiers images pour linterface ; res/menu/ : chier de dnition en XML des menus ; res/values/ : pour les chanes de caractres, les constantes (permet de facilement internationaliser une application) ; res/xml/ : pour des chiers au format XML.

23 Accs aux ressources


Pour ajouter un chier de nimporte quel type lapplication : le mettre dans le rpertoire res/raw ; synchroniser lIDE Eclipse : dans le menu contextuel du rpertoire slectionner loption refresh ; lIDE va crer les rfrences manquantes dans le chier R.java.
Attention

38

Chaque chier doit avoir un nom unique en excluant son extension : toto.jpg et toto.dat vont entrer en conit.

Pour rfrencer une ressource Il faut utiliser la mthode getResources().openRawResource(R.raw.ma_ressource); o ma_ressource correspond au nom du chier.

TMC

24 Les prfrences

39

Il est possible de disposer dun systme de gestion de prfrences dont laccs est partag entre les dirents lments constituants lapplication. Pour accder aux prfrences, on utilisera la mthode getSharedPreferences(). Ces prfrences sont organises sous forme dobjet de la classe SharedPreferences et chacun de ces objets peut recevoir un nom. Ensuite, pour un de ces objets on peut dnir un ensemble dassociations de type (cl, valeur).
1 2 3 4 5 1 2 SharedPreferences reglages = getSharedPreferences(MesPrefs, MODE_PRIVATE); SharedPreferences.Editor editeurPref = reglages.edit(); editeurPref.putString(Nom, toto); editeurPref.putBoolean(Inscrit, true); editeurPref.commit();

Pour rcuprer les valeurs de ces prfrences :


SharedPreferences reglages = getSharedPreferences(MesPrefs, MODE_PRIVATE); String nom = reglages.getString(Nom, Titi);

Dans la ligne 2, le deuxime argument de la mthode getString est la valeur retourner dans le cas o il ny aurait pas de valeur associe la cl Nom .

TMC

25 Finaliser lapplication
Nommer lapplication On ajoutera dans le manifest :
1 1 <application android:label="Le nom de mon application">

40

Ou en faisant appel une ressource :


<application android:label="@string/app_name">

Lapplication portera comme nom, le contenu de la chane appele app_name et dnie dans le chier strings.xml Associer une icone lapplication On ajoutera dans le manifest :
1 <application android:icon="@drawable/mon_icone">

Pour dnir licone, il faut : dnir cette icone au format PNG suivant 3 tailles direntes : 36x36, 48x48 et 72x72 suivant la densit de lcran qui peut tre basse, moyenne ou grande ; stocker la version 36x36 dans res/drawable-ldpi/ sous le nom mon_icone.png stocker la version 48x48 dans res/drawable-mdpi/ sous le nom mon_icone.png stocker la version 72x72 dans res/drawable-hdpi/ sous le nom mon_icone.png Android choisira automatiquement la taille la mieux adapte.

TMC

25.1 Finaliser lapplication


Fournir une description de lapplication Cette description peut tre utilise dans le MarketPlace :
1 2 <application android:label="le nom de lapplication" android:description="@string/app_desc">

41

Pour dboguer lapplication Pour pouvoir dboguer lapplication dans Eclipse, il est ncessaire dajouter lattribut android:debuggable="true" dans llment application dans le manifest. Lors de la diusion de lapplication, cet attribut doit tre modi.

TMC

26 Journalisation des erreurs


Android dnit la classe android.util.Log et les mthodes suivantes : Log.e() Logs errors Log.w() Logs warnings Logs messages de description Log.i() Log.d() Logs messages de dboguage Logs messages dtaills Log.v() Chaque message de dboguage doit tre tiquett avec un TAG :
1 2 3 private static final String TAG = "MonApplication";

42

...
Log.i(TAG, "Dans la methode Truc()");

Le TAG permet ensuite de ltrer au niveau du dbogueur, LogCat dEclipse, les messages que lon veut suivre.

TMC

27 Intent(ion)
qui cela correspond ?

43

Une application Android est constitue de composants logiciels faiblement coupls qui correspondent chacune une activit indpendante. Parmi ces activits, lune est plus importante que les autres : elle apparait dans le launcher . On utilise un message, un intent pour demander au systme de dclencher une activit. Cette intention peut tre plus ou moins spcique, ce qui laisse une plus grande libert pour le choix de ou des activits qui vont la satisfaire. Analogie avec le Web Une analogie existe avec le protocole HTTP : un verbe + URL vers une ressource (page web, image, programme serveur). Le verbe correspond GET, POST etc. Un intent reprsente une action + un contexte et il existe plus dactions et plus de composants pour les raliser. la manire du navigateur web qui sait traiter le verbe+URL, Android sait trouver lactivit correspondante.

TMC

27.1 Intent(ion)
Intent Donnes

44

action + donnes les donnes sont indiques sous forme dune URI, comme content://contacts/people/1 Action les actions sont des constantes, comme ACTION_VIEW qui dclenche une visionneuse, ACTION_EDIT pour diter une ressource, ACTION_PICK pour slectionner un lment suivant une URI reprsentant une collection comme content://contacts/people. Si on cre un intent avec laction ACTION_VIEW et lURI content://contacts/people/1 : Android va chercher et ouvrir une activit capable dacher cette ressource. Dautres critres peuvent tre ajouts dans lintent categorie type MIME un component lactivit principale sera dans la catgorie LAUNCHER, mais les autres activits seront dans DEFAULT ou ALTERNATIVE. pour indiquer le type de ressources sur lequel laction va tre faite pour indiquer la classe de lactivit qui est suppose recevoir lintent. Rduit la porte de lintent mais permet de simplier le contenu de lintent. permet dajouter des donnes transmettre au rcepteur.

TMC

Extras

28 Indiquer les intent(ions)


1 2 3 4 5 6 7 8 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.commonsware.android.skeleton"> <application> <activity android:name=".GO" android:label="Go"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>

45

On indique quels sont les intents attendus par un composant dans le chier manifest, laide dintent-filter :

Rendre plus spcique le rcepteur Lorsque le systme gnre des vnements, il est possible de dclencher : un service plutt quune activit ; une activit suivant un contexte spcique : le mme intent sur une certaine donne dclenche une activit mais sur une autre donne dclenche une autre activit. On utilise des rcepteurs dintent implmentant linterface BroadcastReceiver. Ces rcepteurs sont des objets qui reoivent des intents, surtout diuss en broadcast, et qui ragissent en envoyant dautres intents pour dclencher une activit, un service. . .

TMC

29 Linterface BroadcastReceiver
Elle est constitue de seulement une mthode :onReceive(). Les objets implmentants cette interface doivent tre dclars dans le manifest :
1 <receiver android:name=".MaClasseRecepteur" />

46

Cet objet nest excut que jusquau retour de la mthode et sera enlever du systme : ils ne peuvent attendre de callback (pas douverture de dialog par exemple). Exception de traitement Si on veut que le rcepteur soit attach un composant logiciel avec une dure de vie plus longue, comme celle du systme : il ne faut pas dclarer le rcepteur dans le manifest ; il faut enregistrer le rcepteur laide de la mthode registerReceiver() lors du callback onResume() de lactivit ; il faut d-enregistrer le rcepteur laide de la mthode unregisterReceiver() lors du callback onPause() de lactivit ou lorsque lon ne dsire plus recevoir dintent associ. Attention Lutilisation dobjet Intent pour passer des donnes quelconques nest possible que si le rcepteur est actif (possibilit de manquer des intents quand inactif).

TMC

30 Linterface graphique

47

Il existe deux manires de dnir une interface graphique : laide de chier de description rdig suivant le format XML avantages : simplicit de conception, indpendance avec le code Java ; inconvnients : dnition statique qui ne peut voluer au cours de la vie de lapplication ; avec du code Java avantages : peut voluer de manire dynamique durant la vie de lapplication (exemple : dnir le contenu dun menu permettant de choisir un lment parmi une liste construite par lapplication) ; inconvnients : dicults dorganisation, le code est mlang celui de lapplication. tir parti des deux. . . et aussi, utiliser une interface au format HTML avec le widget bas sur WebKit

TMC

31 Utilisation dXML

48

Les chiers au format XML : sont stocks en tant que ressource dans : res/layout ; dnissent une hirarchie entre les widgets : un arbre dlments de widgets et de containers ; les attributs de ces lments dnissent les proprits : laspect dun widget comme celui dun bouton avec textStyle="bold" le comportement dun container. loutil aapt parse ces chiers et construit le chier R.java contenant des rfrences pour dsigner un widget dans le code de lapplication.

TMC

32 Utilisation dEclipse
Il est possible dutiliser lditeur intgr dans Eclipse :

49

TMC

33 Le chier XML correspondant


Ce chier dnie une arborescence :
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:text="@+id/Button01" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"> </Button> </LinearLayout>

50

TMC

Sur cet exemple, les widget : sont de la classe Button et TextView qui hritent de la classe android.view.View ; disposent dun identiant avec lattribut android:id ; achent linitialisation le texte qui est dnie par lattribut android:text. Pour le TextView on remarque quil fait rfrence une chane dnie dans le chier strings.xml et rfrence par "@string/hello. les attributs android:layout_width et android:layout_height sont dnis fill_parent ; Quoi correspondent les @ ? dnir une identit pour une rfrence ultrieure : @+id/mon_id

34 Accs linterface depuis le code


Le chier R.java contient des rfrences sur les lments de linterface :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 } } } public static final class id { public static final int Button01=0x7f050000; /* AUTO-GENERATED FILE. * * This class was automatically generated by the * aapt tool from the resource data it found. * should not be modified by hand. */ package edu.unilim.helloworld; public final class R { It DO NOT MODIFY.

51

...
public static final class layout { public static final int main=0x7f030000;

TMC

la mthode setContentView permet dappeler linterface dnie dans un chier XML : setContentView(R.layout.main) on utilise la mthode findViewById() laquelle on passe lidentiant numrique dni dans le chier R.java. Exemple : Button btn = (Button) findViewById(R.id.button01) On utilise le nom dnie dans le chier XML dinterface, ici button01 . on accroche un listener : btn.setOnClickListener(. . . ) pour obtenir lvnement (clic du bouton).

35 Dautres Widgets
Il existe direntes classes et sous-classes :

52

ImageView : avec les attributs android:src, comme par exemple : android:src="@drawable/logo" Il est galement possible dutiliser la mthode setImageURI() pour utiliser un Content Provider ImageButton EditText : pour une zone de saisie. Avec les attributs : android:numeric pour ne rentrer que des chires ; android:singleLine="false" pour indiquer si la saisie se ralise sur une ligne ou plus ; android:password : pour lentre masque dun mot de passe.

TMC

36 Un interfaage rapide : les dialogues

53

Lorsque lon veut intragir avec lutilisateur de manire rapide et simple, sans avoir crer une activit ddie, on peut crer une fentre de Dialog : Activity.showDialog() : acher un dialogue ; Activity.onCreateDialog() : une fonction de callback lors de la cration du dialogue et son ajout la liste des autres dialogues de lactivit ; Activity.onPrepareDialog() : permet de mettre jour un dialogue juste avant son achage ; Activity.dismissDialog() : ferme un dialogue et retourne lactivit ; Activity.removeDialog() : supprime le dialogue de la liste des dialogues. On peut dnir lapparence du dialogue laide : dun chier layout au format XML ; la mthode setContentView(). Il existe des dialogues prdnis : AlertDialog, CharacterPickerDialog, DatePickerDialog, ProgressDialog et TimePickerDialog. On peut rcuprer les rfrences vers les lments de linterface laide de Dialog.findViewById().

TMC

37 Notications Toast
1 2 3 5 6 Context context = getApplicationContext(); CharSequence text = "Hello toast!"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show();

54

Cest un message qui va venir en premier plan et disparaitre automatiquement aprs un temps limit.

Ou plus simplement :
1 Toast.makeText(context, text, duration).show();

TMC

38 Gestion du Bluetooth

55

Avec Bluetooth, il est possible de : chercher dautres appareils, devices, proximit ; tablir une communication de type ux laide dune socket bluetooth. Il existe 4 classes pour grer le bluetooth : BluetoothAdapter : reprsente linterface matrielle bluetooth, le bluetooth device sur lequel tourne Android ; BluetoothDevice : reprsente chaque appareil distant avec lequel on peut communiquer, remote bluetooth device ; BluetoothSocket : permet de dclencher une requte de connexion vers un appareil distant et dtablir une communication ; BluetoothServerSocket : permet de dnir un serveur en attente de connexions en provenance des appareils distants. Pour accder linterface bluetooth :
1 1 2 BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();

Il faut galement les permissions suivantes dans le manifest :


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

TMC

1. pour dclencher une dcouverte du voisinage, discovery, tablir des communications 2. pour modier les proprits de linterface.

39 Bluetooth : mise en activit

56

Par dfaut, linterface Bluetooth nest pas active pour conomiser la batterie, et pour des questions de scurit. Il est ncessaire de lactiver : soit avec la mthode enable(), si lon dispose de la permission BLUETOOTH_ADMIN ; soit laide dune sous-activit asynchrone dont on attendra le rsultat :
1 2 String enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE; startActivityForResult(new Intent(enableBT), 0);

Lutilisateur sera prvenu et une demande dautorisation lui sera ache. Dans le premier cas, il vaut mieux prvenir lutilisateur de la mise en activit de linterface.

TMC

40 Bluetooth

57

Lutilisation de Bluetooth se fait au travers dun service. Pour obtenir une rfrence vers ce service, il faut utiliser la mthode getSystemService de la classe Context qui permet daccder au systme :
1 2 String nom_service = Context.BLUETOOTH_SERVICE; BluetoothDevice bluetooth = (BluetoothDevice)getSystemService(nom_service);

Lobjet BluetoothDevice Ensuite, il est possible dutiliser les mthodes suivantes : enable et disable : activer ou dsactiver linterface ; getName et setName : pour manipuler le nom de linterface (si elle est active) ; getAddress : pour obtenir ladresse de linterface ; get/setMode et : pour congurer le mode de dcouverte discoverable ou connectable get/setDiscoverableTimeout : pour congurer le temps utilis pour cette dcouverte ;
1 2 bluetooth.setName(YOBIBO); bluetooth.setMode(BluetoothDevice.MODE_DISCOVERABLE);

TMC

40.1 Bluetooth : la dcouverte

58

Pour la dcouverte, discovery, des autres appareils bluetooth, il faut : tre en mode dcouverte ; dmarrer un cycle de dcouvrable : bluetooth.startPeriodicDiscovery(); bluetooth.startDiscovery(true); Ces deux mthodes sont asynchrones, et diusent un intent REMOTE_DEVICE_FOUND_ACTION chaque dcouverte dun appareil bluetooth. obtenir la liste des appareils dcouverts : listRemoteDevices qui retourne un tableau de chane de caractres, contenant les adresses de chacun de ces appareils ; obtenir le nom dun appareil : getRemoteName en donnant en paramtre ladresse de linterface. Pour le pairing Il faut utiliser les mthodes suivantes : createBonding : pour tablir le lien (cancelBonding pour labandonner) ; setPin : pour indiquer le PIN de scurit utiliser (cancelPin pour le rednir). Une fois un lien tablie avec un appareil, ce lien est ajout la BD de lappareil et sera utilis de nouveau lors dune prochaine rencontre du mme appareil.

TMC

40.2 Bluetooth : exemple dtablissement de liens


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 } }); } } public void onEnableResult(int _result) throws RemoteException {} String[] devices = bluetooth.listRemoteDevices(); for (String device : devices) { if (!bluetooth.hasBonding(device)) { // Set the pairing PIN. In real life its probably a smart // move to make this user enterable and dynamic. bluetooth.setPin(device, new byte[] {1,2,3,4}); bluetooth.createBonding(device, new IBluetoothDeviceCallback.Stub() {

59

public void onCreateBondingResult(String address, int result) throws RemoteException{ if (result == BluetoothDevice.RESULT_SUCCESS) { String connectText = Connected to + bluetooth.getRemoteName(address); Toast.makeText(getApplicationContext(), connectText, Toast.LENGTH_SHORT); }

TMC

Pour couter les requtes de pairing, il faut dnir un BroadcastListener ltrant les intents ACTION_PAIRING_REQUEST.

41 Surveiller la dcouverte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 }; registerReceiver(discoveryMonitor, new IntentFilter(dStarted)); registerReceiver(discoveryMonitor, new IntentFilter(dFinished)); } } } else if (dFinished.equals(intent.getAction())) { // Discovery has completed. Toast.makeText(getApplicationContext(), "Discovery Completed...", Toast.LENGTH_SHORT).show(); BroadcastReceiver discoveryMonitor = new BroadcastReceiver() { String dStarted = BluetoothAdapter.ACTION_DISCOVERY_STARTED; String dFinished = BluetoothAdapter.ACTION_DISCOVERY_FINISHED; @Override public void onReceive(Context context, Intent intent) { if (dStarted.equals(intent.getAction())) { // Discovery has started. Toast.makeText(getApplicationContext(), "Discovery Started...", Toast.LENGTH_SHORT).show();

60

TMC

42 Utiliser la bibliothque de simulation Bluetooth


1 2 <uses-permission android:name="android.permission.INTERNET"> </uses-permission>

61

Il faut modier le chier AndroidManifest.xml pour rajouter la permission dutiliser laccs Internet (en plus de celle daccs bluetooth et son administration) :

En eet, la simulation de bluetooth passe par lutilisation de la pile TCP/IP. . . Modications du source de lapplication Pour laccs la bibliothque, il faut : changer limportation : import android.bluetoothimport dk.itu.android.bluetooth appeler BluetoothAdapter.SetContext(this); par exemple dans la mthode onCreate() appel lors de linitialisation de lactivity. Lancer le serveur de liaison Dans Eclipse, il faut lancer btemu ou directement sur la ligne de commande :
$ java -jar btsim-server.jar Server started on port 8199 ADB command: adb press any key to exit

TMC

Ce serveur TCP/IP soccupe de faire la liaison entre les dirents AVDs.

43 Utilisation des fonctions de hashage


On peut faire appel aux fonctions de hashage MD5 et SHA1 :
1 2 3 4 5 6 // Obtain a message digest object. MessageDigest md = MessageDigest.getInstance("MD5"); // Calculate the digest for the given bytes array md.update(saisie.getText().toString().getBytes(), 0, saisie.length()); val_hash = new BigInteger(1,md.digest()); mon_texte.setText(String.format("%1$08X", val_hash));

62

Remarques : ligne 4 : la variable saisie correspond un widget de type EditText ; dans la mthode getBytes(), il est possible dindiquer un encodage comme "ISO-8859-1" ou "UTF-8" pour traduire les ventuels caractres accentus ; ligne 5 : on traduit la valeur retourne par la fonction de hashage en un entier de taille variable, BigInteger ; ligne 6 : ce grand entier est ensuite ach sous forme hexadcimal, puis aect au widget de type TextView appel mon_texte.

TMC

44 Utilisation de cls RSA nouvellement cres


1 2 3 4 // Get an instance of the RSA key generator KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); // Generate the keys might take sometime on slow computers KeyPair myPair = kpg.generateKeyPair();

63

TMC

45 Utilisation de cls RSA dj cres

64

Il est possible de rcuprer des cls RSA lintrieur dune application Android : les convertir dans une reprsentation DER, c--d. en notation ASN.1 ; placer les chiers les contenant dans le rpertoire res/raw ; utiliser la mthode getResources() pour obtenir des rfrences vers ces chiers ; utiliser la classe KeyFactory pour importer les cls.
1 2 3 4 5 6 7 9 10 11 12 13 14 KeyFactory kf = KeyFactory.getInstance("RSA"); InputStream fic_cle = getResources().openRawResource(R.raw.ma_cle_publique); byte[] cle_pub_asn1 = new byte[fic_cle.available()]; fic_cle.read(cle_pub_asn1); fic_cle.close(); X509EncodedKeySpec cle_pub = new X509EncodedKeySpec(cle_pub_asn1); kf.generatePublic(cle_pub); fic_cle = getResources().openRawResource(R.raw.ma_cle_privee); byte[] cle_priv_asn1 = new byte[fic_cle.available()]; fic_cle.read(cle_priv_asn1); fic_cle.close(); PKCS8EncodedKeySpec cle_privee = new PKCS8EncodedKeySpec(cle_priv_asn1); kf.generatePrivate(cle_privee);

TMC

You might also like