J2ME. Développement d applications Java pour terminaux mobiles - 1 -
|
|
|
- Claude Lachapelle
- il y a 10 ans
- Total affichages :
Transcription
1 J2ME Développement d applications Java pour terminaux mobiles - 1 -
2 1. J2ME et l informatique des terminaux mobiles Les applications embarquées Typologie des applications J2ME et les systèmes embarqués Tour d horizon de la technologie J2ME Les machines virtuelles Les configurations Les profils Les packages optionnels La pile JSR 185 JTWI (Java Technology for the Wireless Industry) Les autres API Java pour terminaux embarqués La configuration CLDC Les limitations de CLDC Support de la virgule flottante Internationalisation des applications Support des propriétés d environnement Limitations diverses La sécurité dans CLDC Prévérification des fichiers de classe Le modèle de sécurité Sandbox Les classes de CLDC Les classes héritées de J2SE Les classes spécifiques de CLDC Le profil MIDP Le MIDlet Cycle de vie d un MIDlet L accès aux attributs du fichier *.jar L interface utilisateur Les principes de l interface utilisateur MIDP Les classes d affichage La classe Display La classe Displayable La classe Screen La classe Canvas L interface utilisateur de haut niveau L interface Choice La classe List La classe Item La classe Form La classe ChoiceGroup La classe TextField La classe DateField La classe Gauge La classe ImageItem La classe StringItem La classe TextBox La classe Alert La classe Ticker
3 La gestion des évènements La classe Command L interface commandlistener L interface ItemStateListener Le stockage persistant des données Le package RMS Le Record Store La classe RecordStore L interface RecordComparator L interface RecordFilter L interface RecordEnumeration L interface RecordListener J2ME en pratique Les outils L environnement de développement J2ME Wireless Toolkit Le terminal mobile cible Le terminal mobile Sony Ericsson t L outil de transfert de l application L application CurrencyConverter Le client J2ME Le serveur PHP Le Web service Conclusion
4 Avant-propos L objectif de ce dossier est de présenter la technologie Java 2 Micro Edition (J2ME). Cette technologie, proposée par Sun Microsystem, permet de développer des applications pour les terminaux embarqués en utilisant le langage Java. Les trois premières parties de la présente étude fournissent les notions théoriques nécessaires à une compréhension approffondie de la technologie J2ME. La dernière partie, quant à elle, présente un prototype réalisé au cours de cette étude. Un cd rom ainsi que trois documents contenant des exemples pratiques sont annexés. Le cd rom contient tous les fichiers et logiciels nécessaires pour mettre en œuvre les différents exemples pratiques
5 Cette première partie débute par une présentation du panorama des applications pour terminaux embarqués. Vous trouverez ensuite une description de la technologie J2ME et de la place qu elle occupe dans le paysage de la mobilité. 1. J2ME et l informatique des terminaux mobiles 1.1. Les applications embarquées Un système embarqué (embedded system), est un système informatique autonome interagissant en temps réel avec le monde physique de manière généralement invisible. Il est constitué de un ou plusieurs processeurs accompagnés de logiciels [DEL02]. Initialement réservés aux grands domaines technologiques classiques comme le spatial, le nucléaire ou l aéronautique, les systèmes embarqués apparaissent désormais massivement à l échelle de l individu et envahissent tous les domaines de sa vie privée et professionnelle : téléphones mobiles, assistants personnels, cartes à puces, appareils multimédias, automobiles, domotique, surveillance médicale, Le marché des systèmes embarqués est en pleine explosion, puisqu il représentait 40 milliards d euros en 2002 et que sa croissance est d environ 20% par année (Durlacher Research). Les secteurs les plus porteurs sont le transport, le multimédia, la téléphonie, la monétique, la transitique (logistique limitée aux liaisons internes d une entreprise) et la banque. Les téléphones mobiles et assistants personnels contribuent de manière non négligeable à la croissance du marché des terminaux embarqués. Selon un rapport publié par la société d'étude britannique Canalys, le marché mondial des terminaux mobiles (téléphones mobiles, PDA, Smartphones ) affiche une croissance de 41 % pour le premier trimestre 2004 (par rapport au premier trimestre 2003) [JNE04]. Le tableau présenté ci-dessous illustre ce phénomène de croissance (source Canalys). Le marché mondial des terminaux mobiles au 1er trimestre 2004 Constructeur Ventes (en millions d'unités) Part de marché Evolution des ventes (par rapport au premier trimestre 2003) Nokia 1,67 28,2 % +85 % PalmOne 0,99 16,8 % -9 % HP 0,57 9,7 % +29 % RIM 0,37 6,4 % +301 % Fijutsu 0,36 6,1 % +507 % Motorola 0,31 5,3 % % Sony Ericsson 0,26 4,4 % +19 % Sony 0,20 3,4 % -45 % Dell 0,16 2,7 % -3 % Siemens 0,08 1,5 % +470 % Autres 0,90 15,5 % +10 % Total 5, % +41 % - 5 -
6 Typologie des applications Il est intéressant d établir une typologie des applications destinées aux systèmes embarqués en fonction des différentes architectures [DEL02] (cf Gartner Model): Les applications locales qui peuvent s exécuter sur des terminaux sans couverture réseau. Ce sont, par exemple, les jeux autonomes, les calculatrices, les mémo pad, Les applications fonctionnant en réseau peer-to-peer qui sont des applications réseau terminal à terminal sans serveur. Ce sont, par exemple, les applications de chat en direct, les jeux en réseau, Les applications client-serveur (client léger) qui sont des applications très légères dans lesquelles le terminal côté client a une logique applicative limitée. Ce sont, par exemple, les applications qui mettent en forme du contenu fourni par une application serveur. Les applications client-serveur intelligentes (client lourd) qui sont les applications dans lesquelles le terminal côté client a plus de logique applicative et de traitement local. Le tableau ci-dessous présente les types de clients par catégorie d application. Catégorie d application Micronavigateur (navigateur WAP) J2ME Application locale Non Oui Réseau peer-to-peer Non Oui Application client-serveur (client léger) Application client-serveur (client lourd) [DEL02] Oui Non Oui Oui Notons que l on peut également classer les applications par domaine : loisirs, applications métier, applications PIM (Personal Information Manager), application réseau, utilitaires, Le domaine des loisirs comprend les jeux autonomes et en réseau. Les principales applications métier concernent le commerce électronique, la banque, le CRM (Customer Relationship Management) ainsi que la gestion des ressources. Les applications PIM comprennent les planificateurs, les répertoires d adresses Les applications de connectivité comprennent les clients de messagerie, les gestionnaires de SMS, Le domaine des utilitaires comprend les calculatrices, les memos pad, - 6 -
7 1.2. J2ME et les systèmes embarqués En 1998, Sun Microsystems Laboratories lance le projet de recherche Spotless dont le but est d adapter le langage Java pour des systèmes limités en ressource et de réaliser une machine virtuelle de petite taille assurant la portabilité. En Juin 1999, Sun présente la nouvelle plate-forme Java 2 Micro Edition (J2ME). Les travaux de standardisation des composants du J2ME débutent en Octobre 1999 [WJS04]. J2ME fait partie de la plate-forme Java 2. Ci-dessous vous trouverez une illustration qui situe la technologie J2ME au sein de la plate-forme Java 2. [JSU04] Comme l illustre l image ci-dessus, la technologie J2SE cible les ordinateurs standards de bureau, la technologie J2EE est destinée aux serveurs et la technologie J2ME est spécialement conçue pour le développement d applications sur des terminaux mobiles. Sun Microsystems cible donc le marché avec une suite de technologies fondées sur Java qui simplifient le déploiement pour les fabricants de terminaux, les fournisseurs de services et les développeurs d applications des produits client et embarqués. J2ME s adresse particulièrement aux terminaux embarqués, comme les téléphones cellulaires, les assistants personnels (PDA), les décodeurs TV numérique, les consoles de jeux, les terminaux de paiement, les systèmes embarqués dans les véhicules, Ces terminaux sont soumis à certaines contraintes : Interface utilisateur limitée (clavier, écran tactile) Affichage limité (taille, couleur) Peu de mémoire Connectivité limitée Alimentation (batterie) - 7 -
8 Encombrement et poids faibles Résistance aux chocs La présente étude se concentrera plus particulièrement sur les terminaux de type téléphone cellulaire. Ces terminaux spécialisés, aux fonctionnalités limitées, sont généralement dotés de processeurs 32 bits et d une connectivité réseau Tour d horizon de la technologie J2ME J2ME offre un certain nombre d avantages dans le domaine du développement d applications embarquées. Le premier d entre eux est la mise à disposition d outils performants (J2ME Wireless Toolkit) et faciles à utiliser garantissant un développement rapide des applications. Ces outils permettent par exemple de minimiser l utilisation du terminal dans le cycle de développement en mettant à la disposition du développeur un émulateur de terminal. L émulateur reproduit fidèlement le comportement d un terminal, y compris ses performances et son aspect physique. Notons qu il est primordial que l émulateur reproduise les mêmes performances qu un vrai terminal afin de développer des applications parfaitement adaptées aux performances réelles du terminal et non pas à celle de l ordinateur de bureau effectuant l émulation. Les outils proposés permettent également un déploiement aisé des applications grâce au mécanisme de packaging. Ces outils seront présentés dans la dernière partie de ce dossier (cf 4). Un autre avantage considérable de la technologie J2ME est qu elle permet de développer des applications adaptées aux capacités des terminaux en réutilisant des sous-ensembles d API existantes et en proposant des éléments optionnels. J2ME est une technologie basée sur une architecture modulaire. Les briques de base de la technologie J2ME sont la configuration, le profil et les packages optionnels [DSU04]. Une configuration est une machine virtuelle ainsi qu un ensemble minimal de classes de base et d API. Elle spécifie un environnement d exécution généralisé pour les terminaux embarqués et agit comme plate-forme Java sur le terminal. Un profil est une spécification des API Java définie par l industrie, utilisée par les fabricants et les développeurs à destination de terminaux spécifiques. Un package optionnel est, comme son nom l indique, un package qui peut ne pas être implémenté sur un terminal particulier. Les machines virtuelles J2ME et les spécifications d API de plate-formes spécifiques sont développées en sollicitant les besoins d entrée par l initiative du JCP (Java Community Process) de façon à s assurer que les spécifications répondent aux besoins spécifiques d une famille ou d une catégorie de terminaux clients. Une fois une JSR (Java Specification Request) acceptée par l initiative JCP, la JSR, qui peut être proposée par Sun Microsystems ou par une autre société, crée une machine virtuelle Java et une implémentation de référence API pour la plate-forme J2ME cible
9 Ci-dessous quelques exemples de JSR [DSU04]: JSR 30 pour CLDC (Connected Limited Device Configuration) JSR 36 pour CDC (Connected Device Configuration) JSR 37 pour MIDP (Mobile Information Device Profile) JSR 46 pour Foundation profile JSR 62 pour Personal profile JSR 66 pour RMI Profile La technologie J2ME bénéficie des avantages liés aux autres technologies de la plate-forme Java 2, à savoir : Write Once Run Anywhere (Ecrire Une fois et Exécuter Partout) : en effet, la machine virtuelle Java permet la portabilité des applications. Par exemple, un développeur n aura pas besoin d écrire et de maintenir différentes versions d une même application pour qu elle puisse s exécuter sur un Nokia Communicator (EPOC Operating System), sur un Compaq ipaq (Pocket PC Operating System) ou sur un PDA utilisant Linux comme système d exploitation. Sécurité : J2ME repose sur le modèle de sécurité Sandbox. Lorsqu une application est exécutée elle ne peut accéder aux ressources système en dehors de la Sandbox ce qui limite les problèmes de virus. J2ME bénéficie également de solutions de sécurité pour les transactions électroniques comme SSL. Une riche interface graphique : J2ME comporte des API riches et adaptées à chaque catégorie de terminaux mobiles Les machines virtuelles La machine virtuelle Java (JVM) se trouve au centre de la technologie Java. Elle permet aux applications écrites dans le langage de programmation Java d être portables sur différents environnements matériels et systèmes d exploitation. La machine virtuelle se situe entre l application et la plate-forme utilisée, convertissant le bytecode de l application en code machine approprié au matériel et système d exploitation utilisé. La machine virtuelle assume également des tâches relatives à la gestion de la mémoire du système. Deux machines virtuelles sont proposées par J2ME, la KVM associée à la configuration CLDC et la CVM associée à la configuration CDC [DSU04][DEL02]. KVM (Kilo Virtual Machine) est une implémentation runtime extrêmement légère de la machine virtuelle Java qui peut être utilisée dans les terminaux disposant de peu de mémoire, comme les téléphones cellulaires, les pagers bidirectionnels et les PDA. Cette machine virtuelle fonctionne avec des processeurs 16 et 32 bits et un total de mémoire d environ 100 Ko. CVM (Convergence Virtual Machine) est une machine virtuelle Java 2 conçue pour les terminaux ayant besoin de l ensemble des - 9 -
10 fonctionnalités de la JVM mais avec des capacités plus réduites. CVM est conçue pour répondre aux besoins du marché émergent des terminaux embarqués de prochaine génération. Les terminaux utilisant CVM sont généralement des terminaux compacts. D autres machines virtuelles pour l embarqué sont proposées par différents constructeurs comme la J9 (développée par IBM) associée à la configuration CDC, la Monty (développée par Sun), la MicrochaiVM (développée par HP) et la JBED (développée par la société suisse Esmertec) qui sont associées à la configuration CLDC. Ci-dessous vous trouverez un aperçu de l offre en machines virtuelles embarquées [MVE02]. Editeur Apogee Esmertec Hewlett Packard IBM Software Group Insignia Kada Systems NewMonics One Eighty Software Sun Microsystems Tao Machine virtuelle Portage optimisé des JVM de Sun JBED Chai VM Microchai VM J9 Technologie Spécification OS Processeurs JIT + interpréteur, optimiseur Compilateur FastBCC (bytecode to native) AOT, JIT, adaptatif AOT, JIT, adaptatif AOT, JIT, adaptatif PJava, CDC, CLDC CLDC/MIDP Core, CLDC/MIDP Core, CLDC/MIDP, CDC/FP Jeode adaptatif Personal Java Jeode EVM adaptatif CDC/FP Mobile Foundation Mobile ROI Perc adaptatif JIT + interpréteur AOT, JIT, adaptatif CLDC/MIDP CLDC/MIDP J2SE, J2ME/CDC LynxOS, VxWorks PalmOS, PocketPC, Linux, Nucleus, JBED Rtos Windows CE, PocketPC, QNX Linux, PalmOS, PocketPC Linux, PalmOS, PocketPC, QNX, Ose VxWorks, Nucleus, Windows CE, Linux Linux, VxWorks, NT4 Nucleus, itron, PocketPC PalmOS, PocketPC, Wind, Linux VxWorks, VxWorks AE, Nucleus, Ose, Linux Origin - J propriétaire PJava, JavaCard Origin PowerPC, x86, Arm 7/9 StrongArm, Xscale, PXA 210/250, PowerPC, ColdFire, 68k SA1100, SH3/4, x86 x86, 68k, PowerPC, StrongArm, SH4, Mips Arm, Mips, SH3/4, PowerPC x86, Mips, PowerPC Arm, Omap Arm, TI, Mips, SH3/4 PowerPC, x86, Microcontrôleurs 8 bits H8, 8051, 68xx et 16 bits Monty adaptatif CLDC/MIDP Arm, Jazelle Intent JTE JIT sans interpréteur CLDC/MIDP PocketPC, VxWorks, SymbianOS Arm, Omap, Risc
11 Les configurations Comme nous l avons cité précédemment, J2ME est une technologie basée sur une architecture modulaire. La configuration occupe une place importante dans cette architecture. Elle détermine une plate-forme minimale pour une catégorie de terminaux ayant des caractéristiques analogues en mémoire totale et en capacité de traitement. La configuration détermine une adjonction minimale ou «le plus petit dénominateur commun» à la technologie Java. Toutes les fonctionnalités inclues dans une configuration doivent être généralement applicables à une grande variété d appareils. La technologie J2ME est constituée de deux configurations, CLDC (Connected Limited Device Configuration), pour les terminaux légers à connexion limitée, et CDC (Connected Device Configuration), pour les terminaux légers connectés. CLDC JSR 30 est disponible comme implémentation de référence de CLDC. Cette configuration consiste en la machine virtuelle K (KVM) et un ensemble de bibliothèques de classes noyau appropriées à l utilisation dans un profil de l industrie, comme le profil spécifié par l implémentation de référence MIDP. Les terminaux concernés sont dotés d interfaces utilisateur simplifiées, de processeurs 16 ou 32 bits, d une capacité mémoire disponible pour la plate-forme Java de 128 Ko à 512 Ko et de connexions réseau intermittentes à faible bande passante. CDC JSR 36 est fondée sur la spécification de machine virtuelle classique qui définit un environnement runtime complet. Cette configuration est destinée aux terminaux disposant de ressources plus conséquentes, à savoir : une interface utilisateur très diversifiée, une capacité mémoire disponible pour la plate-forme Java dépassant en tout cas les 512 Ko, un processeur 32 bits et une connexion réseau permanente avec une large bande passante. Notons qu il existe une version révisée de CLDC 1.0 (JSR 30) : la version 1.1 de CLDC (JSR 139). Cette version révisée de CLDC inclut des nouvelles caractéristiques comme le support des nombres à virgule et l emploi de références faibles. CLDC 1.1 est «rétro-compatible» avec la version CLDC 1.0. Une version révisée de CDC est en cours de développement et sera bientôt disponible: CDC 1.1 (JSR 218). [DEL02][DSU04][WJS04][JSU04] Les profils Le profil est également une pièce fondamentale de l architecture modulaire de la technologie J2ME. C est une couche située au dessus de la configuration qui correspond à une spécification d API Java définie par l industrie et utilisée par les fabricants et les développeurs pour des terminaux spécifiques. La machine virtuelle et les API de base spécifiées par une configuration ne suffisent pas pour construire une application complète. Le profil ajoute des API plus spécifiques
12 pour la gestion du cycle de vie d une application, l interface graphique et le stockage permanent. Il existe deux familles de profils : ceux qui dépendent de la configuration CLDC et ceux qui dépendent de la configuration CDC. Ci-dessous vous trouverez une brève description des principaux profils existant dans J2ME. MIDP est un profil qui nécessite l implémentation de référence CLDC et qui fournit des classes pour l écriture d applications qui tournent sur des terminaux mobiles comme les téléphones cellulaires et les pagers bidirectionnels. Le profil MIDP fournit une plate-forme standard pour les petits terminaux mobiles aux ressources limitées. Ce profil est destiné aux terminaux répondant aux caractéristiques suivantes : Ko de mémoire totale (ROM + RAM) disponible pour le runtime Java et ses bibliothèques ; - puissance et batterie limitée ; - connectivité à certains type de réseaux sans fil à faible bande passante ; - interfaces utilisateur à différents niveaux de sophistication. Il existe à l heure actuelle deux versions de MIDP : MIDP 1.0 (JSR 37) et MIDP 2.0 (JSR 118). MIDP 2.0 correspond à une version révisée de la spécification MIDP 1.0 qui inclut des nouvelles caractéristiques comme une interface graphique évoluée, des fonctionnalités pour les jeux et le multimédia ainsi que des possibilités étendues en matière de connectivité et de sécurité. Notons également que MIDP 2.0 est «rétro compatible» avec MIDP 1.0. PDAP JSR 75 est un profil associé à la configuration CLDC qui fournit des API d interface utilisateur et de stockage de données pour les petits terminaux Handheld aux ressources limitées comme les PDA. Les terminaux visés ont les caractéristiques suivantes : - pas moins de 512 Ko et pas plus de 16 Mo de mémoire totale (ROM + RAM) disponible pour le runtime Java et les bibliothèques ; - puissance et batterie limitées ; - interface utilisateur de différents degrés de sophistication, terminaux disposant d un affichage d une résolution supérieure à pixels, d un dispositif de pointage et d une entrée pour caractères. Foundation Profile JSR 46 est un profil associé à la configuration CDC qui est destiné aux terminaux ayant besoin d un support pour une plate-forme Java avec un réseau riche mais qui ne nécessitent pas d interface utilisateur. Il fournit en outre un profil de base pour d autres profils qui auraient besoin de construire leurs propres fonctionnalités en ajoutant, par exemple, une GUI (Graphical User Interface). Les terminaux visés ont les caractéristiques suivantes : Ko de ROM (sans compter les besoins mémoire des applications);
13 - 512 Ko de RAM (sans compter les besoins mémoire des applications); - connectivité à certains types de réseaux ; - aucune interface graphique (à moins que les fonctionnalités d interface graphique soient fournies par un profil additionnel). Personal Profile JSR 62 est un profil associé à la configuration CDC qui est destiné aux terminaux nécessitant un haut niveau de connectivité Internet et une fidélité Web. Ce profil est conçu pour pour être compatible avec la spécification de l environnement d application PersonalJava. Les caractéristiques des terminaux visés sont les suivantes : - un minimum de 2.5 Mo de ROM (sans compter les besoins mémoire des applications); - un minimum de 1 Mo de RAM (sans compter les besoins mémoire des applications); - connectivité robuste à certains types de réseaux ; - interface graphique avec un haut degré de fidélité Web et la possibilité d exécuter des applets ; - support de l implémentation complète de J2ME Foundation Profile et de J2ME CDC. [DEL02][DSU04][WJS04][JSU04] Les packages optionnels Le package optionnel est également un élément clé de l architecture modulaire de la technologie J2ME. Un package optionnel fournit des fonctionnalités qui ne devraient pas être associées à une configuration ou à un profil particulier. Bluetooth API JSR 82 est un exemple de package optionnel qui fournit une API standard pour les connexions réseau sans fil Bluetooth. Ce package optionnel pourrait être implémenté avec n importe quelle combinaison de configurations et de profils. Ci-dessous vous trouverez une description des principaux packages optionnels existant dans J2ME. BTAPI JSR 82 (Bluetooth API) fournit une API standard pour l intégration des terminaux mobiles dans un environnement Bluetooth. Cette spécification inclut le support des protocoles Bluetooth suivants : RFCOMM, OBEX et Service Discovery Protocol. D autres protocoles seront ajoutés dans des versions futures de ce package optionnel. Les terminaux visés par cette spécification ont les caractéristiques suivantes : - un minimum de 512 Ko de mémoire totale (ROM + RAM) - connexion réseau Bluetooth
14 WMA JSR 120 (Wireless Messaging API) fournit une API standard pour accéder aux fonctionnalités de communication d un terminal mobile. Les technologies concernées sont les suivantes : - SMS (Short Message Service) - USSD (Unstructured Supplementary Service Data) - CBS (Cell Broadcast Service) Notons qu il existe une spécification plus récente, WMA 2.0 JSR 205, qui définit une interface pour l envoi et la réception de MMS. PIM JSR 75 (Personal Information Management) est un package optionnel offrant la possibilité d accéder aux données natives résidant dans les terminaux mobiles comme les PDA ou les téléphones mobiles. Ce package permet par exemple d accéder aux données contenues dans l agenda ou le répertoire d adresses d un PDA. MMAPI JSR 135 (Mobile Media API) définit une interface pour les fonctionnalités multimédia des terminaux mobiles compatibles J2ME. Ci-dessous vous trouverez une illustration clarifiant l architecture décrite précédemment suivie d un tableau regroupant l ensemble des JSR (configurations, profils et packages optionnels) concernant J2ME [DSU04]:
15 Configurations JSR 30 CLDC 1.0 Connected, Limited Device Configuration JSR 139 CLDC 1.1 Connected, Limited Device Configuration 1.1 JSR 36 CDC Connected Device Configuration JSR 218 CDC 1.1 Connected Device Configuration 1.1 Profils JSR 37 MIDP 1.0 Mobile Information Device Profile JSR 118 MIDP 2.0 Mobile Information Device Profile 2.0 JSR 75 PDAP PDA Profile JSR 46 FP Foundation Profile JSR 219 FP 1.1 Foundation Profile 1.1 JSR 129 PBP Personal Basis Profile JSR 217 PBP 1.1 Personal Basis Profile 1.1 JSR 62 PP Personal Profile JSR 215 PP 1.1 Personal Profile 1.1 JSR 195 IMP Information Module Profile JSR 228 IMP-NG Information Module Profile - Next Generation Packages optionnels JSR 75 PIM PDA Optional Packages for the J2ME Platform JSR 82 BTAPI Java APIs for Bluetooth JSR 120 WMA Wireless Messaging API JSR 205 WMA 2.0 Wireless Messaging API 2.0 JSR 135 MMAPI Mobile Media API JSR 164 JAIN SIMPLE Presence JSR 165 JAIN SIMPLE Instant Messaging JSR 172 J2ME Web Services JSR 177 SATSA Security and Trust Services API for J2ME JSR 179 Location API for J2ME JSR 180 SIP SIP API for J2ME JSR 184 3D Mobile 3D Graphics API for J2ME JSR 186 JAIN Presence JSR 187 JAIN Instant Messaging JSR 190 Event Tracking API for J2ME JSR 209 Advanced Graphics and User Interface Optional Package for J2ME Platform JSR 211 CHAPI Content Handling API JSR 213 Micro WSCI Framework for J2ME JSR 214 Micro BPSS for J2ME Devices JSR 226 Scalable 2D Vector Graphics API JSR 229 Payment API JSR 230 Data Sync API JSR 232 Mobile Operational Management JSR 234 Advanced Multimedia Supplements JSR 238 Mobile Internationalization API JSR 239 Java Bindings for OpenGL ES JSR 246 Device Management API
16 La pile JSR 185 JTWI (Java Technology for the Wireless Industry) Un terminal mobile compatible J2ME implémente une pile logicielle consistant généralement en une configuration, un profil et des packages optionnels. La première génération de téléphones mobiles compatibles J2ME implémente généralement la pile logicielle suivante : Beaucoup de fabricants de téléphones mobiles proposent leurs propres API pour offrir des fonctionnalités étendues (généralement développées par l intermédiaire de JCP). Il en résulte un phénomène de fragmentation. Un développeur MIDP désire savoir quelles API optionnelles sont disponibles pour des terminaux particuliers. Il est possible de découvrir la présence d API au runtime, mais cette technique ajoute de la complexité au code. Il est également possible de distribuer plusieurs versions d une application mais ceci dérogerait au principe fondamental des plate-formes Java, à savoir «write once and run everywhere». Le phénomène de fragmentation peut donc engendrer des problèmes de portabilité. D autres problèmes peuvent également limiter la portabilité d une application. En effet, certains constructeurs fixent des limites pour la taille d une application. Il peut arriver qu une application MIDP 1.0 développée en respectant strictement les spécifications ne soit pas exécutable sur un terminal (MIDP 1.0 / CLDC 1.0). Le constructeur du terminal en question a pu fixer une limite pour la taille du fichier *.jar mais également une taille limite pour le heap (espace mémoire pour l exécution de l application). Le problème le plus délicat interférant sur la portabilité d une application réside cependant dans l utilisation des threads. La spécification MIDP 1.0 inclut la classe java.lang.thread mais ne donne aucune indications sur le nombre de threads supportés par une implémentation. Si une application comporte un nombre importants de threads, elle risque de ne pas pouvoir s exécuter correctement sur certains terminaux. Pour résoudre ces problèmes, une spécification particulière issue des travaux de la JSR 185 et nommée Java Technology for the Wireless Industry (JTWI) a été développée. Cette spécification impose aux périphériques qui la respectent de mettre en œuvre CLDC 1.0 ou 1.1, MIDP 2.0 et WMA. Le support de MMAPI est optionnel. La pile JSR 185 offre donc une vision claire au développeur des API disponibles pour un terminal mobile compatible JTWI
17 La spécification JSR 185 fournit tous les détails nécessaires pour garantir qu une application sera exécutable sur tous les terminaux implémentant cette pile logicielle. Vous trouverez plus de détails sur la pile JSR 185 en consultant l adresse suivante : [DSU04][WJS04][JSU04] Les autres API Java pour terminaux embarqués Ces autres API Java ne font pas directement partie de J2ME mais il est tout de même intéressant de les citer. Certaines sont destinées au contrôle du téléphone, d autres concernent la télévision numérique ou encore les cartes de crédit. Java Phone API est une extension verticale de la plate-forme PersonalJava. Cette API fournit un accès aux fonctionnalités spécifiques des terminaux de téléphonie client. Elle permet notamment de contrôler le téléphone, d envoyer des messages à base de datagrammes, d obtenir des informations du carnet d adresse et du calendrier. Java TV API est une extension verticale de la plate-forme PersonalJava destinée à la création d applications interactives pour la télévision numérique. Cette API permet la mise en œuvre de transactions de commerce électronique, de publicité interactive ou encore d applications de banque à domicile. Java Card est destinée au développement pour cartes intelligentes. Une carte intelligente est une carte de crédit dotée d un circuit intégré (CI). Le CI contient un microprocesseur et de la mémoire permettant à la carte de stocker et traiter des informations. Java Card donne au développeur la possibilité de standardiser une plate-forme de carte commune. Cela signifie, par exemple, qu un opérateur de téléphonie sans fil GSM (Global System for Mobile communications) peut facilement développer de nouveaux services susceptibles d être téléchargés de manière sélective sur la carte intelligente résidant dans le téléphone. Connexion Jini est une technologie permettant aux services de fonctionner dynamiquement et simplement avec d autres services. Dans une communauté Jini, le services disposent d un code de découverte et de recherche dont ils ont besoin pour fournir immédiatement les services aux autres membres de la communauté. Quand un nouveau service est mis à disposition sur le réseau, il n est pas nécessaire d éditer des fichiers de configuration, d arrêter et de redémarrer des serveurs ou de configurer des passerelles. De plus, les communautés Jini supportent les infrastructures redondantes ce qui assure une disponibilité des services même en cas de pannes de serveurs ou de problèmes liés au réseau
18 JES (Java Embedded Server) est destiné aux périphériques de terminaison à large bande comme un modem DSL par exemple. Cette technologie permet de transformer le périphérique en passerelle résidentielle. Une passerelle résidentielle est un boîtier situé chez l utilisateur lui permettant de se connecter à Internet et d accéder à différents services. Les technologies JES et Connexion Jini sont liées. En effet, Connexion Jini supporte des communautés de services spontanément crées et JES est un framework permettant de générer les services délivrés à Jini. [DEL02][WJS04][JSU04]
19 Dans cette deuxième partie, vous trouverez une étude détaillée de la configuration CLDC. 2. La configuration CLDC Le rôle de CLDC (Connected Limited Device Configuration) est de définir une plate-forme Java standard adaptées aux terminaux légers dotés de peu de ressources. CLDC répond à la nécessité de faire tourner des applications sur une grande variété de petits terminaux, allant des terminaux de communication sans fil, comme les téléphones cellulaires et les pagers bidirectionnels, jusqu aux organiseurs personnels, aux terminaux de points de vente et aux équipements domestiques. CLDC est le plus petit commun dénominateur de la technologie Java applicable à une grande variété de terminaux mobiles. Il garantit la portabilité et l interopérabilité du code au niveau des profils entre les différents types de terminaux mobiles compatibles CLDC. La configuration CLDC ne définit que les bases communes à l ensemble des terminaux : entrées-sorties, réseau, sécurité, internationalisation. En ce qui concerne les fonctionnalités de plus haut niveau, c est au profil spécifique du terminal de les prendre en charge : gestion du cycle de vie de l application, interface utilisateur, gestion des évènements Les limitations de CLDC La configuration CLDC est sujette à un certain nombre de limitations dont il faut tenir compte lors de la conception et du développement d une application Support de la virgule flottante CLDC ne supporte pas les nombres à virgule flottante float ou double. Lors du développement d une application, il est donc impossible d utiliser les types de données float et double. Cette limitation n est cependant pas catastrophique puisqu il existe un package, MathFP, permettant de simuler les calculs en virgule flottante. Ce package est disponible à l adresse suivante : [DEL02][WJS04][JSU04] Internationalisation des applications CLDC ne supporte que de manière limitée l internationalisation, qui consiste à traduire les caractères UNICODE depuis et vers une séquence d octets, d une part, et vers la localisation, d autre part
20 La conversion des caractères UNICODE est correctement assurée par l utilisation des classes java.io.inputstreamreader et java.io.outputstreamwriter. Cependant, les fonctionnalités de localisation ne sont pas spécifiées par CLDC. Pour être distribuée dans le monde entier, une application doit être internationalisée et localisée. Une application est dite internationalisée si elle gère plusieurs encodages de caractères. Une application est dite localisée si elle met en forme et interprète les dates, heures, zones horaires et monnaies selon les règles locales de l utilisateur, ou, pour être plus précis, selon les règles de sa langue et de son pays. Dans J2SE, la réalisation d applications internationalisée et localisée est facilitée grâce aux classes java.util.calendar, java.util.locale, java.text.format et java.io.reader. Dans J2ME CLDC, les choses se compliquent car ces classes ne sont pas toutes présentes. CLDC comprend les classes de J2SE suivantes : java.io.datainputstream java.io.dataoutputstream java.io.inputstreamreader java.io.outputstreamwriter java.io.reader java.io.writer java.util.calendar java.util.date java.util.timezone Les classes InputStreamReader et OutputStreamWriter assurent la conversion entre un flux d octets et un flux de caractères UNICODE. Cette conversion est effectuée en fonction du système d encodage de caractères utilisé sur le terminal. Les classes Calendar, Date et TimeZone sont des sous-ensembles des classes J2SE de même nom. Elles permettent d intégrer le support de la zone horaire locale de l utilisateur. CLDC ne fournit rien de plus pour la localisation. C est le rôle des profils d ajouter éventuellement des nouvelles fonctionnalités. Par exemple, le profil MIDP prévoit l implémentation d une propriété système microedition.locale, qui retourne la locale du terminal au format langue-pays. Il est important de réaliser que la principale contrainte lorsque l on développe une application pour terminal mobile est l espace mémoire (espace de stockage et espace d exécution). La première mesure à prendre consiste donc à ne pas fournir qu un seul fichier *.jar (JavaArchive) complet, qui prendrait en charge toutes les situations, mais plutôt à créer un fichier *.jar pour chaque cas. L utilisateur téléchargera et installera la version de l application pour son propre cas. Si ce téléchargement est réalisé depuis un serveur Web via un servlet, par exemple, ce dernier pourra même utiliser les en-têtes HTTP pour identifier la locale utilisée et retourner le fichier *.jar approprié. [DEL02][JSU04][API]
21 Support des propriétés d environnement La classe java.util.properties existant au sein de J2SE n est pas implémentée dans la configuration CLDC. Toutefois, un jeu limité de propriétés commençant par le mot-clé microedition peut être accédé en appelant la méthode suivante : System.getProperty(String key); Le tableau ci-dessous dresse la liste de ces propriétés. Clé Description Valeur microedition.platform Plate-frome ou terminal hôte Par défaut : null microedition.encoding Encodage de caractères par défaut Par défaut : ISO8859_1 microedition.configurations Configuration et version J2ME Par défaut : CLDC-1.0 microedition.profiles Nom des profils supportés Par défaut : null [DEL02][JSU04][API] Limitations diverses La configuration CLDC est confrontées à plusieurs autres limitations notamment concernant RMI (Remote Method Invocation), JNI (Java Native Interface) et les threads. Pas de finalisation : CLDC ne propose pas de méthode de finalisation des instances de classe Object.finalize(). Il n est donc pas possible de nettoyer un objet de la mémoire avant que le garbage collector le fasse (le garbage collector nettoie l instance de la mémoire au moment où il constate que celle-ci n est plus référencée). Limitations dans la gestion des erreurs : la palette de classes d erreur disponibles pour CLDC est limitée. La première raison à cela est que la gestion de certaines erreurs est spécifique au terminal cible. La deuxième raison est que le traitement des erreurs consomme beaucoup de ressources et qu il fallait l adapter à des terminaux disposant de peu de mémoire. Pas de JNI : JNI n est pas implémenté dans CLDC, d abord pour des raisons de sécurité, ensuite parce que l implémentation de JNI est trop coûteuse en mémoire. Pas de chargeur de classe défini par l utilisateur : pour des raisons de sécurité le chargeur de classe intégré ne peut être surchargé par l utilisateur. Ni réflexion, ni RMI, ni sérialisation d objet : la réflexion n est pas supportée, ce qui signifie que l application ne peut pas inspecter le contenu des classes, des objets ou des méthodes. Par conséquent, toutes les fonctionnalités découlant de la réflexion comme RMI ou la sérialisation d objets ne sont pas supportées dans CLDC
22 Pas de groupe de threads ou de threads démons : le multithreading est implémenté dans CLDC, mais les groupes de threads ou les threads démons ne le sont pas. Les threads démons sont des threads qui tournent en tâche de fond et proposent des services aux autres threads. Pas de références faibles : les références faibles ne sont pas autorisées dans CLDC. Une référence faible est un type de référence vers un objet qui permet de déterminer si un objet est finalisé. Elle permet de conserver une référence vers l objet sans l empêcher d être pris en compte par le garbage collector. [DEL02][JSU04] 2.2. La sécurité dans CLDC Les contraintes de taille mémoire ne permettent pas l utilisation du modèle de sécurité de J2SE dans J2ME. La prise en charge de la sécurité dans J2ME se traduit par un mécanisme de prévérification des fichiers de classe puis par le modèle de sécurité Sandbox Prévérification des fichiers de classe Lorsqu un fichier de classe est chargé, sa validité est vérifiée. Dans J2SE, cette vérification est effectuée au moment de l exécution (runtime) par la machine virtuelle. Il est évident que les contraintes de taille mémoire auxquelles sont confrontés les terminaux mobiles ne permettent pas d implanter le même mécanisme que dans J2SE. CLCD définit donc un autre mécanisme de vérification des fichiers de classes. Chaque méthode dans un fichier de classe Java téléchargé contient un nouvel attribut. Cet attribut est ajouté au fichier de classe standard par un utilitaire nommé prévérificateur (Preverifier). Le rôle de cet outil est d analyser chaque méthode se trouvant dans le fichier de classe. Cette prévérification est généralement effectuée sur un ordinateur de bureau avant que le fichier de classe soit téléchargé sur le terminal
23 Comme l illustre le schéma précédent, dans J2ME, une partie du travail de vérification des fichiers de classes est effectuée sur la station de développement de sorte à alléger la tâche du terminal cible. Cette solution permet aux machines virtuelles Java compatibles CLDC de vérifier les fichiers de classes beaucoup plus rapidement. Le mécanisme consomme un minimum de mémoire tout en garantissant le même niveau de sécurité qu avec la solution standard déployée dans J2SE. [DEL02][JSU04][DSU04] Le modèle de sécurité Sandbox Le principe du modèle de sécurité Sandbox Original est de considérer que le code local est autorisé à avoir un accès total aux ressources vitales du système tandis qu un code téléchargé est suspect et ne peut accéder aux ressources fournies à l intérieur du Sandbox. Le Sandbox est donc une zone permettant d exécuter en toute sécurité un code qui aurait pu être dangereux pour le système. Notons aussi que l ensemble des fonctions natives accessibles à la machine virtuelle est délimité. Le développeur ne peut pas télécharger de nouvelles bibliothèques contenant des fonctionnalités natives, ni accéder à des fonctions natives ne faisant pas partie des bibliothèques Java fournies par CLDC ou les profils. [DEL02][JSU04] 2.3. Les classes de CLDC Cette section présente les classes disponibles au sein de la configuration CLDC. CLDC comporte des classes héritées de J2SE et des classes spécifiques Les classes héritées de J2SE Les classes héritées de J2SE existant au sein de CLDC proviennent des packages java.lang, java.io et java.util. Le package java.lang contient les classes sytème, les classes de type et les classes d exception. Le package java.io propose des classes de lecture-écriture des flux de base. Le package java.util, quant à lui, fournit des classes utilitaires de base. Les classes reprises de J2SE dans CLDC sont pour la plupart allégées (méthodes simplifiées ou supprimées) de telle manière à ce qu elles soient adaptées aux contraintes de taille mémoire. Un certains nombre de packages sont inexistants dans CLDC, notamment : java.lang.awt, java.lang.rmi, java.lang.security, et java.lang.sql. Les classes contenues dans ces packages ne sont pas implémentées dans la configuration CLDC en raison des limitations de la KVM et des contraintes de taille mémoire auxquelles sont confrontés les terminaux mobiles compatibles CLDC
24 Le tableau ci-dessous recense les classes héritées de J2SE par CLDC. Type Package Classes Classes système Classes de type de données Classes d exception java.lang java.lang java.lang Object, Class, Runtime, System, Thread, Runnable, String, StringBuffer, Throwable Boolean, Byte, Short, Integer, Long, Character Exception, ClassNotFoundException,IllegalAccessException, InstantiationException, InterruptedException, RuntimeException, ArithmeticException, ArrayStoreException, ClassCastException, IllegalArgumentException, IllegalThreadStateException, NumberFormatException, IllegalMonitorStateException, IndexOutOfBoundsException, ArrayIndexOutOfBoundsException, StringIndexOutOfBoundsException, NegativeArraySizeException, NullPointerException, SecurityException Classes d erreur java.lang Error, VirtualMachineError, OutOfMemoryError Classes de collection java.util Vector, Stack, Hashtable, Enumeration Classes de calendrier et d horloge java.util Calendar, Date, Timezone Classes d exception java.util EmptyStackException, NoSuchElementException Classes d exception java.io EOFException, IOException, InterruptedException, UnsupportedEncodingException, UTFDataFormatException Classes d entrées-sorties java.io InputStream, OutputStream, ByteArrayInputStream, ByteArrayOutputStream, DataInput, DataOutput, DataInputStream, DataOutputStream, Reader, Writer, InputStreamReader, OutputStreamWriter, PrintStream Classes utilitaires java.util, java.lang Java.util.Random, java.lang.math [DEL02][API] Les classes spécifiques de CLDC En ce qui concerne les entrées-sorties et la connectivité réseau, la configuration CLDC n hérite pas de la totalité des classes contenues dans le package java.io de J2SE. De nouvelles classes ont été définies et regroupées sous le nom de GCF (Generic Connection Framework) dans le package javax.microedition.io. Ces classes spécifiques à la configuration CLDC sont les suivantes : Connection HttpConnection ConnectionNotFoundException Connector ContentConnection Datagram DatagramConnection InputConnection OutputConnection
25 StreamConnection StreamConnectionNotifier Comme son nom l indique, CLDC (Connected Limited Device Configuration) est conçue pour les terminaux pouvant se connecter au monde extérieur, que ce soit par liaison série, infrarouge ou sans fil. C est l objet du GCF (Generic Connection Framework), qui regroupe un ensemble de classes et d interfaces modélisant des types différents de connexions, allant de la simple connexion unidirectionnelle à une connexion datagramme. Le GCF repose sur la notion d abstraction de la même manière que JDBC pour les accès aux bases de données. Toutes les connexions sont crées avec une même méthode statique dans une classe appelée javax.microedition.connector. L instruction permettant d ouvrir une connexion aura la forme suivante : Connector.open( <protocole>:<adresse>;<paramètres> ); CLDC ne définit pas d implémentation de protocole. Ce sont les profils qui doivent implémenter certains des protocoles proposés par les spécifications de CLDC. Les différents protocoles que CLDC propose sont listés dans le tableau cidessous. Protocole Valeur Exemple HTTP http Connector.open( ) ; Socket Socket Connector.open( socket:// :1111 ); Port de communication série comm Connector.open( comm.:0; baudrate=9600 ); Datagramme datagram Connector.open( datagram:// ); Fichier file Connector.open( file:config.dat ); Système de fichiers réseau nfs Connector.open( nfs:/netinnovations.fr/config.dat ); Le GCF définit huit types de connexions toutes représentées sous la forme d interfaces de connexion définies dans le package javax.microedition.io. Le tableau ci-dessous recense ces connexions. Interface Description ContentConnection Permet une communication HTTP de base. Ne supporte que l encodage de caractères, le type MIME et la taille. StreamConnectionNotifier Permet une communication avec un client via une connexion par socket côté serveur. InputConnexion Gère une connexion en entrée. OutputConnection Gère une connexion en sortie. DatagramConnection Permet de communiquer avec une connexion datagramme (UDP p.ex) Connection Objet de connexion de base. StreamConnection Permet une communication basée sur les sockets. HttpConnection Permet de communiquer avec le protocole HTTP
26 Ces différentes interfaces de connexions sont organisées selon la hiérarchie présentée dans le schéma ci-dessous. «interface» Connection «interface» StreamConnectionNotifier «interface» InputConnection «interface» OutputConnection «interface» DatagramConnection «interface» StreamConnection «interface» ContentConnection «interface» HttpConnection Vous trouverez un exemple de mise en œuvre du composant HttpConnection dans l annexe n 3. Pour plus de détails concernant la configuration CLDC consultez la référence suivante : [DEL02][API]
27 Dans cette troisième partie, vous trouverez les éléments théoriques nécessaires pour entreprendre un développement MIDP (Mobile Information Device Profile). 3. Le profil MIDP Un MIDlet est une application développée pour MIDP. C est en quelque sorte un applet destiné à un terminal mobile MIDP et non pas à un navigateur Web. Le cycle de vie du développement d une application pour MIDP est constitué des étapes suivantes : Ecriture de l application avec les API de MIDP. Compilation et prévérification de l application. Test de l application avec un émulateur. Packaging de l application. Test de l application packagée sur le terminal mobile. Nous reviendrons plus en détails sur ces différentes étapes dans la partie pratique de ce dossier Le MIDlet Cycle de vie d un MIDlet Toutes les applications développées pour le profil MIDP doivent dériver de la classe abstraite MIDlet contenue dans le package javax.microedition.midlet. La classe MIDlet gère le cycle de vie de l application. Un MIDlet peut se retrouver dans quatre états différents : chargé (loaded) actif (active) suspendu (paused) détruit (destroyed) Lorsqu un MIDlet est chargé sur un terminal et que le constructeur est appelé son état est chargé (loaded). C est état précède l état actif (active) découlant de l appel de la méthode startapp() par le gestionnaire d application. Le gestionnaire d application est un logiciel dépendant du terminal mobile. Il est implémenté par le fabricant du terminal. Ce gestionnaire gère l installation, l exécution et le retrait des MIDlets sur le terminal. Il fournit généralement un mécanisme de gestion des erreurs. Après l appel de la méthode startapp() le MIDlet se retrouve dans l état actif jusqu à ce que le gestionnaire appelle la méthode pauseapp() ou destroyapp() : pauseapp() suspend le MIDlet tandis que destroyapp(boolean unconditional) termine l exécution du MIDlet
28 Les trois méthodes permettant de gérer le cycle de vie d un MIDlet sont des méthodes abstraites et doivent obligatoirement être redéfinies. Le squelette d une application pour le profil MIDP sera donc le suivant : import javax.microedition.midlet.* ; public class Test extends MIDlet { public Test() { public void startapp() { public void pauseapp() { public void destroyapp(boolean unconditional) { La figure ci-dessous donne un aperçu du cycle de vie d un MIDlet. La méthode pauseapp() permet de libérer les ressources qui ne sont pas nécessaires lorsque l application est suspendue. Un MIDlet exécuté sur un téléphone mobile sera par exemple suspendu au moment ou l utilisateur reçoit un appel téléphonique. Le MIDlet devra alors libérer les ressources jusqu à la reprise de son exécution. La méthode destroyapp(boolean unconditional) prend un paramètre de type booléen en entrée. Si ce paramètre est false, le MIDlet peut refuser qu on termine son exécution en lançant l exception MIDletStateChangeException
29 La méthode resumerequest() permet au MIDlet d indiquer son intention de passer à l état actif. Lorsqu un MIDlet décide de se mettre dans l état suspendu, il doit informer le gestionnaire d application en appelant la méthode notifypaused(). Le gestionnaire d application doit également être informé de la fin de l exécution d un MIDlet en appelant la méthode notifydestoyed(). [DEL02][JSU04] L accès aux attributs du fichier *.jar Le moyen le plus simple pour distribuer une application MIDP est d utiliser le format de fichier archive *.jar. Un certain nombre de fichiers sont regroupés dans un fichier archive *.jar. Ce sont les fichiers de classes, les fichiers de ressources (des images au format *.png par exemple) et le fichier décrivant le contenu du fichier *.jar lui-même. Ce dernier fichier se nomme manifest.mf. Le tableau ci-dessous dresse la liste des attributs pouvant être définis dans le fichier manifest.mf. Attributs MIDlet-Name MIDlet-Version MIDlet-Vendor MIDlet-Icon MIDlet-Description MIDlet-Info-URL MIDlet-<n> MIDlet-Jar-URL MIDlet-Jar-Size MIDlet-Data-Size MicroEdition-Profile MicroEdition-Configuration Description Nom du package MIDlet Numéro de version du MIDlet Auteur du MIDlet Icône associée au MIDlet (image au format *.png) Description du MIDlet URL pouvant fournir des informations supplémentaires sur le MIDlet et/ou le vendeur Contient trois informations : le nom du MIDlet, l icône de ce MIDlet, le nom de la classe chargée par le gestionnaire d applications URL du fichier *.jar Taille du fichier *.jar (en octets) Nombre minimum d octets nécessaires pour le stockage de données persistantes Profil J2ME imposé par le MIDlet Configuration J2ME imposée par le MIDlet Seuls les attributs MIDlet-Name, MIDlet-Version, MIDlet-Vendor, MIDlet-<n>, MicroEdition-Profile et MicroEdition-Configuration sont obligatoires. Un MIDlet peut accéder aux attributs contenus dans le fichier manifest.mf grâce à la méthode javax.microedition.midlet.midlet.getappproperty(string key). Pour obtenir des informations sur l auteur du MIDlet on utilisera la méthode de cette manière : String infoauteur = getappproperty( MIDlet-Vendor ); [DEL02][API]
30 3.2. L interface utilisateur Comme nous l avons vu dans la deuxième partie de ce dossier, la configuration CLDC ne fournit pas les classes nécessaires au développement d une interface utilisateur. C est le rôle du profil de fournir ces classes. Cette section présente les API proposées par le profil MIDP pour le développement d une interface utilisateur. L interface utilisateur des terminaux mobiles est sujette à des contraintes différentes de celles d un ordinateur de bureau (taille de l affichage restreinte, pas de souris ). C est pourquoi les API d interface utilisateur fournies par MIDP ne s appuient pas sur les API de J2SE comme AWT (Abstract Window Toolkit) ou Swing Les principes de l interface utilisateur MIDP L interface utilisateur MIDP est constituée de deux API, l une de haut niveau et l autre de bas niveau. La première API a un haut niveau d abstraction, qui assure un non moins haut niveau de portabilité. Cette API offre peu de contrôle sur l apparence visuelle (forme, couleur, police de caractères) des composants. La seconde API a un faible niveau d abstraction. Elle offre un contrôle précis du positionnement et de la gestion des éléments graphiques. Elle permet également d accéder aux événements de saisie. Les MIDlets qui accèdent à l API de bas niveau ne garantissent pas la portabilité car cette API fournit des fonctionnalités spécifiques aux terminaux, comme la taille de l écran ou l utilisation d un système de pointage. L interface utilisateur repose sur la notion d écran, ou Screen, un objet qui encapsule les composants graphiques du terminal. Un seul écran peut être visible à la fois et l utilisateur navigue parmi les composants de cet écran. On distingue trois types d écran : Ecran comprenant des composants complexes, comme les composants List ou TextBox. Sa structure est prédéfinie, et l application ne peut y ajouter d autres composants. Ecran comprenant un composant formulaire Form. L application peut ajouter du texte, une image et des composants liés au formulaire. Ecran utilisé avec l API de bas niveau, comme les sous-classes de la classe Canvas. La classe Display est le gestionnaire d affichage utilisé par le MIDlet. Elle fournit entre autres les méthodes nécessaires pour connaître les capacités d affichage du terminal. Pour rendre visible un écran, il suffit d appeler la méthode setcurrent(displayable nextdisplayable) de la classe Display. Un certain nombre de règles sont à respecter lors du développement d une interface graphique avec le profil MIDP : Concevoir des interfaces utilisateur simples et faciles à utiliser. Utiliser l API de haut niveau pour garantir au maximum la portabilité
31 L application ne doit pas dépendre d une taille d écran particulière, elle doit demander au terminal la taille de l affichage et s adapter à cette contrainte. La saisie d information pouvant être pénible, il faut privilégier les listes de choix dans lesquelles l utilisateur est invité à faire une sélection. Eviter l utilisation de bibliothèques de classes tierces comme kawt, qui est une version allégée de AWT adaptée à la KVM. [DEL02][JSU04][API] Les classes d affichage Les briques de base de l interface utilisateur MIDP sont les calsses Displayable, Display, Screen et Canvas contenus dans le package javax.microedition.lcdui. La figure ci-dessous présente la hiérarchie des classes de l interface utilisateur MIDP. [DEL02][API] La classe Display La classe Display correspond au gestionnaire d affichage. Elle permet de lire les propriétés du terminal et de demander l affichage des objets sur le terminal. Il ne peut y avoir qu une seule instance de Display par MIDlet. Cette unique instance peut être obtenue à n importe quel moment durant l exécution du MIDlet en appelant la méthode suivante :
32 static Display getdisplay(midlet m) A un gestionnaire d affichage peut correspondre plusieurs objets affichables (Displayable). Pour obtenir l objet Displayable courant, la méthode suivante doit être appelée : Displayable getcurrent() Le tableau ci-dessous regroupe l ensemble des méthodes de la classe Display. Méthode Displayable getcurrent() void setcurrent(displayable nextdisplayable) void setcurrent(alert alert, Displayable nextdisplayable) boolean iscolor() int numcolors() static Display getdisplay(midlet m) void CallSerially(Runnable r) Description Retourne une référence à l objet Displayable courant Spécifie un nouvel objet Displayable, en précisant éventuellement une alerte qui sera affichée avant que l objet nextdisplayable soit affiché. Indique si le terminal supporte les couleurs. Retourne le nombre de couleurs supportées. Retourne l objet Display, unique pour ce MIDlet. Appelle l objet spécifié dès la fin du cycle repaint (lors de l utilisation de l interface utilisateur bas niveau). [DEL02][API] La classe Displayable La classe abstraite Displayable modélise un objet qui peut être affiché à l écran. Cette classe est la super classe commune des classes abstraites Screen (API haut niveau) et Canvas (API bas niveau). Le tableau ci-dessous liste les méthodes de la classe Displayable. Méthodes void addcommand(command cmd) void removecommand(command cmd) boolean isshown() void setcommandlistener(commandlistener l) Ticker getticker() void setticker(ticker ticker) Description Ajoute et retire une commande. Indique si l objet Displayable est visible ou non. Met en place un listener. Permet d associer un ticker à l objet affichable. [DEL02][API] La classe Screen La classe abstraite Screen dérive de la classe Displayable. Elle correspond à la brique principale de l API d interface utilisateur de haut niveau. Le contenu de l affichage et l interaction avec l utilisateur sont définis par les sous-classes de Screen. Le contenu affiché est rafraîchi automatiquement (nul besoin d appeler une méthode spécifique). Il est d ailleurs recommandé qu une application ne change le contenu affiché que lorsque celui-ci n est pas visible (pendant qu un autre objet Displayable est en cours d affichage par exemple). Changer le
33 contenu d un objet Screen lorsqu il est visible peut poser des problèmes de performances sur certains terminaux. La classe Screen hérite naturellement de toutes les méthodes de sa super classe Displayable. [DEL02][API] La classe Canvas La classe abstraite Canvas est la sous-classe de Displayable qui correspond à la brique principale de l API d interface utilisateur bas niveau. Lorsqu on étend la classe Canvas, il faut impérativement implémenter la méthode abstraite paint(). Par défaut, les implémentations des méthodes de gestion des évènements sont vides. On ne surchargera donc que les méthodes utilisées. De manière générale, on utilise la classe Canvas pour accéder aux évènements de bas niveau et les gérer. Il est également possible de gérer les évènements de haut niveau en ajoutant des commandes au Canvas grâce aux méthodes addcommand(command cmd) et setcommandlistener(commandlistener l) héritées de la super-classe Displayable. Les tableaux ci-dessous dressent la liste des méthodes et des champs de la classe Canvas. Méthodes protected Canvas() String getkeyname(int keycode) int getgameaction(int keycode) int getkeycode(int gameaction) protected void keypressed(int keycode) protected void keyreleased(int keycode) protected void keyrepeated(int keycode) boolean hasrepeatevents() boolean haspointerevents() boolean haspointermotionevents() protected void pointerdragged(int x, int y) protected void pointerpressed(int x, int y) protected void pointerreleased(int x, int y) int getheigth() int getwidth() boolean isdoublebuffered() void repaint() void repaint(int x, int y, int width, int heigth) Description Constructeur de la classe Canvas Détecte la touche pressée. La première retourne le nom de la touche, la deuxième l action de jeu associée à la touche actionnée et la troisième l opération inverse, à savoir le code de la touche associée à l action de jeu spécifiée. Gère les touches pressées, relâchées et actionnées de manière répétitive. Indique si l événement keyrepeated est supporté. Indique si un système de pointage est disponible sur le terminal. Indique si le terminal supporte les évènements de déplacement du pointeur. Gère les événements de déplacement, de pression et de relâchement du pointeur. Retourne la dimension de la zone Displayable. Indique si les graphiques sont gérés avec un doubletampon. Retrace le contenu du Canvas dans sa totalité ou partiellement. Evidemment, la classe Canvas hérite de toutes les méthodes de sa super-classe Displayable. Champ DOWN FIRE GAME_A Description Touche pour descendre Touche pour faire feu Touche A
34 GAME_B Touche B GAME_C Touche C GAME_D Touche D KEY_NUM0 Touche numérique 0 KEY_NUM1 Touche numérique 1 KEY_NUM2 Touche numérique 2 KEY_NUM3 Touche numérique 3 KEY_NUM4 Touche numérique 4 KEY_NUM5 Touche numérique 5 KEY_NUM6 Touche numérique 6 KEY_NUM7 Touche numérique 7 KEY_NUM8 Touche numérique 8 KEY_NUM9 Touche numérique 9 KEY_POUND Touche dièse (#) KEY_STAR Touche étoile (*) LEFT Touche pour aller à gauche RIGHT Touche pour aller à droite UP Touche pour aller en haut [DEL02][API] Ce dossier n abordera pas plus en détail l API d interface utilisateur de bas niveau. La section suivante traite de l interface utilisateur de haut niveau de manière détaillée. Notons que seules les classes et méthodes du profil MIDP 1.0 sont décrites dans la section suivante. Des classes et méthodes supplémentaires ont été ajoutées dans la version 2.0 de MIDP (cf documentation fournie avec l outil J2ME Wireless Toolkit 2.1) L interface utilisateur de haut niveau L API de haut niveau permet d utiliser des composants d interface utilisateur, mais aucun accès direct à l écran ni aux événements de saisies n est possible. C est l implémentation MIDP qui décide de la manière de représenter les composants et du mécanisme de gestion des saisies de l utilisateur. Notons qu il est possible d utiliser l API de haut niveau et l API de bas niveau dans un même MIDlet mais pas simultanément. Par exemple, les jeux qui utilisent l API de bas niveau pour contrôler l écran peuvent également utiliser l API de haut niveau pour l affichage des meilleurs scores. Les composants proposés par l API de haut niveau MIDP sont regroupés au sein du package javax.microedition.lcdui. Les deux tableaux ci-dessous recensent les classes et interfaces de l API d interface utilisateur de haut niveau contenues dans le package javax.microedition.lcdui. Interface Choice CommandListener ItemStateListener Classe Alert AlertType Description Définit la sélection d un élément d un groupe de choix prédéfini. Permet de gérer les évènements de haut niveau. Permet de gérer les évènements de changement interne aux éléments interactifs (dans un composant Form) Description Permet l affichage d un message d alerte. Fournit une indication sur la nature de l alerte
35 ChoiceGroup Command DateField Form Gauge Image ImageItem Item List StringItem TextBox TextField Ticker Implémente un groupe d éléments Choice. Utilisé dans un Form. Implémente une commande. Ne contient pas les actions déclenchées par l activation de la commande. Implémente un champ de date et heure. Utilisé dans un Form. Implémente un formulaire. C est un conteneur pour un ensemble d éléments disparates (image, texte ) Implémente une jauge graphique. Implémente une image graphique. Permet de spécifier la disposition d une Image dans un formulaire ou dans une alerte. Super-classe de tous les composants pouvant être ajoutés à un Form ou à une Alert. Implémente une liste de choix (menu). Implémente un élément associable à un composant Form et contenant une chaîne de caractères non modifiable. Implémente une zone de saisie. Implémente une zone de saisie associable à un composant Form. Implémente un composant permettant de faire défiler du texte en continu sur l écran. [DEL02][API] Vous trouverez dans l annexe n 1 un exemple récapitulatif complet dans lequel la plupart de ces classes sont utilisées L interface Choice L interface Choice définit les caractéristiques d une liste de choix. Les classes ChoiceGroup et List implémentent cette interface. Les méthodes et les champs définis dans l interface Choice sont recensés dans les tableaux ci-dessous [DEL02][API]. Méthode int append(string stringpart, Image imagepart) void insert(int elementnum, String stringpart, Image imagepart) void delete(int elementnum) int getselectedflags(boolean[] selectedarray_return) void setselectedflags(boolean[] selectedarray) int size() String getstring(int elementnum) Image getimage(int elementnum) void set(int elementnum, String stringpart, Image imagepart) void setselectedindex(int elementnum, boolean selected) int getselectedindex() boolean isselected(int elementnum) Champ EXCLUSIVE IMPLICIT MULTIPLE Description Ajoute un élément et son image associée en fin de liste. Insère un élément et son image associée juste avant l élément spécifié. Supprime l élément spécifié de la liste. Lit et modifie le status de selection des elements de la liste. Retourne le nombre d éléments de la liste. Lit le texte et l image associée de chaque élément de la liste. Modifie un élément de la liste. Sélectionne ou désélectionne un élément de la liste. Retourne le numéro de l élément sélectionné. Indique si l élément est sélectionné ou on. Description L utilisateur ne peut sélectionner qu un seul élément à la fois. L élément qui possède le focus est sélectionné quand une commande est activée. L utilisateur peut sélectionner plusieurs éléments
36 La classe List La classe List implémente l interface Choice et étend la classe abstraite Screen. Elle permet de créer et de manipuler une liste de choix. On utilisera volontiers cette classe pour implémenter un menu. La classe List implémente l ensemble des méthodes de l interface Choice (cf tableaux de la sectiion ) et propose en outre les deux constructeurs et le champ décrits dans les tableaux cidessous [DEL02][API]. Méthode List(String title, int listtype) List(String title, int listtype, String[] stringelements, Image[] imageelements) Champ SELECT_COMMAND Description Constructeurs de la classe List. Le premier crée une liste en spécifiant son titre et son type. Le second crée une liste en spécifiant en plus les éléments textuels et graphique la constituant. Description C est une commande spéciale que commandaction peut utiliser pour savoir que l utilisateur a sélectionné un élément dans une liste IMPLICIT. Les champs EXCLUSIVE, IMPLICIT et MULTIPLE sont hérités de l interface javax.microedition.lcdui.choice. Ces champs spécifie le type de liste. Si le type de liste est EXCLUSIVE, l utilisateur ne peut sélectionner qu un seul élément à la fois. Si le type de liste est IMPLICIT, l élément qui possède le focus est sélectionné lorsqu une commande est activée. Si le type de liste est MULTIPLE, l utilisateur peut sélectionner plusieurs éléments à la fois. Ci-dessous vous trouverez une illustration du composant List implémentant le menu principal du MIDlet testgui (cf annexe n 1)
37 La classe Item La classe abstraite Item est la super classe de tous les composants pouvant être associés à un formulaire (cf ). Elle comprend les méthodes présentées dans le tableau ci-dessous [DEL02][API]. Méthode String getlabel() void setlabel(string label) Description Permet de lire et de modifier l étiquette associée à l élément La classe Form La classe Form dérive de la classe abstraite Screen. Elle permet d utiliser un formulaire auxquel peut être associé un ensemble d éléments disparates (image, texte, champ de texte, liste de choix ) dérivant tous de la classe abstraite Item (cf ). Les méthodes de cette classe sont présentées dans le tableau cidessous [DEL02][API]. Méthode Form(String title) Form(String title, Item[] items) int append(item item) int append(image img) int append(string str) void insert(int itemnum, Item item) void delete(int itemnum) Item get(int itemnum) void set(int itemnum, Item item) int size() void setitemstatelistener(itemstatelistener ilistener) Description Constructeurs permettant de créer un formulaire en spécifiant son titre uniquement ou en spécifiant son titre et ses éléments associés. Permet d ajouter un élément de type Item, une image ou du texte. Permet d insérer un élément de type Item dans le formulaire à la place spécifiée. Permet de supprimer du formulaire l élément spécifié. Permet de lire et de modifier les éléments du formulaire. Retourne le nombre d éléments contenus dans le formulaire. Permet de mettre en place un listener pour le formulaire. La classe Form hérite évidemment de toutes les méthodes implémentées dans la classe abstraite Screen. Ci-dessous vous trouverez une illustration du composant Form mis en œuvre dans l application testgui (cf annexe n 1)
38 La classe ChoiceGroup La classe ChoiceGroup implémente l interface Choice et hérite de la classe abstraite Item (cf ). Le composant ChoiceGroup doit être associé à un formulaire (cf ). Cette classe permet d utiliser une liste de choix au sein d un formulaire. Elle implémente l ensemble des méthodes de l interface Choice (cf ) et propose en outre les deux constructeurs présentés dans le tableau ci-dessous [DEL02][API]. Méthode ChoiceGroup(String label, int choicetype) ChoiceGroup(String label, int choicetype, String[] stringelements, Image[] imageelements) Description Permet de créer une liste de choix en précisant l intitulé et le type (EXCLUSIVE, IMPLICIT, MULTIPLE). Permet de créer une liste de choix en fournissant les éléments de cette liste en paramètre sous forme de tableaux. La classe ChoiceGroup hérite naturellement des méthodes de la classe Item. Ci-dessous vous trouverez une illustration du composant ChoiceGroup mis en œuvre dans l application testgui (cf annexe n 1) La classe TextField La classe TextField dérive de la classe Item (cf ). Cela signifie donc que ce composant doit être associé à un formulaire (cf ). Cette classe permet d utiliser un champ de texte au sein d un formulaire. Les méthodes de la classe TextField sont répertoriées dans le tableau ci-dessous. Méthode TextField(String label, String text, int maxsize, int constraints) String getstring() void setstring(string text) int size() int getconstraints() void setconstraints(int constraints) int getmaxsize() int setmaxsize(int maxsize) Description Constructeur permettant de créer un champ de texte en spécifiant l intitulé, le contenu, la taille maximale et les contraintes de saisie. Permet de lire et de modifier le contenu du champ de texte. Retourne le nombre de caractères contenus dans le champ de texte. Permet de lire et de modifier les contraintes de saisie. Permet de lire et de modifier le nombre de caractères maximal pouvant être contenus dans le champ
39 int getcaretposition() void insert(char[] data, int offset, int length, int position) void insert(string src, int position) void setchars(char[] data, int offset, int length) void delete(int offset, int length) int getchars(char[] data) Retourne la position du curseur dans le champ de texte. Permet d insèrer un tableau de caractères ou une chaîne de caractère dans le champ de texte à la position spécifiée. Permet de remplacer une partie du contenu du champ de texte par le tableau de caractères spécifié. Permet de supprimer une partie du contenu du champ de texte. Permet de copier le contenu du champ de texte dans un tableau de caractères. Les méthodes héritées de la classe Item sont également disponibles. La classe TextField comprend un certain nombre de constantes permettant de spécifier des contraintes de saisie. Le tableau ci-dessous contient une description pour chacune de ces constantes. Champ ANY CONSTRAINT_MASK ADDR NUMERIC PASSWORD PHONENUMBER URL Description L utilisateur peut saisir n importe quel texte. Masque de saisie. L utilisateur doit saisir une adresse . L utilisateur doit saisir un nombre entier. Les caractères saisis ne sont pas visibles à l écran (pour la saisie d un mot de passe). L utilisateur doit saisir un numéro de téléphone. L utilisateur doit saisir une URL. [DEL02][API] Ci-dessous vous trouverez une illustration du composant TextField mis en œuvre dans l application testgui (cf annexe n 1) La classe DateField La classe DateField dérive de la classe Item (cf ). Cette classe permet d utiliser un champ de date et d heure au sein d un formulaire (cf ). Le tableau suivant contient une description pour chacune des méthodes de la classe DateField [DEL02][API]
40 Méthode DateField(String label, int mode, TimeZone timezone) DateField(String label, int mode) Date getdate() Void setdate(date date) int getinputmode() void setinputmode(int mode) Description Constructeurs permettant de créer un champ de date en spécifiant la localisation ou pas. Permet de lire et de modifier la valeur du champ de date. Permet de lire et de modifier le mode du champ de date. Les méthodes héritées de la classe Item sont également disponibles. La classe DateField comprend trois constantes permettant de spécifier le mode du champ. Le mode indique la nature de l information que l utilisateur peut saisir. Le tableau ci-dessous contient une description pour chacun de ces modes [DEL02][API]. Champ DATE TIME DATE_TIME Description L utilisateur ne peut saisir qu une date. L utilisateur ne peut saisir qu une heure. L utilisateur peut saisir la date et l heure. Ci-dessous vous trouverez une illustration du composant DateField mis en œuvre dans l application testgui (cf annexe n 1) La classe Gauge La classe Gauge dérive également de la classe Item. Elle permet d utiliser une jauge graphique au sein d un formulaire. Ces méthodes sont recensées dans le tableau ci-dessous [DEL02][API]. Méthode Gauge(String label, boolean interactive, int maxvalue, int initialvalue) int getmaxvalue() void setmaxvalue(int maxvalue) int getvalue() void setvalue(int value) boolean isinteractive() Description Constructeur permettant de créer une jauge en spécifiant l étiquette, le mode, la valeur maximale et la valeur initiale. Permet de lire et de modifier la valeur maximale. Permet de lire et de modifier la valeur courante de la jauge. Permet de savoir si la jauge est interactive ou non
41 Une jauge peut être interactive ou non. Dans le cas d une jauge non interactive, seule l application peut modifier sa valeur. Dans le cas d une jauge interactive, l utilisateur peut modifier sa valeur. Ci-dessous vous trouverez une illustration du composant Gauge mis en œuvre dans l application testgui (cf annexe n 1) La classe ImageItem ImageItem est une classe qui encapsule une instance de la classe Image (cf documentation fournie avec le J2ME Wireless Toolkit). Comme les autres composants associables à un formulaire, elle étend la classe abstraite Item. Grâce à cette classe, il est possible de spécifier la disposition d une image associée à un formulaire. Pour cela, elle fournit les méthodes et champs décrits dans les tableaux ci-dessous [DEL02][API]. Méthode ImageItem(String label, Image img, int layout, String alttext) String getalttext() void setalttext(string text) Image getimage() void setimage() int getlayout() void setlayout(int layout) Description Constructeur prenant en paramètres l étiquette, l image, la disposition et le texte de remplacement. Permet de lire et de modifier le texte de remplacement. Permet de lire et de modifier l objet Image encapsulé. Permet de lire et de modifier la disposition de l image dans le formulaire. La classe ImageItem comprend un certain nombre de champs correspondant à des constantes qui spécifient la disposition du composant au sein d un formulaire. Le tableau ci-dessous présente ces champs. Méthode LAYOUT_CENTER LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_RIGHT LAYOUT_NEWLINE_AFTER LAYOUT_NEWLINE_BEFORE Description L image est centrée horizontalement. L image est placée selon le positionnement par défaut. L image est cadrée à gauche. L image est cadrée à droite. Une nouvelle ligne commence après l image. Une nouvelle ligne commence avant l image
42 La classe StringItem La classe StringItem encapsule une instance de la classe String. Elle dérive de la classe Item et permet d associer du texte statique à un formulaire. Ces méthodes sont décrites dans le tableau ci-dessous [DEL02][API]. Méthode StringItem(String label, String text) String gettext() void settext(string text) Description Constructeur prenant l étiquette et le contenu textuel en paramètres. Permet de lire et de modifier le contenu textuel La classe TextBox La classe TextBox étend la classe abstraite Screen. Elle modélise un champ de saisie qui peut être affiché sans être contenu dans un formulaire. Son interface est très similaire à celle de la classe TextField (cf ). Ci-dessous vous trouverez une illustration du composant TextBox mis en œuvre dans l application testgui (cf annexe n 1) La classe Alert La classe Alert étend la classe abstraite Screen. Elle modélise une boîte de dialogue affichant un message textuel, éventuellement accompagné d une image ou d un son. On l utilisera volontiers pour afficher un avertissement, une erreur, une alarme L interface de cette classe est décrite dans le tableau ci-dessous. Méthode Alert(String title) Alert(String title, String alerttext, Image alertimage, AlertType alerttype) String getstring() void setstring(string str) AlertType gettype() void settype(alerttype type) int getdefaulttimeout() Description Constructeur permettant de créer une alerte en spécifiant son titre uniquement ou en spécifiant en plus son contenu textuel, son image associée et son type. Permet de lire et de modifier le contenu textuel de l alerte. Permet de lire et de modifier le type de l alerte. Retourne la durée pendant laquelle l alerte est affichée
43 int gettimeout() void settimeout(int time) Image getimage() void setimage(image img) Permet de lire et de modifier la durée pendant laquelle l alerte est affichée (en millisecondes). Permet de lire et de modifier l image associée à l alerte. La constante FOREVER définie dans la classe Alert permet de spécifier que l alerte doit rester affichée tant que l utilisateur n a pas confirmé. L instruction se présentera de la manière suivante : myalert.settimeout(alert.forever) ; La classe AlertType permet de donner une indication sur la nature de l alerte. Elle comprend les constantes présentées dans le tableau ci-dessous. Méthode ALARM CONFIRMATION ERROR INFO WARNING Description Permet de spécifier une alerte de type alarme. Permet de spécifier une alerte de type confirmation. Permet de spécifier une alerte de type erreur. Permet de spécifier une alerte de type information. Permet de spécifier une alerte de type avertissement. L instruction ci-dessous permet de créer une alerte de type information (aucune image n est associée à cette alerte). myalert = new Alert( Alerte INFO, ***information***, null, AlertType.INFO); A chaque type d alerte est associé un son. La classe AlertType propose une méthode permettant d utiliser ce son. L instruction ci-dessous émet le son associé au type d alerte INFO. AlertType.INFO.playSound(myDisplay) ; [DEL02][API] Ci-dessous vous trouverez une illustration du composant Alert mis en œuvre dans l application testgui (cf annexe n 1)
44 La classe Ticker La classe Ticker modélise un texte défilant continuellement sur l affichage. Le composant Ticker peut être associé à toutes les classes héritant de la classe Displayable. Ces méthodes sont recensées dans le tableau ci-dessous [DEL02][API]. Méthode Ticker(String str) String getstring() void setstring(string str) Description Constructeur permettant de spécifier le contenu textuel du ticker. Permet de lire et de modifier le contenu textuel du ticker La gestion des évènements La gestion des évènements au sein de l interface utilisateur de haut niveau proposée par MIDP repose sur le principe de Source Listener. L API d interface utilisateur de haut niveau comprend les classes et interfaces suivantes pour la gestion des évènements : Command CommandListener ItemStateListener La classe Command La classe Command intègre des informations sémantiques sur une action. Cette classe permet de gérer la navigation parmi les écrans. Elle ne contient que le libellé de l action, et non l action elle-même. Cette action, déclenchée lors de l activation de la commande se trouve dans l objet implémentant l interface CommandListener (cf ) associé à l écran. Une commande peut être associée à n importe quel composant dérivant de la classe Displayable (cf ). Le tableau ci-dessous répertorie les méthodes de la classe Command. Méthode Command(String label, int commandtype, int priority) int getcommandtype() String getlabel() int getpriority() Description Constructeur permettant de spécifier le libellé, le type et le niveau de priorité de la commande. Permet de lire le type de la commande. Permet de lire le libellé de la commande. Permet de lire le niveau de priorité. Une commande est caractérisée par un type. Le type permet de spécifier à quelle touche du terminal la commande va être associée. Par exemple, si sur un terminal, une commande d annulation est habituellement associée à une touche spécifique, lorsqu on utilise le type CANCEL pour une commande, celle-ci sera associée à cette même touche spécifique du terminal. Chacun des champs présentés dans le tableau ci-dessous correspond à un type
45 Champ BACK CANCEL EXIT HELP ITEM OK SCREEN STOP Description Type de commande retour. Type de commande annulation. Type de commande quitter. Type de commande aide. Type de commande item. Type de commande confirmation. Type de commande écran. Type de commande arrêter. Une commande est également caractérisée par un niveau de priorité. Cette caractéristique permet de définir un niveau de priorité pour l affichage des commandes sur l écran du terminal. La priorité est définie par l intermédiaire d un entier, la plus haute priorité étant spécifiée par l entier le plus petit. Le terminal organise la disposition des commandes d abord en fonction du type de commande choisi, puis prend en compte les niveaux de priorité spécifiés. [DEL02][API] L interface commandlistener Cette interface définit le listener associé à un objet affichable (cf ). Tout listener associé à un objet dérivant de la classe Displayable doit implémenter la méthode commandaction(command c, Displayable d). C est dans l implémentation de cette méthode que l on spécifiera l action à entreprendre en fonction de la commande actionnée. L échantillon de code ci-dessous tiré du MIDlet testgui donne un exemple d implémentation de cette méthode (cf annexe n 1). public void commandaction (Command cmdselected, Displayable d) { if (cmdselected == cmdsortie) { destroyapp (false); else if (cmdselected == cmdretour) { mainmenu(); else { List l = (List) display.getcurrent(); switch (l.getselectedindex()) { case 0: testtextbox(); break; case 1: testalert(); break; case 2: testform(); break;
46 Les méthodes héritées de la classe Displayable par tous les composants affichables permettent d ajouter des commandes et de mettre en place le listener (cf ). [DEL02][API] L interface ItemStateListener Cette interface définit le listener associé à un formulaire et à ces éléments (cf ). Ce listener permettra de gérer les évènements intervenant sur les composants dérivant de la classe Item (cf ). Tout listener de ce type doit obligatoirement implémenter la méthode itemstatechanged(item item). Cette méthode est appelée lorsque l état interne d un composant Item a été modifié par l utilisateur. Voici les différents cas possibles : L utilisateur modifie la valeur d un composant Gauge (en mode interactif). L utilisateur modifie le contenu textuel d un composant TextField. L utilisateur change de sélection dans un composant ChoiceGroup. L utilisateur modifie la date ou l heure dans un composant DateField. La méthode itemstatechanged(item item) n est appelée que lorsque l utilisateur effectue une modification interactive de l état interne d un composant Item. Dans le cas où on modifie le contenu textuel d un composant TextField (cf ) via la méthode setstring(string text), la méthode itemstatechanged(item item) du listener n est donc pas appelée. Pour mettre en place un listener sur un formulaire, on utilisera la méthode setitemstatelistener(itemstatelistener ilistener) de la classe Form (cf ). [DEL02][API]
47 3.3. Le stockage persistant des données Le stockage persistant des données consiste à stocker l état des objets d une application dans un emplacement non volatile de telle manière à ce que ces données soient conservées au delà de l exécution de l application. La section suivante traite du mécanisme de stockage persistant des données fourni par le profil MIDP : le RMS (Record Management System) Le package RMS Le package javax.microedition.rms contient les classes et interfaces permettant de gérer le stockage persistant des données. Les tableaux ci-dessous décrivent brièvement chacune de ces classes et interfaces. Classe RecordStore InvalidRecorIDException RecordStoreException RecordStoreFullException RecordStoreNotFoundException RecordStoreNotOpenException Interface RecordComparator RecordEnumeration RecordFilter RecordListener Description Implémente un RecordStore Exception déclenchée lorsque le recordid est invalide. Exception déclenchée lorsqu une exception générale est survenue lors d une opération sur un RecordStore. Exception déclenchée lorsque le système de fichier du RecordStore est plein. Exception déclenchée lorsque le RecordStore spécifié est introuvable. Exception déclenchée lorsqu une opération est tentée sur un RecordStore fermé. Description Définit un comparateur d enregistrements. Définit une énumération d enregistrements. Définit un filtre d enregistrements. Définit un listener associé à un RecordStore. [DEL02][API] Le Record Store Un Record Store comprend un ensemble d enregistrements. Il peut être comparé à une table d une base de donnée relationnelle. Chaque enregistrement d un Record Store est désigné par un identifiant. On parle alors d ID d enregistrement (recordid). Cet ID d enregistrement, un nombre entier, correspond à la clé primaire des enregistrements. Cette valeur vaut 1 pour le premier enregistrement du Record Store et sera incrémentée de 1 à chaque nouvel enregistrement. Le nom d un Record Store est sensible à la casse et est limité à 32 caractères. Un MIDlet ne peut pas créer deux Record Store de même nom dans une même application. Deux Record Store peuvent en revanche avoir le même nom si ils sont utilisés dans des applications distinctes. Afin d éviter toute corruption des données due à des accès concurrents, les opérations de lecture ou d écriture verrouillent le Record Store jusqu à ce qu elles soient terminées. Cependant, dans le cas où plusieurs threads accèdent à un Record Store, il est à la charge du développeur de synchroniser ces accès. En
48 effet, si deux threads différents veulent modifier un enregistrement du Record Store au même moment, les opérations sont sérialisées correctement par le RMS, mais au final, l une des écritures écrasera l autre ce qui risque de causer des problèmes au sein du MIDlet. L espace disponible pour le stockage persistant diffère d un terminal à l autre. Pour les téléphones mobiles compatibles MIDP existants sur le marché à l heure actuelle, l espace de stockage disponible pour l ensemble des applications installées ne dépasse que rarement les 500 Ko. Pour le Sony Ericsson t610, par exemple, chaque application dispose d un espace de stockage d environ 30 Ko et le total de mémoire de stockage disponible pour les Record Store de toutes les applications installées est d environ 500 Ko (cf 4.2.1) La classe RecordStore Cette classe modélise un Record Store. Ces méthodes permettent d effectuer les opérations de base comme l ouverture, la fermeture, la création, la modification ou la suppression du Record Store. Le tableau ci-dessous décrit l ensemble de ces méthodes. Méthode static RecordStore openrecordstore(string recordstorename, boolean createifnecessary) void closerecordstore() static void deleterecordstore(string recordstorename String getname() static String[] listrecordstores() RecordEnumeration enumaraterecords(recordfilter filter, RecordComparator comparator, boolean keepupdated) int addrecord(byte[] data, int offset, int numbytes) void setrecord(int recordid, byte[] newdata, int offset, int numbytes) byte[] getrecord(int recordid) int getrecord(int recordid, byte[] buffer, int offset) void deleterecord(int recordid) int getnextrecordid() int getnumrecords() void setrecordlistener(recordlistener listener) void removerecordlistener(recordlistener listener) int getrecordsize(int recordid) int getsize() int getsizeavailable() long getlastmodified() int getversion() Description Méthode statique permettant d ouvrir un Record Store (si le paramètre createifnecessary est vrai, le Record Store est créé s il n existe pas déjà). Permet de fermer un Record Store. Permet de supprimer un Record Store. Retourne le nom du Record Store. Retourne la liste des Record Store du MIDlet. Retourne une énumération des enregistrements selon le filtre et l ordre de tri spécifié. Permet d ajouter un enregistrement dans un Record Store à partir d un tableau d octets. Une fois l enregistrement ajouté, son ID est retourné. Permet de modifier l enregistrement spécifié par le paramètre recordid. Retourne, sous forme de tableau d octets, une copie de l enregistrement spécifié par le paramètre recordid. Permet d obtenir les données contenues dans l enregistrement spécifié (la méthode retourne le nombre d octets copiés dans buffer). Permet de supprimer l enregistrement spécifié. Retourne l identifiant du prochain enregistrement qui sera ajouté au Record Store. Retourne le nombre d enregistrements contenus dans le Record Store. Permet de mettre en place et de supprimer le listener associé au Record Store. Retourne la taille en octets de l enregistrement. Retourne la taille totale en octets du Record Store. Retourne l espace de stockage courant disponible pour le Record Store (en octets). Retourne l heure de la dernière modification du Record Store selon le format spécifié par System.currentTimeMillis(). Retourne le numéro de version du Record Store (à chaque fois qu un Record Store est modifié son numéro de version est automatiquement incrémenté)
49 Pour créer des Record Store multi-colonnes, le développeur devra inclure des séparateurs au sein de l enregistrement et implémenter le parser adéquat pour récupérer les différentes informations correctement. En utilisant plusieurs Record Store le développeur pourra implémenter un semblant de base de données relationnelle. [DEL02][API] L interface RecordComparator Cette interface définit un comparateur d enregistrements. On implémentera volontiers l interface RecordComparator pour effectuer un tri sur les enregistrements d un Record Store. La méthode suivante devra être implémentée : int compare(byte[] rec1, byte[] rec2) Outre cette méthode, l interface définit également les trois constantes décrites dans le tableau ci-dessous. Champ FOLLOWS PRECEDES EQUIVALENT Description Constante retournée par la méthode de comparaison lorsque le résultat de la comparaison est : rec1 > rec2 (la valeur de la constante est 1). Constante retournée par la méthode de comparaison lorsque le résultat de la comparaison est : rec1 < rec2 (la valeur de la constante est 1). Constante retournée par la méthode de comparaison lorsque le résultat de la comparaison est : rec1 = rec2 (la valeur de la constante est 0). [DEL02][API] L interface RecordFilter Cette interface définit un outil de filtrage des enregistrements. On implémentera cette interface pour filtrer les enregistrements en fonction du critère choisi. La méthode suivante devra être implémentée : boolean matches(byte[] candidate) [DEL02][API] L interface RecordEnumeration Cette interface définit une énumération d enregistrements bidirectionnelle. On l utilisera volontiers pour extraire les enregistrements d un Record Store selon un
50 ordre différent que leur ordre d insertion. Ses méthodes sont décrites dans le tableau ci-dessous. Méthode int previousrecordid() int nextrecordid() boolean haspreviouselement() boolean hasnextelement() byte[] previousrecord() byte[] nextrecord() int numrecords() void keepupdated(boolean keepupdated) boolean iskeptupdated() void rebuild() void destroy() void reset() Description Permet de retourner l ID de l enregistrement précédent et de l enregistrement suivant. Permet de savoir si il existe un enregistrement précédent et un enregistrement suivant. Retourne l enregistrement précédent et l enregistrement suivant. Retourne le nombre d enregistrements. Permet d indiquer si l énumération des enregistrements doit être actualisée pour refléter les modifications sur les enregistrements. Retourne vrai si l énumération est actualisée automatiquement lors de modifications sur les enregistrements. Permet d actualiser manuellement l énumération. Permet de libérer les ressources utilisées par l énumération d enregistrements. Permet de mettre l énumération dans l état où elle était au moment de sa création. [DEL02][API] L interface RecordListener L interface RecordListener définit le listener associé à un composant RecordStore. Ce listener permet la supervision des modifications des enregistrements qui consiste à être averti lorsqu un ajout, une modification ou une suppression sont effectués sur un enregistrement. L interface RecordListener définit les trois méthodes décrites dans le tableau ci-dessous correpondant chacune à un événement. Méthode void recordadded(recordstore recordstore, int recordid) void recordchanged(recordstore recordstore, int recordid) void recorddeleted(recordstore recordstore, int recordid) Description Méthode exécutée lorsqu un enregistrement est ajouté au Record Store. Méthode exécutée lorsqu un enregistrement du Record Store est modifié. Méthode exécutée lorsqu un enregistrement du Record Store est supprimé. [DEL02][API] Vous trouverez dans l annexe n 2 un exemple de mise en œuvre des composants de RMS
51 Cette quatrième partie débute par une brève présentation des différents outils que j ai utilisés lors de mes tests. L étude d un MIDlet permettant de convertir des devises en utilisant un Web Service sera ensuite abordée. 4. J2ME en pratique 4.1. Les outils Comme nous l avions exposé dans la troisième partie de ce dossier, le cycle de développement d un MIDlet est constitué de cinq étapes chacune nécessitant l utilisation d outil(s). Le tableau ci-dessous indique quels outils j ai choisis pour réaliser chacune de ces étapes dans mes développements : Etape Ecriture de l application avec les API de MIDP. Compilation et prévérification de l application. Test de l application avec un émulateur Packaging de l application. Test de l application packagée sur le terminal mobile. Outil(s) L environnement de développement J2ME Wireless Toolkit 2.1 et l éditeur de texte Edit+ L environnement de développement J2ME Wireless Toolkit 2.1 L environnement de développement J2ME Wireless Toolkit 2.1 L environnement de développement J2ME Wireless Toolkit 2.1 Clé USB Bluetooth MITSUMI BLUETOOTH USB ADAPTATOR et téléphone mobile Sony Erisson t L environnement de développement Mon choix s est arrêté sur le J2ME Wireless Toolkit pour des raisons pratiques avant tout. En effet, l environnement de Sun Microsystem est téléchargeable gratuitement et s avère simple et efficace. Beaucoup d autres environnements de développement J2ME existent sur le marché, souvent proposés sous forme de plug-in. Vous trouverez quelques références dans le tableau ci-dessous. Environnement MobileSet Plug-In Visual Age Micro Edition Visual Age Micro Edition EclipseMe Plug-In Description Plug-In pour Borland JBuilder Plug-In pour IBM WebSphere Studio Plug-In pour l IDE d Oracle, JDevelopper Plug-In pour l environnement open source Eclipse Pour plus de détails sur ces environnements consultez l adresse suivante :
52 J2ME Wireless Toolkit 2.1 L installation du J2ME Wireless Toolkit est une formalité (les fichiers d installation sont disponibles sur le cd rom fourni en annexe). Une fois l environnement installé, le menu de la figure ci-dessous est disponible. La première rubrique vous permet de sélectionner un émulateur par défaut. La seconde rubrique vous donne accès à la documentation de l environnement ainsi qu à celle des API (Application Program Interface). La rubrique suivante permet de lancer la console pour créer et gérer des projets. La quatrième rubrique lance un outil d assistance au transfert de fichier sur le terminal cible via une connexion OTA (Over The Air). La rubrique suivante vous permet de configurer les émulateurs. La sixième rubrique permet d exécuter une application J2ME dans l émulateur (les fichiers exécutables par l émulateur sont les fichiers *.jad). La dernière rubrique quant à elle donne accès à un utilitaire de configuration. La console du J2ME Wireless Toolkit (Ktoolbar) est illustrée ci-dessous
53 La console est le cœur de l environnement de développement. Elle est utilisée pour créer, gérer, compiler et packager les projets. En sélectionnant la rubrique Settings de la console vous pourrez, entre autres, définir la configuration et le profil J2ME, comme l illustre l image ci-dessous. Lorsqu un projet est créé, un dossier portant le nom du projet est ajouté dans le répertoire apps situé à la racine du dossier d installation. Le dossier de projet contient les quatre répertoires décrits dans le tableau ci-dessous. Dossier %WTK21/apps/nom_projet/bin %WTK21/apps/nom_projet/classes %WTK21/apps/nom_projet/lib %WTK21/apps/nom_projet/res %WTK21/apps/nom_projet/src Description Contient le fichier *.jar, *.jad et le fichier manifest (cf 3.1.2) Contient les classes compilées Contient les bibliothèques utiles à l application Contient les ressources utiles à l application (des images au format *.png par exemple) Contient les sources des classes
54 Le J2ME Wireless Toolkit ne propose pas d éditeur de texte pour écrire le code source des applications. Le développeur utilisera son éditeur de texte préféré pour écrire les fichiers sources puis ajoutera ces derniers au répertoire src du projet. La rubrique Create Package du menu illustré ci-dessous permet de générer le fichier *.jar destiné au terminal mobile cible et le fichier *.jad destiné à l émulateur. Pour tester les applications fournies sur le cd rom annexé à ce dossier dans l émulateur du J2ME Wireless Toolkit, il suffit d effectuer les étapes suivantes : Installer le J2ME Wireless Toolkit 2.1 Coller les répertoires correspondant à chaque projet dans le dossier app situé à la racine du répertoire d installation Lancer la console KToolbar Ouvrir le projet de votre choix Sélectionner le bouton Run de la console KToolbar Pour obtenir des informations plus détaillées sur l utilisation du J2ME Wireless Toolkit 2.1, veuillez vous référer à la documentation fournie avec l outil
55 Le terminal mobile cible Toutes les applications fournies sur le cd rom en annexe ont été testées et s exécutent correctement sur le téléphone mobile Sony Ericsson t610. Dans le cas ou vous voudriez tester ces applications sur un autre terminal, veuillez consulter l adresse suivante qui vous donnera des informations quant à la compatibilité du terminal avec la technologie J2ME : Toutes les applications proposées sur le cd rom annexé sont destinées à des terminaux mobiles J2ME compatibles avec la configuration CLDC 1.0 et le profil MIDP 1.0. Le terminal cible sur lequel ces applications seront testées devra donc obligatoirement implémenter cette configuration et ce profil (ou les versions ultérieures, à savoir CLDC 1.1 et MIDP 2.0) Le terminal mobile Sony Ericsson t610 Réseaux 900/1800/1900 GPRS Résolution de l affichage 128 x 160 Nb couleurs Java Micronavigateur Messagerie Connectivité Mémoire CLDC 1.0/MIDP 1.0/MMAPI WAP 2.0 (WML, xhtml) SMS/EMS/MMS Bluetooth/Infrarouge/SyncML ~2 MB [SEW] Comme spécifié dans le tableau ci-dessus, le t610 implémente la configuration CLDC 1.0, le profil MIDP 1.0 et le package optionnel MMAPI. Le tableau suivant donne des informations détaillées concernant la mémoire disponible pour l exécution des applications J2ME. Mémoire de stockage RMS totale Mémoire de stockage RMS par application Taille du heap Java Taille du heap natif utilisé pour les composants GUI RAM vidéo native disponible pour Java 500 KB 30 KB 256 KB ~150 KB ~80 KB [SEJ]
56 Pour obtenir plus d informations concernant ce terminal mobile, vous êtes invités à consulter les documents suivants que vous trouverez sur le cd rom fourni en annexe : wp_t610_r2a.pdf dg_j2me_midp1_r3a.pdf Sony Ericsson propose un site offrant toutes les informations nécessaires au développement d applications J2ME pour les différents modèles de la marque (exemples d applications, forum ). L adresse suivante vous permettra d accéder à ces informations gratuitement : Notons également que Sony Ericsson distribue gratuitement sa propre version de l environnement J2ME Wireless Toolkit accompagnées d émulateurs configurés de telle manière à recréer l apparence et le comportement de ses différents modèles de téléphones. Les fichiers nécessaires à l installation de l environnement SonyEricsson J2ME SDK beta sont disponibles sur le cd rom annexé. Remarque : sur le terminal mobile t610 en particulier, pour qu un MIDlet utilisant un composant de connexion HttpConnection s exécute correctement, il est nécessaire de configurer un nouveau profil d accès Internet général. Si le profil WAP par défaut est utilisé, le MIDlet ne pourra pas ouvrir de connexion HTTP. Pour configurer un nouveau profil d accès Internet général, consultez la documentation du téléphone et renseignez vous auprès de votre opérateur téléphonique L outil de transfert de l application Une fois l application packagée grâce à l environnement de développement (cf 4.1.1), elle peut être installée sur le terminal cible. Le transfert de l application packagée depuis la station de développement vers le terminal cible peut être effectué de différentes manières. Soit le fichier *.jar est stocké sur un serveur et le terminal cible le télécharge via un navigateur WAP, soit le fichier est transféré grâce à une connexion directe entre la station de développement et le terminal cible. La première solution nécessite que le terminal soit muni d un navigateur WAP, ce qui est le cas de la plupart des téléphones mobiles compatibles CLDC 1.0 et MIDP 1.0. On utilisera donc volontiers cette solution pour distribuer des MIDlets à grande échelle. La seconde solution nécessite le concours d un service de transfert de fichiers via une connexion par câble ou une connexion OTA (Over The Air). Tous les MIDlet disponibles sur le cd rom annexé ont été transférés via Bluetooth pour être testés sur le terminal cible. Le service de transfert de fichier OBEX (Object Exchange) supporté par le terminal cible Sony Ericsson t610 (cf 4.2.1) et la clé USB (Universal Serial Bus) Bluetooth du fabricant MITSUMI installée sur la station de développement ont permis de mettre en œuvre la connexion OTA
57 4.2. L application CurrencyConverter Sur le cd rom fourni en annexe, vous trouverez l application CurrencyConverter. Pour pouvoir exécuter cette application dans l émulateur du J2ME Wireless Toolkit, référez vous au point de la présente étude. Ce prototype d application, destiné à la configuration CLDC 1.0 et au profil MIDP 1.0, permet de convertir des devises par l intermédiaire d un serveur PHP (Personal Home Page). Dans ce cas précis, l application J2ME s exécutant sur le terminal mobile s apparente à un client léger (cf Gartner Model). En effet, le MIDlet CurrencyConverter envoie une requête HTTP GET à un serveur PHP qui se chargera d effectuer un appel SOAP (Simple Objetc Access Protocol) RPC (Remote Procedure Call) sur un autre serveur pour obtenir un service. Une fois le service rendu, le serveur PHP effectue un calcul, puis renvoie le résultat à l application J2ME. Le schéma ci-dessous illustre cette architecture distribuée. SOAP RPC Serveur PHP Serveur de Web Services HTTP GET Client J2ME
58 L avantage de cette architecture est que le terminal mobile profite des ressources de deux parties tierces. En effet, aucun calcul n est effectué sur le terminal. Le désavantage principal réside dans le fait que le bon fonctionnement de l application dépend en grande partie des deux serveurs impliqués. Si un de ces serveurs tombe en panne, aucune conversion ne pourra être effectuée. Pour résoudre ce problème, on pourrait stocker un jeu limité d information sur le terminal client (cf 3.3) de telle sorte à pouvoir, si nécessaire, exécuter l application de manière totalement autonome. Une autre solution consisterait à éliminer une de ces tierces parties en utilisant le package ksoap, librairie permettant l invocation de Web Service au sein d une application J2ME. Pour obtenir plus d informations concernant ce package et son utilisation veuillez vous référer aux adresses suivantes : Il faut toutefois être conscient du fait que l utilisation d un tel package augmente considérablement la taille du fichier *.jar à destination du terminal mobile. Avec l architecture actuelle, l application CurrencyConverter, une fois packagée, occupe un espace mémoire d environ 5 ko. Si le package ksoap avait été utilisé, la taille de l application packagée aurait atteint environ 50 Ko Le client J2ME Le code source du client J2ME est disponible dans le répertoire du projet CurrencyConverter fourni sur le cd rom annexé. Ce prototype comporte deux classes, l une responsable de la gestion de l interface utilisateur (cf Converter.java) et l autre responsable de l interaction réseau avec le serveur PHP (cf NetworkInteraction.java). La classe responsable de l interaction réseau implémente l interface Runnable [API], ce qui permet de mettre en œuvre la connexion réseau dans un autre thread (processus) que celui où est géré l interface utilisateur. Si ces deux mécanismes étaient implantés dans le même thread, l exécution de l application pourrait aboutir à un dead-lock (verrou mortel). La classe responsable de la gestion de l interface graphique utilise plusieurs composants GUI haut niveau de MIDP pour permettre à l utilisateur de saisir les différentes informations de conversion
59 Ci-dessous vous trouverez quelques illustrations de l application CurrencyConverter exécutée sur l émulateur du J2ME Wireless Toolkit. Fig. 1 Le champ de texte et la liste de monnaies source Fig. 2 La liste des monnaies de destination Fig. 3 L écran de sécurité Fig. 4 Le message témoignant du succès de l interaction Fig. 5 Le résultat de la conversion Fig. 6 Le message d erreur témoignant d un refus d accès Lorsque l application démarre, l écran de saisie de la Fig. 1 s affiche. Cet écran permet à l utilisateur de saisir la valeur à convertir dans un champ de texte n acceptant que des nombres entiers (une contrainte de saisie est spécifiée à l instanciation de la classe TextField cf ). Les deux liste de choix invitent l utilisateur à sélectionner une devise source et une devise de destination (Fig. 1 et Fig. 2). Une fois la commande Convertir activée par l utilisateur, l écran de sécurité de la Fig. 3 s affiche. Le message témoignant du succès de l interaction s affiche quelques secondes après l acceptation de l utilisateur (Fig. 4). Une fois que l utilisateur a confirmé, le résultat de la conversion s affiche enfin (Fig. 5). Si l utilisateur refuse que l application utilise le réseau (Fig. 3), l écran de la Fig. 6 s affiche. Le refus de l utilisateur est valable pour toute la durée d exécution de l application. Pour effectuer une conversion, il faudra donc quitter l application, puis la relancer
60 L application CurrencyConverter n effectue aucun calcul pour réaliser la conversion, cette tâche est assurée par le serveur PHP avec lequel elle communique Le serveur PHP Le code source du script PHP exécuté sur le serveur est disponible sur le cd rom fourni en annexe. La librairie nusoap est utilisée pour effectuer l appel au Web Service. Une fois le taux de la devise retourné, le serveur PHP convertit la valeur que le client J2ME lui a fournie, puis, lui renvoie le résultat. L appel de Web Service depuis un script PHP n est pas directement l objet de la présente étude. Pour obtenir plus d informations sur ce sujet, vous pouvez consulter l adresse suivante : Le Web service Le Web Service invoqué depuis le serveur PHP est fourni par XMETHODS. Il retourne le taux de conversion d une devise par rapport à une autre. Toutes les informations nécessaires concernant le Web Service Currency Exchange Rate sont disponibles à l adresse suivante : Xwns4SKOn3(QHyMHiRM)?key=uuid:D784C184-99B2-DA25-ED D11A12E5 Remarque : étant donné que l architecture de ce prototype implique deux serveurs tiers, il n est pas garantit que vous puissiez tester ce prototype à tout moment. En effet, le serveur de Web Service est normalement fiable mais il se peut qu il ne réponde pas si il est surchargé (le prototype ne gère pas ce cas de figure). D autre part, le serveur PHP n est pas en activité 24h/24h
61 5. Conclusion L explosion du marché des terminaux mobiles et la popularité du langage Java justifient que les développeurs s intéressent à une technologie comme J2ME. Par ailleurs, l architecture modulaire caractérisant la technologie de Sun Microsystems est parfaitement adaptée aux différents types de terminaux mobiles et à leur évolution technologique perpétuelle. J2ME, comme les autres technologies Java, comporte l avantage notoire de la portabilité (Write Once And Run Everywhere). Une même application peut être exécutée sur un téléphone portable ou sur un PDA PocketPC (des tests de dernière minute qui n ont malheureusement pas pu être intégrés à la présente étude me permettent de le confirmer). La portabilité des applications J2ME est un argument de force face à des technologies concurrentes comme celle de Microsoft (Microsoft Embedded Architecture), qui se concentre sur un unique environnement mobile, Windows CE. D autre part, la collaboration intensive de Sun Microsystem avec des fabricants de terminaux mobiles tels que Motorola, Nokia, Sony Ericsson ou Siemens facilite l évolution de la technologie en fonction des terminaux cibles. Notons également que Sun propose des outils simples et efficaces pour assurer le cycle de développement d une application. Les émulateurs proposés facilitent les tests, mais il est toutefois conseillé de tester les applications sur le terminal cible pour se faire une idée exacte du résultat. Les terminaux mobiles disposent de ressources limitées. Les limitations se rapportant à la puissance de calcul ou à l espace de stockage peuvent être contournées grâce à une architecture distrbuée (utilisation de Web Services, stockage de données sur un serveur ). Seules les contraintes d affichage limitent réellement les possibilités de développement
62 Bibliographie Livre [DEL02] : Bruno Delb J2ME Applications Java pour terminaux mobiles EYROLLES 2002 ISBN Sites [WJS04] : [JSU04] : [DSU04] : Wireless Java Sun Microsystem Java Sun J2ME Introduction Mobility Java Technology Articles [JNE04] : [MVE02] : Le Journal du Net Le marché des terminaux mobile s envole 06/ Electronique Les machines Java pour l embarqué 06/ Documentation [API] : [SEW] : [SEJ] : Documentation des API J2ME Fournie avec le J2ME Wireless Toolkit Sony Ericsson t610 White paper Fournie sur le cd rom annexé wp_t610_r2a.pdf Java Support in Sony Ericsson mobiles phones Fournie sur le cd rom annexé dg_j2me_midp1_r3a.pdf
63 - annexe n 1 Annexe n 1 : API d interface utilisateur haut niveau L application testgui est un exemple de mise en œuvre de la plupart des composants de l API d interface utilisateur haut niveau fournie par le profil MIDP. import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.io.*; public class TestGUI extends MIDlet implements CommandListener { // Déclaration du gestionnaire d'affichage private Display display = null; // Déclaration d'un composant List qui fera office de menu private List mymenu = null; // Déclaration d'un composant Image private Image myimg = null; // Déclaration d'une autre image private Image myimgmenu1 = null; // Déclaration d'une autre image private Image myimgmenu2 = null; // Déclaration d'une autre image private Image myimgmenu3 = null; // Déclaration d'une zone de texte statique private StringItem mystringitem = null; // Déclaration de la liste de choix private ChoiceGroup mychoicegroup = null; // Déclaration de la zone de texte private TextBox mytextbox = null; // Déclaration d'un ticker private Ticker myticker = null; // Déclaration de l'alerte private Alert myalert = null; // Déclaration d'un composant date private DateField mydate = null; // Déclaration d'un composant formulaire private Form myform = null; // Déclaration d'un composant jauge private Gauge mygauge = null; // Déclaration d'un champ de texte private TextField mytextfield = null; // Déclaration et création des commandes retour, menu et sortie static final Command cmdretour = new Command ("Retour", Command.BACK, 0); static final Command cmdsortie = new Command ("Sortie", Command.EXIT, 1); // Les sources des images static final String sourceimg = "/duke.png"; static final String sourceimgmenu1 = "/redsquare.png"; static final String sourceimgmenu2 = "/greensquare.png"; static final String sourceimgmenu3 = "/bluesquare.png"; /** * Constructeur **/ public TestGUI() { // Création du menu mymenu = new List ("Test GUI", Choice.IMPLICIT); // Création de toutes les images try { myimgmenu1 = Image.createImage(sourceImgMenu1); myimgmenu2 = Image.createImage(sourceImgMenu2); myimgmenu3 = Image.createImage(sourceImgMenu3); myimg = Image.createImage(sourceImg); - 1 -
64 - annexe n 1 catch (IOException e){ e.printstacktrace(); // Ajouts des éléments au menu mymenu.append ("Test TextBox", myimgmenu1); mymenu.append ("Test Alert", myimgmenu2); mymenu.append ("Test Form", myimgmenu3); // Ajout de la commande sortie au menu mymenu.addcommand (cmdsortie); // Mise en place du listener mymenu.setcommandlistener (this); // Création du ticker myticker = new Ticker ("Test de l'interface graphique haut niveau."); // Association du ticker au menu mymenu.setticker (myticker); // Création d'un composant DateField mydate = new DateField ("La date d'ajourd'hui : ", DateField.DATE); // Obtention de la date courante et assignation au composant DateField java.util.date now = new java.util.date(); mydate.setdate (now); // Création d'un composant jauge mygauge = new Gauge("Jauge", true, 10, 0); // Création d'un composant champ de texte qui sera associé à un formulaire mytextfield = new TextField("Champ de texte", "", 50, TextField.ANY); // Création d'une liste de choix (à choix exclusif) mychoicegroup = new ChoiceGroup ("Faites votre choix :", mychoicegroup.exclusive); // Ajout des éléments de la liste de choix mychoicegroup.append ("Option 1", null); mychoicegroup.append ("Option 2", null); mychoicegroup.append ("Option 3", null); // Création de la zone de texte statique mystringitem = new StringItem ("Une image :", ""); // Création d'un composant formulaire myform = new Form ("Formulaire"); // Association du champ de texte, de la date, de la jauge, de la liste de choix, // de la zone de texte statique et de l'image au formulaire myform.append (mytextfield); myform.append (mydate); myform.append (mygauge); myform.append(mychoicegroup); myform.append (mystringitem); myform.append (new ImageItem(null, myimg, ImageItem.LAYOUT_CENTER, null)); // Ajout d'une commande de retour myform.addcommand (cmdretour); // Mise en place du listener myform.setcommandlistener (this); // Création d'une zone de texte de taille 50 avec le libellé // "Saisissez votre texte :". La contrainte de saisie ANY est spécifiée ce qui signifie // que l'utilisateur pourra saisir n'importe quel caractère. mytextbox = new TextBox ("Saisir du texte :", "", 50, TextField.ANY); // Ajout de la commande de retour au TextBox mytextbox.addcommand (cmdretour); // Mise en place du listener mytextbox.setcommandlistener (this); // Création d'une alerte de type INFO myalert = new Alert ("Une alerte sonore"); myalert.settype (AlertType.INFO); // Cette alerte reste affichée tant que l'utilisateur ne fait pas de confirmation myalert.settimeout(alert.forever); myalert.setstring ("Alerte de type INFO."); - 2 -
65 - annexe n 1 /** * Lance le MIDlet. **/ public void startapp() throws MIDletStateChangeException { display = Display.getDisplay (this); mainmenu(); /** * Suspend le MIDlet **/ public void pauseapp() { /** * Termine l'exécution du MIDlet **/ public void destroyapp (boolean unconditional) { notifydestroyed(); /** * Affichage du menu principal **/ private void mainmenu() { // Affichage du menu principal display.setcurrent(mymenu); /** * Test du composant TextBox **/ private void testtextbox() { // Affichage du composant TextBox display.setcurrent (mytextbox); /** * Test du composant Alert **/ public void testalert() { // Affichage de l'alerte display.setcurrent (myalert); /** * Test du composant Form **/ public void testform() { // Affichage du composant formulaire et de ces éléments associés display.setcurrent (myform); - 3 -
66 - annexe n 1 /** * Gestion des événements **/ public void commandaction (Command cmdselected, Displayable d) { // Si la commande Sortie est activée, on quitte le MIDlet. if (cmdselected == cmdsortie) { destroyapp (false); else if (cmdselected == cmdretour) { // Si la commande Retour est activée, on retourne au menu. mainmenu(); else { // Dans les autres cas, il s'agit forcément de la sélection d'un élément // du menu. On lit la position de l'élément sélectionné dans la liste // et on appelle la méthode correspondante. List l = (List) display.getcurrent(); switch (l.getselectedindex()) { case 0: testtextbox(); break; case 1: testalert(); break; case 2: testform(); break; Vous trouverez ci-dessous quelques illustrations de l application testgui exécutée sur l émulateur standard du J2ME Wireless Toolkit 2.1. Fig. 1 Ecran de démarrage de l application testgui Fig. 2 Menu implémenté par la classe List Fig. 3 Champ de texte implémenté par la classe TextBox - 4 -
67 - annexe n 1 Fig. 4 Alerte de type INFO implémentée par la classe Alert Fig. 5 Formulaire avec des composants TextField, DateField, Gauge Fig. 6 Suite du formulaire avec les composants ChoiceGroup et Image Fig. 5 Ecran de saisie de la date du composant DateField Une fois l application lancée le menu illustré à la Fig. 2 s affiche. Si l utilisateur choisi Test TextBox le champ de texte illustré à la Fig. 3 s affiche. La commande Retour permet de revenir au menu. Lorsque l utilisateur choisit Test Alert, l alerte illustrée à la Fig. 4 s affiche. Une fois que l utilisateur a confirmé, le menu s affiche à nouveau. Si l utilisateur choisit Test Form le formulaire et ses composants associés illustrés à la Fig. 5 et Fig. 6 s affichent. Lorsque l utilisateur veut saisir une nouvelle date dans le champ de date l écran de la Fig. 5 s affiche
68 - annexe n 2 Annexe n 2 : Mise en œuvre de RMS L application testrecordstore est un exemple de mise en œuvre du RMS (Record Management System). Son code source est présenté dans l encadré ci-dessous. import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.rms.*; // Le MIDlet implémente les interfaces CommandListener et RecordListener public class TestRec extends MIDlet implements CommandListener, RecordListener { // Déclaration de la commande de sortie private Command cmdexit; // Déclaration de la commande de sauvegarde private Command save; // Déclaration de la commande d'affichage du menu private Command cmdmenu; // Déclaration du gestionnaire d'affichage private Display mydisplay; // Déclaration du composant TextBox qui permettra la saisie de nouveaux enregistrements private TextBox tb = null; // Déclaration de l'enregistrement private Rec rec = null; // Déclaration d'un Record Store private RecordStore mydb = null; // Déclaration d'un composant List qui fera office de menu principal private List menu = null; // Déclaration d'un formulaire pour l'affichage des enregistrements private Form myform = null; // Déclaration d'un formulaire pour l'affichage du nombre d'enregistrements private Form myformnb = null; // Déclarations de composants StringItem qui seront associés au formulaire ci-dessus private StringItem strnbrec = null; private StringItem strtaillerec = null; public TestRec () { try { // Ouverture du Record Store (si il n'existe pas, il est créé) mydb = RecordStore.openRecordStore("myDb", true); // Mise en place d'un listener sur le Record Store mydb.addrecordlistener(this); catch (RecordStoreException e) { // Affiche une alerte en cas d'erreur final Alert errrec = new Alert ("Erreur"); errrec.settype(alerttype.error); errrec.setstring("impossible d'ouvrir le Record Store."); mydisplay.setcurrent(errrec); - 1 -
69 - annexe n 2 // La classe modélisant l'enregistrement public class Rec { private String mot = ""; public Rec(String mot) { this.mot = mot; // Transforme la chaîne mot en tableau d'octets public byte[] tobytes() { return this.mot.getbytes(); // Affichage d'un composant TextBox pour la saisie d'un nouvel enregistrement private void newrec() { tb.setstring(""); mydisplay.setcurrent(tb); // Affichage du menu principal private void mainmenu() { mydisplay.setcurrent(menu); // Pour émettre un son AlertType.CONFIRMATION.playSound(myDisplay); // Initialise un formulaire private void initform() { myform = new Form("Listing"); myform.addcommand (cmdexit); myform.addcommand (cmdmenu); myform.setcommandlistener (this); // Initialisation des différents composants GUI au démarrage de l'application public void startapp() { mydisplay = Display.getDisplay (this); cmdmenu = new Command("Menu", Command.SCREEN, 1); cmdexit = new Command ("Sortie", Command.SCREEN, 2); save = new Command ("Save", Command.OK, 1); tb = new TextBox ("New Rec", "", 1024, 0); tb.addcommand (save); tb.addcommand (cmdexit); tb.addcommand (cmdmenu); tb.setcommandlistener (this); this.initform(); myformnb = new Form("Nb Rec"); strnbrec = new StringItem("Nombre d'enregistrements : ", ""); strtaillerec = new StringItem("Taille du Record Store : ", ""); myformnb.append(strnbrec); myformnb.append(strtaillerec); myformnb.addcommand (cmdexit); myformnb.addcommand (cmdmenu); myformnb.setcommandlistener (this); menu = new List("Menu", Choice.IMPLICIT); menu.append("new rec", null); menu.append("nb rec", null); menu.append("all rec", null); menu.append("clear all", null); menu.addcommand(cmdexit); menu.setcommandlistener(this); // Affichage du menu principal this.mainmenu(); // Exécuté lorsque l'application est suspendue public void pauseapp() { - 2 -
70 - annexe n 2 // Exécuté lorsque l'application se termine public void destroyapp (boolean unconditional) { try { // Fermeture du Record Store mydb.closerecordstore(); catch (RecordStoreException e) { // Affiche une alerte en cas d'erreur final Alert errrec = new Alert ("Erreur"); errrec.settype(alerttype.error); errrec.setstring("impossible de fermer le Record Store."); mydisplay.setcurrent(errrec); notifydestroyed(); // Affiche l'ensemble des enregistrements private void allrec() { int nbrec = 0; String str = ""; try { // Récupération du nombre d'enregistrements contenus dans le Record Store nbrec = mydb.getnumrecords(); catch (RecordStoreException e) { // Affiche une alerte en cas d'erreur final Alert errrec = new Alert ("Erreur"); errrec.settype(alerttype.error); errrec.setstring("impossible d'accéder au Record Store."); mydisplay.setcurrent(errrec); // Teste si il y a au moins un enregistrement dans le Record Store if (nbrec > 0) { // Si le formulaire contient moins d'éléments // que le nombre d'enregistrements contenus dans le Record Store, // c'est que la méthode allrec n'a pas encore été exécutée depuis // le lancement de l'application. Le formulaire devra donc être // rénitialisé. En effet, si l'utilisateur a créé des nouveaux // enregistrements avant d'afficher l'ensemble des enregistrements // du Record Store, le listener a répercuté les mises à jour // sur le formulaire. Pour éviter ce test, on aurait pu extraire // les enregistrements du Record Store et les ajouter au formulaire // au démarrage de l'application. Etant donné que l'extraction des // enregistrements est consommatrice de ressources, ce choix // permet un démarrage moins laborieux de l'application. // L'extraction n'est effectuée que si l'utilisateur a besoins // d'afficher l'ensemble des enregistrements. Notons également que // cette extraction n'est effectuée qu'une seule fois pendant la durée // d'exécution de l'application. if (myform.size() < nbrec){ // Purge du formulaire d affichage this.initform() ; byte[] mydata = null; try { // On parcours le Record Store for (int i = 1 ; i <= nbrec ; i++ ) { mydata = mydb.getrecord(i); if (mydata!= null){ str = new String(myData); // On ajoute l'enregistrement au formulaire - 3 -
71 - annexe n 2 myform.append(new StringItem("Rec n " + Integer.toString(i), " : " + str)); catch (RecordStoreException e) { // Affiche une alerte en cas d'erreur final Alert errrec = new Alert ("Erreur"); errrec.settype(alerttype.error); errrec.setstring("impossible d'accéder au Record Store."); mydisplay.setcurrent(errrec); // On affiche le formulaire mydisplay.setcurrent(myform); else { // Affichage d'une alerte d'information si le Record Store est vide final Alert info = new Alert("Info"); info.settype(alerttype.info); info.setstring("le Record Store est vide."); info.settimeout(alert.forever); mydisplay.setcurrent(info); // Sauve l'enregistrement dans le Record Store private void saverec() { try { String str = tb.getstring(); if (!str.equals("")) { rec = new Rec(str); mydb.addrecord(rec.tobytes(), 0, rec.tobytes().length); // Affichage d'une alerte indiquant que l'enregistrement a été sauvegardé final Alert info = new Alert ("Info"); info.settype(alerttype.info); info.settimeout(alert.forever); info.setstring("votre saisie <<" + str + ">> a été enregistrée."); mydisplay.setcurrent(info); tb.setstring(""); catch (RecordStoreFullException e) { // Affiche une alerte en cas d'erreur final Alert errrec = new Alert ("Erreur"); errrec.settype(alerttype.error); errrec.setstring("impossible d'ajouter l'enregistrement. Le Record Store est plein."); mydisplay.setcurrent(errrec); catch (RecordStoreException e) { // Affiche une alerte en cas d'erreur final Alert errrec = new Alert ("Erreur"); errrec.settype(alerttype.error); errrec.setstring("impossible d'accéder au Record Store."); mydisplay.setcurrent(errrec); // Affiche le nombre d'enregistrements et la taille du Record Store private void countrec() { try { - 4 -
72 - annexe n 2 int nbrec = mydb.getnumrecords(); strnbrec.settext(integer.tostring(mydb.getnumrecords())); strtaillerec.settext(integer.tostring(mydb.getsize()) + " octets"); mydisplay.setcurrent(myformnb); catch (RecordStoreException e) { // Affiche une alerte en cas d'erreur final Alert errrec = new Alert ("Erreur"); errrec.settype(alerttype.error); errrec.setstring("impossible d'accéder au Record Store."); mydisplay.setcurrent(errrec); // Purge du Record Store private void clearall() { try { // Purge du formulaire d'affichage this.initform(); // On ferme le Record Store mydb.closerecordstore(); // On efface le Record Store RecordStore.deleteRecordStore("myDb"); // On affiche une alerte d'information final Alert info = new Alert ("Info"); info.settype(alerttype.info); info.settimeout(alert.forever); info.setstring("le Record Store est purgé."); mydisplay.setcurrent(info); // On crée un nouveau Record Store de même nom mydb = RecordStore.openRecordStore("myDb", true); // Mise en place du listener sur ce Record Store mydb.addrecordlistener(this); catch (RecordStoreException e) { // Affiche une alerte en cas d'erreur final Alert errrec = new Alert ("Erreur"); errrec.settype(alerttype.error); errrec.setstring("impossible d'accéder au Record Store."); mydisplay.setcurrent(errrec); // Gestion des évènements public void commandaction (Command mycommand, Displayable mydisplayable) { if (mycommand == cmdexit) { destroyapp(false); else if (mycommand == save) { this.saverec(); else if (mycommand == cmdmenu) { this.mainmenu(); else { List list = (List)myDisplay.getCurrent(); switch (list.getselectedindex()) { case 0: this.newrec(); break; case 1: - 5 -
73 - annexe n 2 this.countrec(); break; case 2: this.allrec(); break; case 3: this.clearall(); break; // Implémentation des méthodes définies dans l'interface Record Listener // Exécuté lorsqu'un enregistrement est ajouté au Record Store public void recordadded(recordstore recordstore, int recordid){ try { // On met le formulaire d'affichage à jour myform.append(new StringItem("Rec n " + recordid, " : " + new String(recordStore.getRecord(recordId)))); catch (RecordStoreException e) { // Affiche une alerte en cas d'erreur final Alert errrec = new Alert ("Erreur"); errrec.settype(alerttype.error); errrec.setstring("impossible d'accéder au Record Store."); mydisplay.setcurrent(errrec); // Exécuté lorsqu'un enregistrement du Record Store est modifié. // L'implémentation de cette méthode est vide car l'application n'offre pas la // possibilité de modifier les enregistrements. public void recordchanged(recordstore recordstore, int recordid){ // Exécuté lorsqu'un enregistrement du Record Store est supprimé. // L'implémentation de cette méthode est vide car l'application n'offre pas la // possibilité de supprimer les enregistrements un à un. public void recorddeleted(recordstore recordstore, int recordid){ Vous trouverez ci-dessous quelques illustrations de l application testrecordstore exécutée sur l émulateur standard du J2ME Wireless Toolkit
74 - annexe n 2 Fig. 1 Ecran de démarrage de l application Fig. 2 Menu principal de l application Fig. 3 Ecran de saisie d un nouvel enregistrement Fig. 4 Les commandes disponibles depuis l écran de saisie Fig. 5 Ecran d affichage du nombre d enregistrements Fig. 6 Ecran d affichage de l ensemble des enregistrements Fig. 7 Alerte affichée lorsque le Record Store est purgé Fig. 8 Alerte affichée lorsque le Record Store est vide Fig. 9 Alerte affichée lorsqu un enregistrement a été ajouté L application testrecordstore permet d enregistrer des chaînes de caractères dans un Record Store (prototype de memo). Lorsque l application est lancée, le menu principal illustré à la Fig. 2 s affiche. En sélectionnant la rubrique New rec, l écran de saisie d un nouvel enregistrement de la Fig. 3 s affiche. En cliquant sur le bouton Menu, les commandes disponibles s affichent (cf Fig. 4). La commande Menu permet de retourner au menu principal de l application. La commande Sortie permet de quitter l application et la commande Save permet de sauvegarder la chaîne de caractères saisie. Lorsque la commande Save est activée l alerte d information de la Fig. 9 est affichée pour informer l utilisateur que sa saisie a été enregistrée dans le Record Store. En sélectionnant la rubrique Nb rec du menu principal, l écran illustré à la Fig. 5 s affiche. Notons que même lorsqu il est vide, le Record Store occupe un certain espace (stockage d informations structurelles propres au Record Store)
75 - annexe n 2 Lorsque la rubrique All rec du menu principal est sélectionnée, l écran d affichage de l ensemble des enregistrements du Record Store est affiché (cf Fig. 6). Si le Record Store est vide une alerte d information est affichée (cf Fig. 8). En sélectionnant la rubrique Clear all du menu principal, le Record Store est effacé puis recréé. Tous les enregistrements sont donc supprimés et une alerte informe l utilisateur de la purge du Record Store (cf Fig. 7)
76 - annexe n 3 Annexe n 3 : Mise en œuvre du composant HttpConnection L application testhttp est un exemple d utilisation du composant HttpConnection. Son code source est présenté dans l encadré ci-dessous. import java.io.*; import javax.microedition.midlet.*; import javax.microedition.io.*; import javax.microedition.lcdui.*; // MIDlet permettant de télécharger le contenu d'un fichier texte public class TestHttp extends MIDlet { // Déclaration du gestionnaire d'affichage private Display mydisplay; // Déclaration et initialisation d'un chaîne de caractères contenant l'url // désignant l'emplacement du fichier texte distant private String url = " // Déclaration d'un formulaire qui sera utilisé pour afficher // le contenu téléchargé du fichier texte private Form myform = null; // Constructeur public TestHttp() { myform = new Form("Résultat"); // Exécuté au démarrage de l'application public void startapp() { mydisplay = Display.getDisplay(this); try { downloadtxt(url); catch (SecurityException e) { e.printstacktrace(); catch(ioexception e) { e.printstacktrace(); // Télécharge le contenu du fichier texte distant private void downloadtxt(string url) throws IOException { StringBuffer b = new StringBuffer(); InputStream is = null; HttpConnection c = null; try { long len = 0 ; int ch = 0; c = (HttpConnection)Connector.open(url); is = c.openinputstream(); len =c.getlength(); if( len!= -1) { // Lecture du flux d'octets for(int i =0 ; i < len ; i++ ){ if((ch = is.read())!= -1) { b.append((char) ch); - 1 -
77 - annexe n 3 else { // Lecture jusqu'à ce que la connexion soit fermée while ((ch = is.read())!= -1) { len = is.available() ; b.append((char)ch); myform.append(new StringItem("Contenu du fichier texte : ", b.tostring())); finally { if (c!= null) { is.close(); c.close(); mydisplay.setcurrent(myform); // Exécuté lorsque l'application est suspendue public void pauseapp() { // Exécuté lorsque l'application se termine public void destroyapp(boolean unconditional) { notifydestroyed(); Vous trouverez ci-dessous quelques illustrations de l application testhttp exécutée sur l émulateur standard du J2ME Wireless Toolkit 2.1. Fig. 1 Ecran de démarrage de l application Fig. 2 Ecran de sécurité affiché par le système Fig. 3 Ecran affichant le résultat du téléchargement L application testhttp permet de télécharger le contenu d un fichier texte via une connexion HTTP. Lorsqu un MIDlet utilise un composant HttpConnection (ou un autre composant de connexion réseau), le système d exploitation du terminal mobile affiche l écran de la Fig. 2 pour des raisons de sécurité. Cet écran demande à l utilisateur si il autorise l application à ouvrir une connexion réseau. Si l utilisateur répond oui, l application pourra établir des connexions réseaux pendant toute la durée de son - 2 -
78 - annexe n 3 exécution. En revanche, si l utilisateur répond non, l application ne pourra établir aucune connexion pendant son exécution (l exception java.lang.securityexception est déclenchée). Pour pouvoir établir à nouveau une connexion, l utilisateur devra quitter l application puis la relancer. Si l utilisateur autorise l application à ouvrir une connexion, l écran de résultat de la Fig. 3 est affiché une fois le téléchargement terminé
Manuel d installation de l application Dimona New via SMS
Manuel d installation de l application Dimona New via SMS Manuel d installation de l application Dimona New via SMS Grâce aux informations contenues dans ce manuel, vous pouvez configurer votre GSM de
La technologie Java Card TM
Présentation interne au CESTI La technologie Java Card TM [email protected] http://dept-info.labri.u-bordeaux.fr/~sauveron 8 novembre 2002 Plan Qu est ce que Java Card? Historique Les avantages
Machine virtuelle Java pour Palm TX
Machine virtuelle Java pour Palm TX Sommaire 1. Présentation de la machine virtuelle d IBM...1 2. Installation sur le Palm TX...2 2.1. Téléchargement...2 2.2. Installation...2 2.3. Application de test...2
TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet
TP Composants Java ME - Java EE Vous allez, dans ce TP, construire une architecture client serveur, plus précisément MIDlet cliente, servlet serveur. Pour cela, on va d'abord installer la partie serveur
Déploiement d applications Java ME
Déploiement d applications Java ME Master MATIS Management and Technology of Information Systems Master en Technologie des Systèmes d Information Hikari WATANABE & Dejan MUNJIN, Juin 2007 Département des
Vulgarisation Java EE Java EE, c est quoi?
Paris, le 1 Février 2012 Vulgarisation Java EE Java EE, c est quoi? Sommaire Qu est ce que Java? Types d applications Java Environnements Java Versions de Java Java EE, c est quoi finalement? Standards
La carte à puce. Jean-Philippe Babau
La carte à puce Jean-Philippe Babau Département Informatique INSA Lyon Certains éléments de cette présentation sont issus de documents Gemplus Research Group 1 Introduction Carte à puce de plus en plus
Plate formes mobiles. Utilisation. Contexte 9/29/2010 IFC 2. Deux utilisations assez distinctes :
Plate formes mobiles IFC 2 Markus Jaton Utilisation Deux utilisations assez distinctes : Téléphones évolués (Nokia, Motorola) Smartphones (Apple,, Windows) La téléphonie est en stagnation, alors que les
Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique
Institut Supérieure Aux Etudes Technologiques De Nabeul Département Informatique Support de Programmation Java Préparé par Mlle Imene Sghaier 2006-2007 Chapitre 1 Introduction au langage de programmation
Java ME : une présentation. Jean-Marc Farinone
Java ME : une présentation Jean-Marc Farinone 1 But de l exposé Comprendre, définir, situer les termes : Java ME, J2ME, CDC, CLDC, Configuration, Profiles, MIDP (1.0, 2.0), MIDlet, jad, etc. Donner des
as Architecture des Systèmes d Information
Plan Plan Programmation - Introduction - Nicolas Malandain March 14, 2005 Introduction à Java 1 Introduction Présentation Caractéristiques Le langage Java 2 Types et Variables Types simples Types complexes
Encadré par : Michel SIMATIC
Réalisé Par : Nizar BEN AYADA Ahmed GHZAIEL Encadré par : Michel SIMATIC I. PRESENTATION DU PROJET II. PRESENTATION DU MIDDLEWARE GASP 1- PRESENTATION GENERALE : 2- NECESSITE DES INTERGICIELS DANS LE MONDE
Programmation d'applications sur PDA
Programmation d'applications sur PDA l'exemple de Waba Paul Guyot - ECE - Systèmes Embarqués (14/12/01) 1 Introduction 2 Introduction Généralisation des PDAs Utilisation spécifique des PDAs Projet originel
Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars 2014. http://homepages.laas.fr/matthieu/cours/java/java.pdf
Introduction à Java Matthieu Herrb CNRS-LAAS http://homepages.laas.fr/matthieu/cours/java/java.pdf Mars 2014 Plan 1 Concepts 2 Éléments du langage 3 Classes et objets 4 Packages 2/28 Histoire et motivations
LES OUTILS DE LA MOBILITE
L évolution du marché des assistants personnels, ainsi que la baisse des prix, permettent désormais à un plus grand nombre d entreprises de s équiper avec des outils technologiques performants. Avec l
Java pour le Web. Cours Java - F. Michel
Java pour le Web Cours Java - F. Michel Introduction à JEE 6 (ex J2EE) Historique Qu'est-ce que JEE JEE : Java Entreprise Edition (ex J2EE) 1. Une technologie outils liés au langage Java + des spécifications
Projet de Veille Technologique
Projet de Veille Technologique Programmation carte à puce - JavaCard Ing. MZOUGHI Ines ([email protected]) Dr. MAHMOUDI Ramzi ([email protected]) TEST Sommaire Programmation JavaCard Les prérequis...
Initiation à JAVA et à la programmation objet. [email protected]
Initiation à JAVA et à la programmation objet [email protected] O b j e c t i f s Découvrir un langage de programmation objet. Découvrir l'environnement java Découvrir les concepts de la programmation
Une tasse de café fumante est
INFORMATIQUE La technologie Java est prête à embarquer Java est une technologie de programmation puissante et fiable. Elle est omniprésente sur Internet, dans la téléphonie mobile et sur la plupart des
Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/2012. 1 - Vue générale 2 - Mon premier programme 3 - Types de Programme Java
1 - Vue générale 2 - Mon premier programme 3 - Types de Programme 1 2 c est quoi? Technologie développée par SUN Microsystems lancée en 1995 Dans un des premiers papiers* sur le langage JAVA, SUN le décrit
Administration de systèmes
Administration de systèmes Windows NT.2000.XP.2003 Copyright IDEC 2002-2004. Reproduction interdite. Sommaire... 2 Eléments logiques et physiques du réseau... 5 Annuaire et domaine... 6 Les utilisateurs
Notice d Installation et d utilisation d une liaison Bluetooth avec un PDA ipaq.
Constructeur Français Notice d Installation et d utilisation d une liaison Bluetooth avec un PDA ipaq..1 Installation de l environnement d exécution du PPC... 2 Caractéristiques pour PDA :... 2 Installation
Programmer en JAVA. par Tama ([email protected]( [email protected])
Programmer en JAVA par Tama ([email protected]( [email protected]) Plan 1. Présentation de Java 2. Les bases du langage 3. Concepts avancés 4. Documentation 5. Index des mots-clés 6. Les erreurs fréquentes
INTRODUCTION A JAVA. Fichier en langage machine Exécutable
INTRODUCTION A JAVA JAVA est un langage orienté-objet pur. Il ressemble beaucoup à C++ au niveau de la syntaxe. En revanche, ces deux langages sont très différents dans leur structure (organisation du
Éléments de programmation et introduction à Java
Éléments de programmation et introduction à Java Jean-Baptiste Vioix ([email protected]) IUT de Dijon-Auxerre - LE2I http://jb.vioix.free.fr 1-20 Les différents langages informatiques
Les tablettes. Présentation tablettes Descriptif Fournisseurs Caractéristiques Comparatifs Conseils Perspectives Démonstration
Les Tablettes Les tablettes Présentation tablettes Descriptif Fournisseurs Caractéristiques Comparatifs Conseils Perspectives Démonstration Les tablettes Description: Appareil mobile positionné entre smartphone
! " # $ % & OPN Day Paris 14 mars 2006
'! " # $ % & L information en entreprise X2/an 40% 70% X5 Quelques chiffres! "# $ % &' )# $ * +*!% &' ' (! La voie de la Collaboration Solutions différentiées Plateforme intégrée Email & Calendrier Portails
Annexe : La Programmation Informatique
GLOSSAIRE Table des matières La Programmation...2 Les langages de programmation...2 Java...2 La programmation orientée objet...2 Classe et Objet...3 API et Bibliothèque Logicielle...3 Environnement de
MMSCam. Travail de diplôme 2003. Pilotage à distance d un téléphone MMS. Département d électricité et d informatique. Auteur : Jeanmonod David
MMSCam Pilotage à distance d un téléphone MMS Auteur : Jeanmonod David Répondant externe : Cecchin Gianpaolo Prof. Responsable : Robert Stephan Sujet proposé par : Swisscom Mobile Travail de diplôme 2003
INITIATION AU LANGAGE JAVA
INITIATION AU LANGAGE JAVA I. Présentation 1.1 Historique : Au début des années 90, Sun travaillait sur un projet visant à concevoir des logiciels simples et performants exécutés dans des PDA (Personnal
Structure d un programme et Compilation Notions de classe et d objet Syntaxe
Cours1 Structure d un programme et Compilation Notions de classe et d objet Syntaxe POO 1 Programmation Orientée Objet Un ensemble d objet qui communiquent Pourquoi POO Conception abstraction sur les types
Remote Method Invocation (RMI)
Remote Method Invocation (RMI) TP Réseau Université Paul Sabatier Master Informatique 1 ère Année Année 2006/2007 Plan Objectifs et Inconvénients de RMI Fonctionnement Définitions Architecture et principe
Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour http://cuiwww.unige.
: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java Michel Bonjour http://cuiwww.unige.ch/~bonjour Plan JDBC: API bas niveau pour l accès aux BD (SQL) - Introduction - JDBC et : Java, ODBC, SQL
Manuel de l utilisateur
1 Laplink Software, Inc. Manuel de l utilisateur Service clientèle/support technique : Web : http://www.laplink.com/fr/support E-mail : [email protected] Tel (USA) : +1 (425) 952-6001 Fax (USA)
Java - la plateforme
Java - la plateforme Java la plateforme Java? VM GC JIT Java Aujourd'hui 3 environnements d'exécutions différents Java ME (Micro Edition) pour PDA, téléphone Android (Java SE moins certain paquetages)
Rapport de certification
Rapport de certification Évaluation EAL 2+ du produit de Préparé par : Le Centre de la sécurité des télécommunications, à titre d organisme de certification dans le cadre du Schéma canadien d évaluation
RN2-Programmation Orientée Objet - JAVA CH 1 Introduction à la POO et Java
RN2-Programmation Orientée Objet - JAVA CH 1 à la POO et Java Licence Professionnelle 2006 Agnès Guerraz INRIA Rhône-Alpes [email protected] LP UPMF, Grenoble Septembre 2006 Ce cours reprend en grande
Linux embarqué: une alternative à Windows CE?
embarqué: une alternative à Windows CE? : une alternative à Windows CE Présentation Mangrove Systems Distribution embarqué Perspective WinCe / Questions Mangrove systems Créé en 2001 Soutien Soutien Ministère
Programmation C. Apprendre à développer des programmes simples dans le langage C
Programmation C Apprendre à développer des programmes simples dans le langage C Notes de cours sont disponibles sur http://astro.u-strasbg.fr/scyon/stusm (attention les majuscules sont importantes) Modalités
Java Licence Professionnelle CISII, 2009-2010
Licence Professionnelle CISII, 2009-2010 Cours 1 : Introduction à Java A. Belaïd [email protected] Cours disponible sur le site : http://www.loria.fr/~abelaid puis Teaching 1 Fonctionnement 12 séances :
TP1 : Initiation à Java et Eclipse
TP1 : Initiation à Java et Eclipse 1 TP1 : Initiation à Java et Eclipse Systèmes d Exploitation Avancés I. Objectifs du TP Ce TP est une introduction au langage Java. Il vous permettra de comprendre les
SGDN. Projet: JAVASEC
SGDN Projet: JAVASEC Type : rapport d étude Rapport d étude sur le langage Java Référence : JAVASEC_NTE_001 Nb pages : 227 Date : 14 octobre 2009 TABLE DES MATIÈRES 1 Introduction 8 1.1 Objet du document................................
Tsoft et Groupe Eyrolles, 2005, ISBN : 2-212-11623-3
Tsoft et Groupe Eyrolles, 2005, ISBN : 2-212-11623-3 Configuration requise ForestPrep DomainPrep Installation interactive 5 Installation sans surveillance Module 5 : Installation d Exchange Server 2003
Solution A La Gestion Des Objets Java Pour Des Systèmes Embarqués
International Journal of Engineering Research and Development e-issn: 2278-067X, p-issn: 2278-800X, www.ijerd.com Volume 7, Issue 5 (June 2013), PP.99-103 Solution A La Gestion Des Objets Java Pour Des
Windows 7 - Installation du client
Windows 7 - Installation du client 1 - Présentation Windows 7 est un système d exploitation client basé sur le noyau NT 6.1, disponible en six versions, commercialisé depuis octobre 2009. Résumé des fonctionnalités
MITEL UNIFIED COMMUNICATOR ADVANCED
MITEL UNIFIED COMMUNICATOR ADVANCED À propos d UC Advanced Mitel Unified Communicator (UC) Advanced est un produit de communication logiciel intégré avec les fonctions de gestion d'appels avancées de Mitel
GenDbg : un débogueur générique. Didier Eymery Jean-Marie Borello Jean-Marie Fraygefond Odile Eymery Philippe Bion
GenDbg : un débogueur générique Didier Eymery Jean-Marie Borello Jean-Marie Fraygefond Odile Eymery Philippe Bion 2008 Qui sommes nous? Centre d électronique de l Armement (CELAR) Maîtrise et protection
Chapitre I Notions de base et outils de travail
Chapitre I Notions de base et outils de travail Objectifs Connaître les principes fondateurs et l historique du langage Java S informer des principales caractéristiques du langage Java Connaître l environnement
MODULE I1. Plan. Introduction. Introduction. Historique. Historique avant 1969. R&T 1ère année. Sylvain MERCHEZ
MODULE I1 Plan Chapitre 1 Qu'est ce qu'un S.E? Introduction Historique Présentation d'un S.E Les principaux S.E R&T 1ère année Votre environnement Sylvain MERCHEZ Introduction Introduction Rôles et fonctions
Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki
Institut Supérieur de Gestion Cours pour 3 ème LFIG Java Enterprise Edition Introduction Bayoudhi Chaouki 1 Java EE - Objectifs Faciliter le développement de nouvelles applications à base de composants
NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007
NFP 121 Java et les Threads Présentation : Thierry Escalarasse Mai 2007 Plan du cour Présentation de la notion de Threads La classe Thread L interface Runnable Les états d un thread La Synchronisation
Traitement de données
Traitement de données Présentation du module TINI Présentation du module : Le module Tini se décline en plusieurs versions, il est constitué d une carte d application et d un module processeur : Les modules
VMware ESX/ESXi. 1. Les composants d ESX. VMware ESX4 est le cœur de l infrastructure vsphere 4.
VMware ESX/ESXi 1. Les composants d ESX VMware ESX4 est le cœur de l infrastructure vsphere 4. C est un hyperviseur, c est à dire une couche de virtualisation qui permet de faire tourner plusieurs systèmes
Environnements de développement (intégrés)
Environnements de développement (intégrés) Introduction aux EDI, la plateforme Eclipse Patrick Labatut [email protected] http://www.di.ens.fr/~labatut/ Département d informatique École normale supérieure
Data Station Plus. La solution complète de gestion de données. > Convertisseur de multiples
Data Station Plus La solution complète de gestion de données Convertisseur de multiples protocoles permettant une intégration système complet E nregistreur de données de process compatible avec les applications
WINDOWS Remote Desktop & Application publishing facile!
Secure Cloud & Solutions Accès BOYD CLOUD acces informatiques & BYOD sécurisé MYRIAD-Connect facilite votre travail en tous lieux et à tous moments comme si vous étiez au bureau. Conçu pour vous simplifier
Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java
Info0101 Intro. à l'algorithmique et à la programmation Cours 3 Le langage Java Pierre Delisle, Cyril Rabat et Christophe Jaillet Université de Reims Champagne-Ardenne Département de Mathématiques et Informatique
Aastra MD Evolution» Évoluer à vos côtés
Aastra MD Evolution» Évoluer à vos côtés Évoluer grâce à la communication En faire plus avec moins de moyens est un défi récurrent pour les petites entreprises. Vous devez pour cela améliorer constamment
la solution vidéo numérique qui offre une surveillance simple et puissante t: +44 (0)1202 723535 e: [email protected] w: www.tdsi.co.
la solution vidéo numérique qui offre une surveillance simple et puissante t: +44 (0)1202 723535 e: [email protected] w: www.tdsi.co.uk Sommaire 3 Qu est-ce que VUgarde? 4 Modules du système 5 Capacités
Perspectives pour l entreprise. Desktop Cloud. JC Devos IBM IT Architect [email protected]. 2010 IBM Corporation
Perspectives pour l entreprise Desktop Cloud JC Devos IBM IT Architect [email protected] Principe technique Disposer d un poste de travail virtuel accessible par la plupart des terminaux disponibles Ce
ES Enterprise Solutions
Strategic Media Technologies ES Enterprise Solutions Plateforme centralisée de collaboration en ligne www.dalim.com accès total au contenu indépendamment du lieu et fuseau horaire. N importe quand et n
Un nouveau modèle d'identité NFC compatible avec l'écosystème mobile, et cas d'usage
Un nouveau modèle d'identité NFC compatible avec l'écosystème mobile, et cas d'usage Pascal Urien Télécom ParisTech Co-Fondateur de la société EtherTrust 1/28 Agenda L écosystème NFC Un système d identité
Installation d un poste i. Partage et Portage & permissions NTFS
Filière : Technicien des Réseaux Informatique Installation d un poste i Partage et Portage & permissions NTFS Plan Partage et Permissions NTFS 1. Partage de dossiers 2. Sécurité des systèmes de fichiers
Le stockage. 1. Architecture de stockage disponible. a. Stockage local ou centralisé. b. Différences entre les architectures
Le stockage 1. Architecture de stockage disponible a. Stockage local ou centralisé L architecture de stockage à mettre en place est déterminante pour l évolutivité et la performance de la solution. Cet
LIVRE BLANC. Guide des fonctionnalités. Aperçu des avantages et des fonctions.
LIVRE BLANC Guide des fonctionnalités. Aperçu des avantages et des fonctions. TABLE DES MATIÈRES 1 PRÉSENTATION DE MICROSOFT WINDOWS SMALL BUSINESS SERVER 2003... 2 1.1 LA SOLUTION INTÉGRÉE POUR LES PETITES
CH.3 SYSTÈMES D'EXPLOITATION
CH.3 SYSTÈMES D'EXPLOITATION 3.1 Un historique 3.2 Une vue générale 3.3 Les principaux aspects Info S4 ch3 1 3.1 Un historique Quatre générations. Préhistoire 1944 1950 ENIAC (1944) militaire : 20000 tubes,
Une introduction à Java
Une introduction à Java IFT 287 (Semaine 1) UNIVERSITÉ DE SHERBROOKE 1 Java - Historique Développé par Sun Microsystems en 1994 Inventeur James Gosling (canadien!) Objectif langage sûr (fortement typé)
Cours CCNA 1. Exercices
Cours CCNA 1 TD3 Exercices Exercice 1 Enumérez les sept étapes du processus consistant à convertir les communications de l utilisateur en données. 1. L utilisateur entre les données via une interface matérielle.
VMWare Infrastructure 3
Ingénieurs 2000 Filière Informatique et réseaux Université de Marne-la-Vallée VMWare Infrastructure 3 Exposé système et nouvelles technologies réseau. Christophe KELLER Sommaire Sommaire... 2 Introduction...
Haka : un langage orienté réseaux et sécurité
Haka : un langage orienté réseaux et sécurité Kevin Denis, Paul Fariello, Pierre Sylvain Desse et Mehdi Talbi [email protected] [email protected] [email protected] [email protected] Arkoon Network
Évaluation et implémentation des langages
Évaluation et implémentation des langages Les langages de programmation et le processus de programmation Critères de conception et d évaluation des langages de programmation Les fondations de l implémentation
NFP111 Systèmes et Applications Réparties
NFP111 Systèmes et Applications Réparties 1 de 34 NFP111 Systèmes et Applications Réparties Cours 7 - CORBA/Partie 1 Claude Duvallet Université du Havre UFR Sciences et Techniques 25 rue Philippe Lebon
5.5 Utiliser le WiFi depuis son domicile
Utiliser le WiFi depuis son domicile D autres formules existent. Une autre association, Wifi-Savoie propose par exemple un accès WiFi pour les utilisateurs de passage. Ceux-ci devront s acquitter d environ
Bases Java - Eclipse / Netbeans
Institut Galilée PDJ Année 2014-2015 Master 1 Environnements Java T.P. 1 Bases Java - Eclipse / Netbeans Il existe plusieurs environnements Java. Il est ESSENTIEL d utiliser la bonne version, et un environnement
FileMaker Pro 13. Utilisation d une Connexion Bureau à distance avec FileMaker Pro 13
FileMaker Pro 13 Utilisation d une Connexion Bureau à distance avec FileMaker Pro 13 2007-2013 FileMaker, Inc. Tous droits réservés. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, Californie 95054
Sécurité dans les smartphones
UNIVERSITE LIBRE DE BRUXELLES Faculté des Sciences Département d Informatique Sécurité dans les smartphones Mémoire présenté en vue de l obtention du grade de Licencié en Informatique Nicolas SIMON Année
Rebol, un langage «différent»
02 Rebol (1) Chap 01 Page 13 Mardi, 18. septembre 2001 6:06 18 1 Rebol, un langage «différent» «Il est temps de faire quelque chose de différent.» Cette phrase de Carl Sassenrath, le concepteur de Rebol,
Cours Plugin Eclipse. Université Paris VI / Parcours STL / Master I Pierre-Arnaud Marcelot - Iktek - [email protected]
Cours Plugin Eclipse Université Paris VI / Parcours STL / Master I Pierre-Arnaud Marcelot - Iktek - [email protected] 1 Qui suis-je? Ancien étudiant de Jussieu - Paris VI Diplomé du Master Technologies
Point sur les solutions de développement d apps pour les périphériques mobiles
Point sur les solutions de développement d apps pour les périphériques mobiles Par Hugues MEUNIER 1. INTRODUCTION a. Une notion importante : le responsive web design Nous sommes en train de vivre une nouvelle
Surveillance Haute Performance
Surveillance Haute Performance Prenez les commandes Pourquoi avez-vous besoin d Obelisk? Comment Obelisk fonctionne-t-il? Réduisez votre charge de travail administratif, améliorez vos niveaux de service
Plan du cours. Historique du langage http://www.oracle.com/technetwork/java/index.html. Nouveautés de Java 7
Université Lumière Lyon 2 Faculté de Sciences Economiques et Gestion KHARKIV National University of Economic Introduction au Langage Java Master Informatique 1 ère année Julien Velcin http://mediamining.univ-lyon2.fr/velcin
Code Produit Nom Produit Dernière mise à jour. AM003 Alias Mobile On Demand Licence 1 mois 27/04/2015
www.alias-ad.com ALIAS MOBILE DESIGNER Des solutions innovantes pour la création d applications de gestion accessibles aux appareils mobiles (tablettes et smartphones) en client léger. Code Produit Nom
Manuel d utilisation du logiciel de messagerie personnelle Palm VersaMail 2.5
Manuel d utilisation du logiciel de messagerie personnelle Palm VersaMail 2.5 Copyright 2003 Palm, Inc. Tous droits réservés. Graffiti, HotSync, MultiMail, le logo Palm, PalmModem et Palm OS sont des marques
Tivoli Endpoint Manager Introduction. 2011 IBM Corporation
Tivoli Endpoint Manager Introduction Enjeux pour les départements IT Comment gérer : l inventaire la mise à jour la sécurité la conformité Sur des environnements hétérogènes OS : Windows, Mac, UNIX, Linux,
RMI le langage Java XII-1 JMF
Remote Method Invocation (RMI) XII-1 Introduction RMI est un ensemble de classes permettant de manipuler des objets sur des machines distantes (objets distants) de manière similaire aux objets sur la machine
1. Introduction à la distribution des traitements et des données
2A SI 1 - Introduction aux SI, et à la distribution des traitements et des données Stéphane Vialle [email protected] http://www.metz.supelec.fr/~vialle Support de cours élaboré avec l aide de
FileMaker Pro 12. Utilisation d une Connexion Bureau à distance avec FileMaker Pro 12
FileMaker Pro 12 Utilisation d une Connexion Bureau à distance avec FileMaker Pro 12 2007-2012 FileMaker, Inc. Tous droits réservés. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054
THEME 1 : L ORDINATEUR ET SON ENVIRONNEMENT. Objectifs
Architecture Matérielle des Systèmes Informatiques. S1 BTS Informatique de Gestion 1 ère année THEME 1 : L ORDINATEUR ET SON ENVIRONNEMENT Dossier 1 L environnement informatique. Objectifs Enumérer et
Syfadis. > Configuration du poste client. Nous vous aidons à réussir. REFERENCE : Syfadis LMS - 12/09/2008. AUTEUR : Equipe technique Syfadis
Syfadis Nous vous aidons à réussir > Configuration du poste client REFERENCE : Syfadis LMS - 12/09/2008 AUTEUR : Equipe technique Syfadis Ce document est la propriété de Syfadis. Il ne peut être communiqué
Auto-évaluation Programmation en Java
Auto-évaluation Programmation en Java Document: f0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INTRODUCTION AUTO-ÉVALUATION PROGRAMMATION EN
NFS Maestro 8.0. Nouvelles fonctionnalités
NFS Maestro 8.0 Nouvelles fonctionnalités Copyright Hummingbird 2002 Page 1 of 10 Sommaire Sommaire... 2 Généralités... 3 Conformité à la section 508 de la Rehabilitation Act des Etats-Unis... 3 Certification
Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN [email protected]
Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184 Frédéric BERTIN [email protected] Présentaion : Mobile 3D Graphics API JSR 184 M3G :présentation Package optionnel de l api J2ME. Prend
Services Réseaux - Couche Application. TODARO Cédric
Services Réseaux - Couche Application TODARO Cédric 1 TABLE DES MATIÈRES Table des matières 1 Protocoles de gestion de réseaux 3 1.1 DHCP (port 67/68)....................................... 3 1.2 DNS (port
Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre 2009. [email protected]
. Cours intensif Java 1er cours: de C à Java Septembre 2009 Enrica DUCHI LIAFA, Paris 7 [email protected] LANGAGES DE PROGRAMMATION Pour exécuter un algorithme sur un ordinateur il faut le
24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.
Plan du cours 2 Introduction générale : fondamentaux : les fondamentaux Michel Buffa ([email protected]), UNSA 2002, modifié par Richard Grin (version 1.1, 21/11/11), avec emprunts aux supports de Maxime
Mise en œuvre des serveurs d application
Nancy-Université Mise en œuvre des serveurs d application UE 203d Master 1 IST-IE Printemps 2008 Master 1 IST-IE : Mise en œuvre des serveurs d application 1/54 Ces transparents, ainsi que les énoncés
CHOIX ET USAGES D UNE TABLETTE TACTILE EN ENTREPRISE
Tablette tactile, ardoise électronique 1 ou encore tablette PC, ce terminal mobile à mi-chemin entre un ordinateur et un smartphone a d abord séduit le grand public avant d être adopté par les entreprises.
