| L e développement sur téléphone portable est un sujet qui suscite l’intérêt et la curiosité, tant par le coté défi technique que par la cible privilégiée qu’offre cet appareil : tant de personnes sont équipés de mobiles… Et pourtant rares sont les développeurs qui franchissent le pas. Au travers d'un exemple simple, l’objectif de cet article est de vous montrer les pistes qui vous amèneront peut-être, à créer votre première application mobile… |
L’idée fun et simple Pour cela, voici mon expérience personnelle en la matière : l’idée est née de créer une application très simple afin d’avoir un suivi de la consommation d’essence de mon véhicule. En effet, j’utilisais la calculatrice de mon téléphone portable pour faire le ratio entre le nombre de litres consommé sur le nombre de km effectués. Voila comment NokiaEssence est né…
Coté matériel, je disposais de 2 téléphones portables de marque Nokia : un 3100 et un 6136. Les mobiles chez Nokia se décomposent en 3 grandes séries : s40, s60 et s80. Mes 2 portables font partie de la série s40. Le site http://forum.nokia.com (Voir figure 1) m’a rapidement renseigné sur les possibilités de ces 2 téléphones. Aux vues des spécifications, mon choix c’est rapidement porté vers le modèle 6136. Nokia 6136 Technical Specs Operating System: Nokia OS Developer Platform: Series 40 3rd Edition, Feature Pack 1 Java Technology: MIDP 2.0 CLDC 1.1 JSR 120 Wireless Messaging API JSR 135 Mobile Media API JSR 172 Web Services API JSR 184 Mobile 3D Graphics API JSR 185 JTWI JSR 205 Wireless Messaging API JSR 226 Scalable 2D Vector Graphics API JSR 75 FileConnection and PIM API JSR 82 Bluetooth API Nokia UI API | EXPLICATIONS :
La base de la plateforme java pour développement mobile : - MIDP (Mobile Information Device Profile ) et - CLDC (Connected Limited Device Configuration)
Pour information, CLDC 1.0 ne permet de gérer que les nombres entiers. Pas les nombres flottants, contrairement à CLDC 1.1.
JSR : Java Specification Request JSR 75 : Package optionnel qui fournit des APIs utiles. Notamment pour l’accès au système de fichiers du mobile. | Nokia 3100 Technical Specs Operating System: Nokia OS Developer Platform: Series 40 Developer Platform 1.0 Java Technology: Nokia UI API MIDP 1.0 CLDC 1.0 JSR 120 Wireless Messaging API
| Tableau 1 Les logiciels J’ai donc commencé par installer tous les logiciels nécessaires (cf. Tableau 2). J’ai été ensuite très agréablement surpris de m’apercevoir qu’un matériel de formation, très bien fait, était à disposition de tous gratuitement : des tutoriaux indispensables disponibles sur le site d' EclipseME expliquent pas à pas comment construire ses premières applications mobiles. Logiciels nécessaires (Tous gratuits) : | Tableau 2 Figure 1 NOTE IMPORTANTE pour la suite de l'article : Le développement du plug-in Carbide.j que je présente dans les pages suivantes a été abandonné par Nokia. EclipseME est un projet Open Source qui propose les même fonctionnalitées et bénéficie d'une réactivité bien meilleure... L'environnement de développement L'IDE utilisé, Eclipse, propose un éditeur agréable avec le confort habituel des IDE : coloration syntaxique, complétion de code, assistants etc… Le " refactoring " (possibilité par exemple de renommer intelligemment une méthode, un attribut ou paramètre partout dans le code) est un plus agréable.
Le plug-in " Carbide.j " avec le " SDK S40 3rd Edition Feature Pack " permet de créer et régénérer un package application. Le sdk met à disposition un émulateur très proche du téléphone réel. Et chose très utile, il est possible d'utiliser le débuggeur d'Eclipse pour tracer le code de l'application qui s'exécute sur l'émulateur. Figure 1 bis Au commencement fût la MIDlet… Le début de tout développement mobile Java est de créer une MIDlet : une MIDlet est un programme java pour l'informatique embarquée, plus spécifiquement pour les machines virtuelles Java ME (Mobile édition - J2ME en abrégé). Une MIDlet doit se conformer au standard MIDP (Mobile Information Device Profile). MIDP est un ensemble d'APIs J2ME qui définit la façon dont les applications se connectent à l'interface des téléphones cellulaires.
La classe principale de l'application doit être une classe dérivée de la classe " javax.microedition.midlet.MIDlet ". Cette classe permet d'implémenter 3 méthodes : startApp, pauseApp et destroyApp qui seront appelées respectivement au démarrage, à la mise en pause, ou à l'arrêt de l'application. Les APIs disponibles pour le développement J2ME sont à rechercher dans le package javax.microedition. Ensuite la MIDlet doit être packagée dans un fichier " .jar ", ce que Carbide.j permet de faire aisément. L'affichage L'interface utilisateur étant réduite, même si plusieurs MIDlet sont en cours d'exécution à la fois, une seule affiche son écran. La hiérarchie de classe mise en place pour l'interface utilisateur est basée sur la classe Displayable (Voir figure 2). 2 classes abstraites dérivent de cette précédente : Screen et Canvas. Les classes concrètes dérivées de Screen fournissent une API de haut niveau afin de permettre l'affichage de fenêtres. Figure 2 Voici le code pour afficher une boite de dialogue : public class HelloWorldMIDlet extends MIDlet { public void ShowMessage(String aTitre, String aAlertText, AlertType aAlertType) { // Création de la boite de dialogue " Alert " Alert myAlert = new Alert(aTitre, aAlertText, null, aAlertType); // Affichage de la boite de dialogue Display.getDisplay(this).setCurrent(myAlert); } protected void startApp( ) { ShowMessage("Hello world","Hello world",AlertType.INFO); } protected void pauseApp( ) { } protected void destroyApp( boolean p1 ) { } } Les composants La classe Form permet de construire les écrans de l’application. Grâce au plug-in Carbide.j, un « Designer » de formulaire (Voir figure 3) permet de créer visuellement les écrans en déposant (depuis la palette) les composants sur le formulaire. Un inspecteur d’objet permet d’éditer les valeurs des propriétés. Figure 3 Voici les objets proposé dans la palette de composant : Composants
| Fonctionnalité | ChoiceGroup
| Sélectionner un ou plusieurs éléments de son choix.
| DateField
| Calendrier pour aider à la sélection de la date. Sélectionner une date. En fonction de l'interface utilisateur, peut proposer un | Gauge
| Gauge de progression. | ImageItem
| Insérer une image dans le formulaire. | StringItem
| Afficher du texte, des boutons, des liens hypertexte… | TextField
| Saisie de chaine de caractères, de nombres, décimaux etc… | Ticker
| Texte défilant. | Command
| Représente une opération utilisable depuis l'interface utilisateur. | Tableau 3 Le composant Command a pour particularité de proposer à l'utilisateur d'interagir avec l'application. Pour que la commande soit utilisable, le formulaire doit implémenter l'interface CommandListener. On retrouve typiquement la programmation événementielle… // Implémentation de l'interface CommandListener : public void commandAction(Command aCommand, Displayable aDisplayable) { if ( aCommand == commandOk ) ActionOk(); if ( aCommand == commandSauver ) ActionSauver(); // etc. } // Au préalable il faudra enregistrer ces commandes à l'initialisation de la form grace à ces instructions : this.addCommand(commandOk); this.addCommand(commandSauver); // Cette instruction défini l'interface comment listener d'événement this.setCommandListener(this); Figure 3 bis Le graphisme Des APIs de plus bas niveau sont aussi disponibles : la classe Canvas est à la base de tout nouveau graphisme à implémenter. Elle permet de représenter des données sous formes de diagrammes ou de créer des animations, voire même des jeux.
La méthode centrale de la classe Canvas à implémenter est la méthode paint(Graphics g). L’objet graphique passé en argument à cette méthode permet les opérations graphiques, comme le tracé de lignes, de cercles, l’affichage de texte, le remplissage par une couleur, etc. La classe Image complète ces APIs de bas niveau pour l’affichage. L’image devra être dans un format reconnu par le mobile. Le standard MIDP reconnaît en standard le format PNG. La persistance des données Il est possible de stocker les données de 2 manières : soit en utilisant le RMS (Record Management Store), soit en utilisant le système de fichiers. Dans le premier cas (RMS), le package javax.microedition.rms livré avec MIDP 2.0 donne accès à une sorte de mini base de données. Chaque MIDlet aura accès à ses données et uniquement à ses données. Aucune autre application ne peut y avoir accès. Les jeux notamment stockent les « high scores » avec ce système. L’autre solution est d’utiliser un système de fichiers classique. Pour cela, il faut que le téléphone portable supporte l’option « JSR 75 FileConnection ». L’avantage de cette solution est que les données soient ensuite récupérables sur votre PC. Un des objectifs de l’application que je voulais créer, était de pouvoir récupérer les données saisies sur PC, afin de pouvoir les retraiter via Excel par exemple…
Le chemin complet d’un fichier est de la forme « file:///c:/nokia/Images/Image001.jpg ». Le préfixe file:/// indique que l’on travaille sur un fichier, et «c:/» correspond à la mémoire interne. La carte mémoire correspond au lecteur «e:/ ». Ecrire un fichier, oui, mais dans quel dossier ? Il faut avoir la permission. La solution que j’ai choisi est d’utiliser le dossier photo de mon mobile afin d’y déposer mon fichier de données. Ce dossier est un dossier « public ».
Le code suivant permet de récupérer une connexion en lecture et écriture au fichier de données : // Récupére le dossier des photos String url = System.getProperty("fileconn.dir.photos"); // Rajoute le nom du fichier url = url + "NokiaEssence.txt"; // Récupére la connexion mainFileConnection = (FileConnection) Connector.open( url, Connector.READ_WRITE ); La classe FileConnection permet l'accès au système de fichier d'une manière générale : elle permet de lister, supprimer, obtenir des informations sur les fichiers, etc. L'accès au fichier s'effectue à l'aide des flux : InputStream en lecture et OutputStream en écriture. Voici un exemple de code pour créer le fichier :
public void WriteToFileString(String aStringToWrite) { // Crée le fichier mainFileConnection .create(); // Récupére le flux en écriture OutputStream os = mainFileConnection .openOutputStream(); // Ecrit dans le fichier os.write(aStringToWrite.getBytes()); // Vide le cache os.flush(); // Ferme le fichier os.close(); }
L'option JSR 75 ne se limite pas à l'accès au système de fichiers. Elle fournit une 2ème API nommée PIM (Personal Information Management). Cette API permet l'accès aux données personnelles (Contacts/Liste des numéros de téléphone, Agenda/Calendrier, Liste des choses à faire) depuis la mémoire interne du téléphone ou la carte SIM. Voici un petit exemple de code pour lister les contacts :
PIM pim = PIM.getInstance(); int i = 0; try { ContactList cl= (ContactList)pim.openPIMList(PIM.CONTACT_LIST, PIM.READ_ONLY ); Enumeration e=cl.items(); while(e.hasMoreElements() ) { // Récupère un contact Contact contact = (Contact)e.nextElement(); // Pour récupérer un N° de téléphone par exemple : // String tel= contact.getString( Contact.TEL, 0 ); i++; } System.out.println(i+" téléphones trouvés."); } catch(PIMException pime) { System.out.println("Aucun contact trouvé"); } catch(SecurityException se ) { System.out.println("L'application n'a pas la permission d'accéder à la liste"); } Multimédia API Si votre téléphone portable supporte la spécification JSR 135 Mobile Media API, vous pourrez gouter à la joie de piloter l'appareil photo ou caméra de votre mobile. 4 classes principales sont là pour utiliser l'API : Voir figure 4 - Manager
- Player
- Control
- Datasource
Figure 4 La classe Manager contient uniquement des méthodes statiques. La méthode Manager.createPlayer créé un player avec un DataSource associé pour lui fournir les données. La source de données peut être construite à partir d'un flux (InputStream) ou d'un " URI-style locator ". En voici quelques exemples : URI-style locator
| Source de données | file:///c:/nokia/Images/Image001.jpg
| Un simple fichier | http://adresseweb.com/fichier.wav
| Une adresse web | capture://image
| Capturer une photo depuis l'appareil photo | capture://video
| Capturer une vidéo | capture://audio
| Enregistrer du son | Tableau 4 Voici un exemple de code pour afficher la capture en temps réel de ce qui est visualisé par l'objectif de l'appareil photo. Le rendu est affiché directement sur la Form.
Form f = new Form("JPP Form"); // Crée la form principale Display.getDisplay(this).setCurrent(f); // Affiche la form Player p = Manager.createPlayer("capture://video"); p.realize(); // Initialise le player VideoControl vc = (VideoControl)p.getControl("VideoControl"); if (vc != null) { Item it = (Item) vc.initDisplayMode (VideoControl.USE_GUI_PRIMITIVE, null); f.append(it); // Rajoute l'item à la form. p.start(); // Affiche la vidéo dans l'item. }
La ligne de code suivante permet de prendre une photo : videoControl.getSnapshot("encoding=bmp");
Cette architecture très ouverte permet aussi d'afficher des vidéos au format 3gp, de jouer des sons très facilement, etc. La méthode getControl de la classe Player renvoie une interface abstraite que plusieurs classes concrètes implémentent. Suivant les cas, le transtypage vous permettra de manipuler tel ou tel type de contrôle. Voici quelques exemples de classes concrètes : - ToneControl
- VolumeControl
- VideoControl
- StopTimeControl
- RecordControl
Le développement de jeux Nokia fournit avec son sdk tout un ensemble de fonctionnalités pour la création de jeux. Un tutorial installé avec Carbide.j permet de créer votre premier jeu sur mobile en quelques clicks, tout en expliquant les bases. Carbide.j propose aussi un designer afin d'éditer vos propres cartes pour vos jeux 2D (Voir figure 5). Les nostalgiques se rappelleront le temps des sprites et défilement d'écrans. Figure 5 Mais le plus impressionnant reste les jeux 3D. L'option JSR 184 (M3G Mobile 3D Graphics API) propose tout le nécessaire en la matière. 3 classes sont la clé de voute de cette option : Graphics3D
| Contexte 3D graphique : effectue le rendu
| Loader
| Permet de charger les objets individuellement et les graphiques de la scène entière (Fichiers M3G et PNG)
| World
| Nœud racine de la scène. La scène est une arborescence d'objets
| Tableau 5 Nokia a pour l'instant une longueur d'avance en matière de jeux vidéo pour mobile. Le " smartphone " N-Gage (mi téléphone, mi console de jeu) en est un bel exemple. Mais Nokia ne se limite pas à la production de terminaux : la société a lancé un sdk nommé SNAP (Scalable Network Application Package). Il s'agit d'une solution " clé en main " pour fournir une infrastructure de services pour la communauté de jeux en ligne multi-joueurs.
SNAP permet d'établir une communication réseau entre le terminal et le serveur de jeu afin de rejoindre une communauté de jeu. Les fonctionnalités proposées sont l'authentification, la liste de contacts, l'échange de message en cours de jeu, la création d'événements et enfin le classement des joueurs. Ce sdk particulier est conçu pour fonctionner avec les standards MIDP 2.0 et CLDC 1.0
Communications / Web services Par définition, un téléphone est un objet communicant :, bien plus que vous ne pouvez l'imaginer : la variété des moyens de communication et des protocoles est impressionnante. Jugez-en par vous-même : Type de communication
| Url spécifique | Option
| Infrarouge | comm:<port> | MIDP | Web | http://<adress> | MIDP | Web sécurisé | https://<adress> | MIDP | Datagrams
| datagram://:<port> | MIDP | Socket
| socket://<port> | MIDP | Ssl
| ssl://<address> | MIDP | Sms
| sms:// | JSR 120 | Mms
| mms:// | JSR 205 | Bluethoot
| btspp://<server address> | JSR 82 | Tableau 6 Le package javax.microedition.io.Connector est le point d'entrée de l'utilisation de ces moyens de communication.
Reste un autre moyen de communication très populaire : les Web services. L'option JSR 172 permet de s'appuyer sur un serveur ou fournisseur de Web services déjà existant. Le but de ce package est de fournir un parsing XML, et une API standard pour accéder et consommer des Web services. Un des avantages de créer un Web service est de permettre à différents clients (application client riche, application web via un navigateur, ou application mobile) d'accéder au même service. Carbide.j facilite le travail en proposant un générateur de code afin d'accéder aux Web services. La logique " métier " est donc centralisée et réutilisable pour différents types de clients.
Une autre option, qui couplée avec les web services semble vraiment prometteuse est l'option JSR 179 (Géolocalisation). Aujourd'hui, cette option n'est pas encore très répandue. Elle fournit des informations comme le positionnement géographique (latitude, longitude et altitude), la vitesse du terminal mobile en déplacement, etc. Ces informations peuvent provenir de différentes sources : GPS, réseau cellulaire, ou pour des localisations de proximité Bluethoot positionning system par exemple. Cette option fournit aussi un ensemble de classes afin de se connecter à une base de données de " landmark ". Un landmark est une localisation physique connue qui est associée avec un nom représentant cette localisation.
Les mobiles sont aussi équipés de navigateur web. La norme actuelle pour le développement de pages web pour ces navigateurs est XHTML MP (Mobile Profile). XHTML est très proche du HTML que l'on connaît. Il suffit d'être un peu plus rigoureux sur quelques points comme dans la fermeture des balises… Cependant, il faudra adapter les pages à une taille d'écran à laquelle le web ne nous a pas habitués. Cela réduit forcément le nombre d'informations affichées simultanément…
Cependant beaucoup d'opérateurs font payer au prix fort l'accès à Internet via leur réseau. Mais à ne pas en douter, la demande croissante d'accès à Internet via ces terminaux sera forte. A quand verrons-nous la guerre commerciale chez les opérateurs mobiles pour nous proposer un accès Internet mobile illimité à un prix tout à fait compétitif ? L'exemple des " box " que nous connaissons aujourd'hui chez les opérateurs téléphoniques classiques pourrait donner quelques idées aux opérateurs mobiles… Test et débogage Après avoir installé Carbide.j et le sdk s40, rien n'est plus simple pour tracer votre code : Posez vos points d'arrêt, régénérez votre package, et vous pouvez tester votre application en cliquant sur le bouton debug. Eclipse basculera automatiquement en perspective de débogage (Voir image IDEDebug). Si vous créez plusieurs projets mobiles, vous aurez intérêt à créer différentes configurations (Voir image IDEDebugConfiguration). Coté test, un framework de test unitaire (J2MEUnit) basé sur le célèbre JUnit et adapté au monde mobile offre l'environnement nécessaire pour capitaliser ses tests ( http://j2meunit.sf.net ). Figure 5 bis Le déploiement Le transfert de l'application peut s'effectuer sur le téléphone de différentes manières. Les moyens les plus courants sont le câble usb, l'infrarouge ou le bluetooth. Par câble usb, un logiciel comme Nokia Pc Suite (qui propose parmi ses nombreuses fonctionnalités d'installer une application par simple copie du fichier .jar) sera nécessaire. L'envoie du fichier par infrarouge installe automatiquement l'application sans avoir besoin d'un logiciel tiers.
Un autre moyen très répandu pour installer et diffuser des MIDlet est d'utiliser la technique nommée OTA (Over The Air) : le distributeur de votre application installe la MIDlet sur un serveur web et fournit un lien hypertexte. L'utilisateur active ce lien sur le téléphone portable qui va déclencher le téléchargement de la MIDlet. Le lien pointera comme l'indique l'exemple vers le fichier .jad créé lors de la génération du package par Carbide.j. <A href="/sybaris/MaMIDlet.jad">Cliquez ici</A> pour installer l'application
L'un des gros avantages du langage java est sa portabilité. La portabilité signifie que le programme fonctionnera sur une grande quantité de plateformes différentes, sans nécessiter d'être recompilé. Même si on développe avec les outils fournit par Nokia, le fruit du développement peut tout à fait être utilisé sur d'autres marques de téléphones, sans recompilation. Il suffit que le téléphone supporte les spécifications qui ont été à la base du développement (MIDP, CLDC et JSR…) et le fichier .jar sera exécuté…
Sécurité L'accès aux fichiers via l'API JSR 75 n'est pas autorisé par défaut. En effet, on ne plaisante pas avec la sécurité sur téléphone portable : une MIDlet non signée se verra par défaut refuser l'accès au système de fichier (cf. Tableau 7). L'utilisateur pourra paramétrer cela, mais il devra quand même donner son autorisation (" Ask every time ") à chaque ouverture de fichiers. Pour que votre application puisse se passer de l'autorisation de l'utilisateur, elle devra être signée. Comment donner l'accès aux fichiers à une application non signée : (Voir figure 6)
- Dans la liste des applications, positionnez-vous sur NokiaEssence. Sélectionnez " Options ",
- Sélectionnez " App. access ",
- Sélectionnez " Data access ",
- Sélectionnez " Add and edit data ",
- Sélectionnez " Ask every time ",
- Un message vous confirme votre choix.
Pour information dans l'écran n°5, les options (" Ask first time only " et " Always allowed " se dégrisent uniquement si l'application est signée) | Tableau 7 Figure 6 De plus il faudra donner les permissions suivantes à la MIDlet : javax.microedition.io.Connector.file.read javax.microedition.io.Connector.file.write Cela se paramètre lors de la génération du package avec Carbide.j Signature des applications Signer une application consiste à envoyer des clés générés depuis Carbide.j à une autorité de certification. Après avoir décliné votre identité et donné quelques éléments d'identification personnelle, cette autorité vous renverra un certificat numérique qu'il faudra importer grâce au plug-in Carbide.j. L'autorité de certification vous facturera cela. Comptez environ 199$ pour 1 an. En effet, les certificats ont une durée de validité. De plus votre téléphone doit aussi posséder un " certificat d'autorité " de l'autorité qui vous aura délivré le certificat.
Mon choix a donc été de ne pas signer mon application (question de coût), et de laisser l'utilisateur autoriser l'application à accéder aux fichiers. Cependant, à chaque ouverture de fichiers, cette autorisation est demandée à l'utilisateur. Cela m'a contraint à stocker toutes mes données dans un unique fichier afin qu'une seule autorisation soit demandée durant l'exécution de l'application.
Bilan & difficultés rencontrées L'utilisateur doit confirmer à chaque lancement l'autorisation d'accès au système de fichiers. Ce coté restrictif de la sécurité a été une contrainte.
Une incompatibilité entre Eclipse 3.2 et Carbide.j 1.5, m'a empêché d'utiliser le débuggeur d'Eclipse. La solution a été de basculer sur Eclipse 3.1.
Le codage a été assez rapide, et les forums de discussion Nokia ( http://www.forum.nokia.com ) permettent de poser les questions bloquantes. Ces mêmes forums constituent aussi une base de connaissance très utile.
Le résultat de mon développement est visible sur les captures d'écrans (Voir figure 7). Les sources, l'application, la documentation utilisateur sont disponibles sur le cdrom ou sur le site http://jp.planas.free.fr/nokiaessence où vous retrouverez les mises à jour. Figure 7 Conclusion Dans un environnement où l'ordinateur n'est pas toujours présent, il est envisageable de se tourner vers ce genre d'application à moindre coût. L'interface d'entrée privilégie essentiellement la saisie numérique. C'est ainsi que l'adaptation à ce type de plateforme nécessite de repenser la manière d'appréhender les applications : il peut parfois être plus pratique de substituer la saisie par la prise d'une photo qui servira d'identifiant, quitte à compléter les informations ultérieurement sur ordinateur.
En conclusion, les outils (IDE, sdk, plug-ins, outils de design, etc.…), les normes, le matériel de formation, les documentations sont là . Nokia propose de manière claire et efficace tout le nécessaire pour vous lancer sur le sujet. Ce type de développement est beaucoup plus simple qu'il n'y parait. Les projets sont de petite taille, donc rapide à réaliser. Les possibilités sont vastes. Pourquoi ne pas vous lancer dans la création d'une petite application pour mobile ? C'est fun, ludique et rapide.
A vous de trouver la bonne idée…
|