Cookbook Développement Android 4

Dimension: px
Commencer à balayer dès la page:

Download "Cookbook Développement Android 4"

Transcription

1 Cookbook Développement Android 4 60 recettes de pros Damien Gosset Fabrice Impérial Marc Pybourdin Nicolas Zinovieff

2 Maquette de couverture : Ici et ailleurs Illustration de couverture : Vlastimil Šesták-Fotolia.com Maquette intérieure : Belle page Dunod, Paris, 2013 ISBN

3 À propos de la collection Cookbook Informatique et cuisine L informatique, c est parfois un peu comme la cuisine : il faut assembler un certain nombre d ingrédients et d actions selon un enchaînement très précis. C est pourquoi quand un nouvel «ingrédient» apparaît, plutôt que de tâtonner seul dans son coin et risquer de rater son plat, il est beaucoup plus efficace de se référer à une recette rédigée par ceux qui ont déjà rencontré le problème et optimisé la solution. On peut ainsi travailler plus sereinement et adapter ensuite la recette à ses préférences. Pour les développeurs aussi, rien ne vaut un bon conseil et une solution éprouvée pour gagner du temps et écrire du code propre et efficace. C est le principe de la collection Cookbook : rassembler dans un seul ouvrage un certain nombre de «recettes» qui fournissent des réponses concrètes à des problèmes précis. Comment ça marche, ces recettes? Chaque titre de la collection comporte plusieurs dizaines de recettes qui sont regroupées par thème (les chapitres) mais qui sont indépendantes les unes des autres pour pouvoir être consultées et utilisées de façon ponctuelle. Les titres des recettes ont été rédigés de façon claire pour vous aider à trouver rapidement celle qui correspond à votre problème du moment. Si le titre n est pas suffisamment explicite, un index détaillé en fin d ouvrage vous aidera à aller directement au bon endroit grâce aux mots-clés. Toutes les recettes sont structurées en trois parties : Ce qu il faut savoir : cette première partie rappelle le contexte et les connaissances de base relatives à cette question. V

4 Ce qu il faut faire : c est le cœur de la recette qui fournit des explications précises et «prêtes à l emploi». Ce qu il ne faut pas faire : plus originale, cette dernière partie met en garde contre les erreurs les plus courantes et les impasses tentantes. Des retours d expérience fort utiles pour éviter les pièges À qui s adressent ces cookbooks? Aux développeurs bien sûr, aux testeurs, aux chefs de projet, aux étudiants et élèves ingénieurs et d une manière plus large à tous ceux qui développent des applis pour le travail ou pour le plaisir. Les compléments en ligne Des ressources complémentaires (code à télécharger ) ou de nouvelles recettes peuvent être téléchargées gratuitement sur le site Dunod, sur la page dédiée à l ouvrage, en suivant le QR code imprimé en couverture ou en utilisant l URL : www://dunod.com/contenus complémentaire/ Partager le savoir En règle générale les recettes sont faites pour être partagées, transmises et améliorées. Si vous avez des suggestions ou des recettes nouvelles à proposer n hésitez pas à nous en faire part à l adresse [email protected]. Après validation, nous les intégrerons aux compléments en ligne, voire à la prochaine édition de la version papier. Merci d avance. L éditeur VI

5 Sommaire Avant- propos Pre mière par tie : Fon Da men taux des appli ca tions 03 Chapitre 1 : Stockage et res ti tution des données Recette n 01 A ccéder à des données en local sur le périphérique...03 Recette n 02 Sto ckage dans les Préférences de l appli ca tion...05 Recette n 03 Sto ckage Internal et External...06 Recette n 04 Par ta ger les fichiers de son appli ca tion...10 Chapitre 2 : Navi ga tion dans une appli ca tion Recette n 05 Faire commu ni quer les fenêtres et le code d une appli ca tion...15 Recette n 06 Défi nir plu sieurs fenêtres dans notre appli ca tion...18 Recette n 07 Comment navi guer entre les fenêtres?...19 Recette n 08 Navi ga tion Trans ver sale / Onglets...22 Recette n 09 Pas sage d infor ma tion d une fenêtre à une autre...26 Chapitre 3 : Loca li sa tion des appli ca tions Recette n 10 Comprendre la mécanique de sélec tion de la langue uti li sée...29 Recette n 11 Loca li sa tion de texte à l aide de res sources...31 Recette n 12 Loca li sa tion de texte à l aide des Bundles...34 Recette n 13 Loca li ser des images...35 DEUXIème par tie : Accé Der aux compo sants phy siques de l appa reil 39 Chapitre 4 : Uti li ser les cap teurs de l appa reil Recette n 14 Utiliser l accé lé ro mètre...39 Recette n 15 Détecter un mou ve ment...42 Chapitre 5 : La géo locali sa tion Recette n 16 Obte nir notre position géolocalisée...47 Recette n 17 Affi cher la posi tion sur une carte...49 VII

6 Recette n 18 Cal cu ler la dis tance entre deux points...51 Recette n 19 Affi cher des points d inté rêt à proxi mité...54 Troi sième par tie : Inter agir avec les appli ca tions du sys tème 57 Chapitre 6 : Inter agir avec les photos Recette n 20 Accé der à la biblio thèque de photos...58 Recette n 21 Uti li ser la caméra...59 Recette n 22 Contrô ler le flash de la caméra...62 Recette n 23 Inté grer la librai rie Zbar dans un pro jet Android...63 Recette n 24 Trai ter les infor ma tions ren voyées par Zbar pour la reconnais sance des sym boles...67 Chapitre 7 : Mails, SMS et calen driers Recette n 25 Envoyer un mail depuis une appli ca tion...73 Recette n 26 Ajou ter des élé ments à un mail...76 Recette n 27 Envoyer des SMS/MMS depuis une appli ca tion...78 Recette n 28 Ajou ter un événement dans un calen drier...80 Recette n 29 Ajou ter une alarme dans un calen drier...83 Recette n 30 Accé der au car net d adresses...85 Chapitre 8 : Uti li ser les noti fi cations du sys tème Recette n 31 Uti li ser les notifications locales...87 Recette n 32 Uti li ser les notifications système...89 Recette n 33 Noti fi cations push avec le GCM...91 Chapitre 9 : Inté gra tion de publi cité Recette n 34 Créer un compte AdMob Recette n 35 Intégrer le SDK AdMob dans un pro jet Recette n 36 Gérer les publi ci tés Qua trième par tie : Inter agir avec des ser Vices à dis tance 109 Chapitre 10 : Commu ni ca tions syn chrones et asyn chrones Recette n 37 Recupérer des don nées simples Recette n 38 Récupérer des données de manière asyn chrone Recette n 39 Envoyer des requêtes spé ci fiques au ser veur VIII

7 Dunod Toute reproduction non autorisée est un délit. Recette n 40 Trai ter des don nées JSON Recette n 41 Géné ra li sa tion aux sockets Chapitre 11 : Inté gra tion d élé ments vidéo Recette n 42 Télécharger une vidéo et la sto cker sur le péri phérique Recette n 43 Lire une vidéo Recette n 44 Lire une vidéo depuis YouTube Chapitre 12 : Réseaux sociaux Recette n 45 Connexion aux différentes API Recette n 46 Uti li ser les API de Twitter Recette n 47 Commu ni quer sur Twitter Recette n 48 Récu pé rer une timeline de Twitter Chapitre 13 : Amazon Web Ser vices Recette n 49 Uti li ser Awazon Web Ser vices S Recette n 50 Gérer des buckets avec Amazon S Recette n 51 Ges tion des fichiers Recette n 52 Sto cker des don nées avec SimpleDB Chapitre 14 : Windows Azure Mobile Ser vices Recette n 53 Pré pa rer son pro jet pour Azure Recette n 54 Créer un nou veau ser vice mobile Recette n 55 Ajou ter une table pour le sto ckage Recette n 56 Accé der aux don nées Azure Chapitre 15 : Sto ckage de fichiers dans le Cloud Recette n 57 Connexion à Dropbox depuis une appli ca tion Recette n 58 Uti li ser Google Drive dans vos appli ca tions Recette n 59 Récu pé rer une copie d un fichier sur Google Drive Recette n 60 Uploader un fichier sur Google Drive Annexes Comprendre le mécanisme des Web Services Les Services de type REST L'approche WSDL / SOAP Exemple : le système de bookmarking Exemple d'échanges client/serveur IX

8 Ressources numériques En complément de cet ouvrage, vous trouverez sur le site Dunod, à l'adresse suivante : 1. Les sources des recettes traitées dans cet ouvrage ; 2. Une série de liens utiles vers des ressources Android. Avertissement pour le lecteur Nous avons incorporé à cet ouvrage de nombreux exemples de code directement réutilisables pour vos projets. Dans les recettes de l'ouvrage, ce code est commenté. La mise en page nous a imposé certains retours à la ligne. En cas de doute, n'hésitez pas à consulter les ressources numériques en ligne.

9 Avant- propos Ces der nières années, les usages du numé rique ont été révo lu tion nés avec l arri vée de sys tèmes inté grant des capa ci tés de commu ni ca tion avan cées dans la plu part des péri phériques. Aujourd hui, qu il s agisse de télé vi seurs, de télé phones et même de réfri gé ra teurs, on est qua si ment sûr de trou ver une ver sion embar quant un sys tème d exploi ta tion per met tant d uti li ser des appli ca tions. C est autour de ce concept que le sys tème Android est arrivé depuis près de 10 ans. Au départ au sein d une start-up, puis rapi de ment racheté par Google, pour pro po ser un sys tème ouvert, adap table et personnalisable par n importe quel construc teur dési rant l inté grer dans ses pro duits. Android est aujourd hui devenu un sys tème mature et une réelle alter na tive à ce que peuvent pro po ser Apple, Microsoft et les construc teurs his to riques de smartphones. La phi lo sophie autour d Android rap pelle beau coup celle des envi ron ne ments GNU/Linux et son modèle commu nau taire qui a per mis de nom breuses avan - cées dans l infor ma tique. Cepen dant, Android s est vu complété par de nom - breuses sur couches inté grées par les construc teurs, soit pour ajou ter des fonc tion na li tés dédiées à leurs appa reils, soit pour faire évo luer l expé rience uti li sa teur. Ainsi, Android, dans la lignée de son lan gage prin ci pal qu est le Java, est un sys tème qui mise sur l interopérabilité et la portabilité du code. Cepen dant, il faut (comme c est le cas avec Java) tenir compte de l ensemble des spé ci fici - tés liées aux dif fé rents péri phériques où le pro gramme pourra être exé cuté. Le déve lop pe ment sous Android sup pose alors de prendre en compte un grand nombre de para mètres pour garan tir le bon fonc tion ne ment et le suc cès d une appli ca tion. En effet, le déve lop peur ne con naît pas néces sai re ment le type d appa reil sur lequel sera exécuté son pro gramme, ni les fonc tion na li tés ou les pro grammes embar qués par ce der nier. Dès lors, une atten tion toute par ti cu lière devra être por tée à ces aspects pour garan tir la meilleure expé - rience uti li sa teur pos sible. 1

10 L objec tif de cet ouvrage est de four nir à ses lec teurs un ensemble de recettes «prêtes à l emploi» por tant sur des pro blé ma tiques récur rentes ren - contrées par les déve lop peurs. Nous avons sou haité pro po ser une approche pui sée dans nos expé riences pro fes sion nelles res pec tives et vous per mettre ainsi de les adap ter pour gagner du temps dans vos déve lop pe ments quo ti - diens. L ouvrage est ainsi struc turé en grandes thé ma tiques, cha cune por tant sur un aspect métier bien pré cis, qu il s agisse de l uti li sation des compo sants, des péri phériques, de l uti li sation de ser vice de Cloud, etc. L inté gra lité du code a été réa lisé pour les envi ron ne ments Android 4 et sui vant. À l heure actuelle, cette ver sion est la plus uti li sée sur l ensemble du parc Android et sur tout sur la majo rité des péri phériques des uti li sa teurs consom ma teurs d appli ca tions. Pour déve lop per sur Android, de nom breux outils existent, et chaque développeur est libre de choi sir les siens. Pour notre part, nous avons uti lisé, tout au long de cet ouvrage, Éclipse ainsi que Android Stu dio. Nous avons éga le ment sou haité agré men ter nos recettes de dif fé rents retours d expé rience dans les par ties «Ce qu il ne faut pas faire». Ces par ties comportent à la fois des exemples d erreurs à ne pas repro duire mais éga le - ment et sur tout un rap pel sur des oublis à éviter pour opti mi ser votre tra vail. Pour complé ter ces recettes, vous retrou verez sur un espace en ligne dédié à l'ouvrage où nous vous pro po sons cer taines mises à jour, quelques ajouts et dif fé rentes recettes sup plé men taires. Remer ciements Damien Gosset remercie chaleureusement sa famille ainsi que son équipe pour leur compréhension et leur enthousiasme motivant pendant la rédaction de cet ouvrage. Fabrice Impérial souhaite remercier ses parents ainsi que ses grands-parents pour leur soutien. Marc Pybourdin remercie affectueusement Aude et Nathan pour leur patience, leur compréhension et leur soutien. 2

11 Première partie Fon Da men taux des appli ca tions Stockage et res ti tution des données Chapitre 1 Recette N 01 a ccéder à des données en local sur le périphérique Ce qu il faut savoir La visua li sa tion des don nées pré sup pose que l on ait évi dem ment des don - nées à affi cher. Ces don nées peuvent être sto ckées à dis tance ou en local, l objec tif étant à chaque fois de garan tir un accès rapide et fiable à ces der - nières pour les pré sen ter à l uti li sa teur. À la dif fé rence d autres envi ron ne ments, Android est un sys tème dit «ouvert» : si l on con naît le che min d un fichier et que l on a les droits appro - priés, il est pos sible d y accé der, en lec ture comme en écri ture. Android four nit par ailleurs un moyen d expo ser les don nées de son appli - ca tion via un «content provider». Ce compo sant per met un accès en lec ture/ écri ture aux fichiers de votre appli ca tion.

12 Ce qu il faut faire Pour obte nir l URL du réper toire où sont géné ra le ment sto ckées les images, nous uti li se rons la méthode ci- dessous qui nous retourne l URL du réper toire concerné. File dir = getdir(environment.directory_pictures, Context.MODE_ PRIVATE); Ce qu il ne faut pas faire Le sto ckage de don nées en local pri vi lé gie la dis po ni bi lité, compte tenu que les don nées de l appli ca tion sont direc te ment acces sibles sur le péri phérique, ce qui garantit une rapi dité d accès. Cepen dant, se pose la ques tion de l exac ti tude de ces der nières et ce, encore plus, lorsque les don nées sont uti li sées par plu sieurs uti li sa teurs et qu un réfé ren tiel existe et est sto cké à dis tance. Le SDK nous four nit éga le ment d autres options de sto ckage per met tant d évi ter les pro blèmes de per mis sions ou d opti mi sations : Le sto ckage dans les pré fé rences (petit volume, si pos sible), Le sto ckage dans les don nées «pri vées» de l appli ca tion (acces sibles en théo rie à l appli ca tion elle- même seule ment, et effa cées lors de la désinstallation de l appli ca tion). On appelle ces trois formes de sto ckage External, Preferences et Internal. Les deux pre miers ne néces sitent aucune per mis sion par ti cu lière, le der nier, lui, a besoin des per mis sions android.per mis sion.read_ EXTERNAL_STORAGE ou android.per mis sion.write_external_ STORAGE. Android pro pose éga le ment un sto ckage dans une base de don nées SQLite ainsi qu au tra vers du réseau. Le choix de la solu tion de sto ckage est à faire selon trois cri tères, que les dif fé rentes méthodes de sto ckage vont plus ou moins favo ri ser : Eexac ti tude : la don née doit être la plus récente et la plus per ti nente pos sible, 4

13 Dis po ni bi lité : la don née doit être acces sible lorsque l on en a besoin et ce, quelque soit le contexte d uti li sation (absence de réseau par exemple), rapi dité : la don née doit prendre un temps aussi réduit que pos sible pour être récu pérée. Recette N 02 Sto ckage dans les Préférences de l appli ca tion Ce qu il faut savoir Le sto ckage dans les Préférences fonc tionne sur le modèle d une table clefs/ valeurs, et en mode tran sac tion nel. Par ailleurs, il ne sera pas néces saire de se poser la ques tion du sto ckage en lui- même, étant donné que le sys tème le gérera pour nous. Ce qu il faut faire Dunod Toute reproduction non autorisée est un délit. Sup po sons une appli ca tion qui a besoin d accé der à deux variables : Le nom de l uti li sa teur, S il sou haite être en mode silen cieux. Le code per met tant de réa li ser cela sera : // Récupérer l objet préférences (PREFS_NAME détermine le nom // de la table) SharedPreferences settings = getsharedpreferences(prefs_name, 0); // Récupérer l une des valeurs de la liste des préférences boolean silent = settings.getboolean( silentmode, false); // Récupérer une autre valeur String displayname = settings.getstring( display, System. getproperty( user.name )); 5

14 Note : Dans notre exemple, la valeur sys tème «user.name» sera pro ba ble - ment vide sur un appa reil Android, mais est inté res sante en tant qu exemple d accès aux pro prié tés glo bales de l appa reil. Pour écrire dans les pré fé rences, il faut fonc tion ner en mode tran sac tion nel, à savoir que l on fait les modi fi ca tions dans un «contexte» (editor en anglais), et que les modi fi ca tions ne seront prises en compte qu une fois qu elles auront été vali dées (commit en anglais). // On crée un contexte d édi tion SharedPreferences.Editor editor = settings.edit(); // On ren seigne les valeurs editor.putboolean( silentmode, true); editor.putstring( display, Android dev ); // On valide les modi fi ca tions editor.commit(); Ce qu il ne faut pas faire Le deuxième para mètre des fonc tions get* de Préférences sert à indi quer la valeur par défaut. Par ailleurs la méthode System.getProperty per met d accé der à cer taines pré fé rences sys tème. Atten tion l accès à ces der nières n est pas géné ra lisé et se fait bien sou vent selon des méthodes spé ci fiques à cha cune pour des rai sons de sécu rité. Recette N 03 Sto ckage Internal et External Ce qu il faut savoir Le stockage dans les données et donc Internal ou External fonc tionnent sur le sys tème plus tra di tion nel de java.io et l uti li sation des classes File et File*Stream. File est une abs trac tion du sys tème de fichier au niveau de la machine vir tuelle Java : on peut par cou rir l arbo res cence, accé der et modi fier les pro prié tés des fichiers et dos siers, les copier ou dépla cer, etc. 6

15 File*Stream sont des accesseurs sur le contenu des fichiers. Note : Le but de l opé ra tion est d igno rer la dis po si tion phy sique des élé ments dans le sys tème ainsi que le type de sto ckage qui est uti lisé. L ensemble de l arbo res cence est ainsi trans posé dans un arbre d objets Java que la machine vir tuelle main tient pen dant l exé cu tion des appli ca tions. Dans le cas du sto ckage interne, les classes sys tèmes nous donnent direc - te ment accès au contenu des fichiers au tra vers de *Stream et donc la pos - si bi lité d écrire ou de lire du texte, des objets java, etc. Ce qu il faut faire Sup po sons une appli ca tion qui a besoin d accé der à un fichier «test» : FileOutputStream fos = openfileoutput("test", Context.MODE_ PRIVATE); FileInputStream fis = openfileinput("test"); Dunod Toute reproduction non autorisée est un délit. Si le fichier n existe pas, il sera alors créé. Les dif fé rents modes de créa tion sont : MODE_PRIVATE : on crée le fichier, et il n est acces sible que par l appli - ca tion elle- même, MODE_APPEND : on ajoute au fichier déjà créé s il existe, on le crée sinon, MODE_WORLD_READABLE : le fichier créé sera lisible par tout le monde, MODE_WORLD_WRITABLE : le fichier créé sera acces sible en écri ture à tout le monde. Dans le cas du sto ckage External, il faut d abord construire le File cor res - pon dant pour accé der au *Stream. Conseil : Il est éga le ment pos sible d accé der direc te ment au Stream en fai sant : new FileInputStream(che min); Atten tion, cela n est pas recom mandé car il n y a aucune garan tie sur le for - mat du che min de l appa reil cible. Le fait de construire le File avant per met de récu pé rer la racine et les sépa ra teurs. 7

16 En External, on a accès à l inté gra lité des API fichiers de Java. Étant donné le sys tème de permissions, on navigue dans l arbo res cence et on peut créer, effa cer, modi fier des fichiers dont on con naît le che min. La racine du dos sier «uti li sa teur» dans lequel on a tous les droits est don - née par la classe Environment. Sup po sons que l on sou haite accé der au fichier «test» dans la zone par ta - gée par toutes les appli ca tions : // On récu père le poin teur sur un fichier à la racine du // sto ckage par tagé par les difé rentes appli ca tions File tmpfile = new File(Environment. getexternalstoragedirectory() + File.separator + test ); // On tente de le créer if(tmpfile.createnewfile()) System.out.println( Created File ); else if(tmpfile.exists()) System.out.println( File already exists ); else System.out.println( File does not exist AND cannot be created. ); // On initialise les stream input et output FileInputStream fis = null; FileOutputStream fos = null; // On ini tia lise les stream par rap port aux per mis sions du fichier if(tmpfile.canread()) fis = new FileInputStream(tmpFile); if(tmpfile.canwrite()) fos = new FileOutputStream(tmpFile); Une fois les File*Stream créés, on fonctionne en mode Java stan dard. On peut créer un Buffered*Stream pour lire/écrire des chaînes de carac tères : // Écri ture des chaînes OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); bw.write( test string\n ); 8

17 // Lec ture des lignes (retour nera des chaînes sans retour // cha riot/saut de ligne) InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); String test = br.readline(); Il est éga le ment pos sible d uti li ser des objets Java : // Test est un objet quel conque qui implé mente l inter face // Serializable ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeobject(test); // testobj devra être casté dans le bon type ObjectInputStream ois = new ObjectInputStream(fis); Object testobj = ois.readobject(); Ou enfin de gérer direc te ment les octets : // Attention de bien véri fier la taille de tableau et le nombre // d octets réellement lu byte filecontents [] = new byte[256]; int readbytes = fis.read(filecontents); // Basique mais effi cace byte strbytes [] = Super phrase de la mort à écrire. getbytes(); fos.write(strbytes); Dunod Toute reproduction non autorisée est un délit. Ce qu il ne faut pas faire Atten tion, la plu part des *Stream sont bufferisés. Leur contenu ne sera écrit sur disque que lors qu une cer taine taille en mémoire est atteinte, ou lors de la des truc tion de l objet (après être sorti de la fonc tion depuis un cer tain temps, ou si une autre tentative d accès au fichier a lieu). Pour for cer l écri ture, il est pos sible d uti li ser fos.flush(). De la même manière, si vous êtes cer tain de ne plus avoir besoin du flux, fos.close() fera un flush, puis fer mera le fichier. La libé ra tion auto ma tique de l objet fera un close(). 9

18 Recette N 04 Par ta ger les fichiers de son appli ca tion Ce qu il faut savoir Le par tage des fichiers est effec tué via un «content provider» qui va être uti - lisé pour gérer les accès aux don nées selon une approche type client/ser veur. L accès aux don nées se fera au tra vers d un objet de type ContentResolver qui va, côté client, commu ni quer avec un objet de type ContentProvider côté ser veur. Note : L approche modu laire des applications Android fait qu il est pos sible de par ta ger une par tie de son appli ca tion, qu il s agisse de fenêtres (Activities) ou de don nées via les Content provider. Cepen dant, il s agit bien ici d une méthode per met tant de par ta ger des don - nées entre dif fé rentes appli ca tions, mais il n est pas ques tion ici de publier les don nées à des ti nation d applications lambda qui ne con naîtraient pas la struc ture des don nées telles que celles publiées par notre content provider. Ce qu il faut faire La pre mière étape pour décla rer un content provider est de le décla rer dans notre Manifest et de sur char ger les méthodes de la classe Content Provider : <provider android:authorities="com.ex ample.android. contentprovider" android:name="myappprovider" /> On sur charge ensuite les méthodes de la classe ContentProvider dont va héri ter MyAppProvider. 10

19 oncreate(); delete(uri, String, String[]); gettype(uri); insert(uri, ContentValues); query(uri, String[], String, String[], String); update(uri, ContentValues, String, String[]); Sup po sons que nous sou hai tons par ta ger des don nées depuis notre appli - ca tion. Nous sto ckons les don nées dans une base SQLite, gérée par mdatabase et Helper. Pour le besoin de cet exemple, nous ne pré ci se rons pas le schéma SQL mais il doit être connu à la fois de notre appli ca tion cou rante et des appli ca tions qui utiliseront notre ContentProvider. Nous allons ensuite défi nir notre class MyAppProvider de la manière sui vante : Dunod Toute reproduction non autorisée est un délit. /** MyAppProvider * classe d exemple pour four nir un provider dans l ensemble de l appareil */ public class MyAppProvider ex tends ContentProvider /// la base utilisée pour stocker l info DatabaseHelper mdatabase; private static final int RECORDS = 1; /// id interne public static final Uri CONTENT_URI = Uri parse("content://"+authority+"my service"); /// racine du provider public static final String AUTHORITY = "com.myapp. contentprovider"; /// enre gis tre ment des Uri pour le provider private static final UriMatcher mat cher = new UriMatcher( UriMatcher.NO_MATCH); static mat cher.adduri(authority, "records", RECORDS); 11

20 Dans le code ci- dessus, nous avons indi qué que notre provider va répondre aux requêtes envoyées à : content://com.myapp.contentprovider/my service/ Une des requêtes pos sibles va se faire sur : content://com.myapp.contentprovider/my service/records Nous allons ensuite sur char ger les dif fé rentes méthodes de la classe ContentProvider de manière à ce que les requêtes effec tuées ren voient les bonnes valeurs. /// Les méthodes de la classe Provider à sur char ger /// Dans notre exemple, la suppression n est pas public int delete(uri uri, String selection, String[] selectionargs) return 0; /// aucun élé ment affecté /// Cette méthode définit le type de ren voi effec tué sur le // public String gettype(uri uri) int matchtype = mat cher.match(uri); switch (matchtype) case RECORDS: /// le seul type que l on gère return ContentResolver.CURSOR_DIR_BASE_TYPE + "/ records"; default: throw new IllegalArgumentException("URI inva lide : " + uri); 12

21 /// Dans notre exemple sup po sons que l on auto rise l ajout // d public Uri in sert(uri uri, ContentValues values) long id = mdatabase.getwritabledatabase().in sert(helper. TABLE_NAME, null, values); /// le Helper est chargé de faire la véritable insertion uri = Uri.withAppendedPath(uri, "/" + id); return uri; /// La créa tion se fait dans notre public boolean oncreate() return true; /// Nous avons ici la méthode cen trale per met tant les // recherches /// Pour plus d infos sur ces para mètres, lire // la documentation, /// mais pour faire simple, la projection correspond aux // colonnes sélectionnées /// et la selection au public Cursor query(uri uri, String[] pro jec tion, String selection, String[] selectionargs, String sortorder) Dunod Toute reproduction non autorisée est un délit. SQLiteQueryBuilder qbuilder = new SQLiteQueryBuilder(); qbuilder.settables(helper.table_name); int uritype = mat cher.match(uri); Cursor resultcursor = qbuilder.query(mdatabase. getwritabledatabase(), pro jec tion, selection, selectionargs, null, null, sortorder, null); resultcursor.setnotificationuri(getcontext(). getcontentresolver(), uri); return resultcursor; 13

22 /// Mise à jour du contenu non auto ri sée public int update(uri uri, ContentValues values, String selection, String[] selectionargs) return 0; /// aucun élé ment affecté Ce qu il ne faut pas faire Le par tage de fichiers est par ti cu liè re ment utile mais atten tion cepen dant à ne pas par ta ger trop de fichiers, ce qui pour rait expo ser l appli ca tion à des pro blèmes de sécu rité ou de co hérence des don nées. 14

23 Navi ga tion dans une appli ca tion Chapitre 2 Les péri phériques mobiles ont tous un point commun : ils ne sont pour l ins tant capables d affi cher qu une seule fenêtre à la fois sur l écran. Ainsi, la navi ga tion au sein d une appli ca tion dif fère de celle des appli ca tions clas siques. Une des par ti cu la ri tés des uti li sa teurs de mobile est qu ils appré cient la sim pli cité de l inter face quelle que soit la complexité du code et des fonc tion - na li tés. Cette sim pli cité est très for te ment recom man dée, compte tenu de la taille des écrans et de la rela tive pau vreté des péri phériques d inter ac tion. Nous allons voir dans ce cha pitre comment sont codées ces fenêtres et la façon dont elles interagissent entre elles. Recette N 05 Faire commu ni quer les fenêtres et le code d une appli ca tion Ce qu il faut savoir Pour décrire une vue de manière très simple, nous pou vons dire que ce sont les éléments qui sont affi chés à l écran. 15

24 Elles sont compo sées de plu sieurs élé ments comme des images, des bou tons qui sont d ailleurs consi dé rés comme des vues à part entière par le sys tème. Android fonc tionne avec des Activities et des Fragments. On peut sim - pli fier le rai son ne ment en se disant qu une Activity est une fenêtre et un Fragment est une sous- fenêtre (dans une même Activity). Par exemple, si vous avez une fenêtre avec des onglets, chaque vue cor res pon dant à un onglet est un Fragment, alors que la vue conte nant la barre de bas cu le ment est une Activity. La dif fé rence en termes de fonc tion ne ment est liée à la vie de l appli ca tion et au sys tème. Syn taxi que ment et conceptuellement, ces deux grands types de vues res tent très simi laires. Toute la méca nique de vues repose sur le concept des Intents. Par exemple, lan cer une appli ca tion revient à lan cer l Activity de type LAUNCHER de votre appli ca tion. C est celle- ci qui char gera tous les Fragments cor res pon - dant au pre mier écran de l appli ca tion. Par la suite, chan ger de fenêtre cor res pond à ouvrir l Activity cor res - pon dant à un Intent donné, et à lui pas ser d éven tuels para mètres d usage. Spé cia lité d Android, n importe quelle appli ca tion peut «lan cer» n importe quelle Activity de n importe quelle autre appli ca tion, à par tir du moment où l Intent est cor rec te ment for mulé et où elle est «publique». Plus concrè te ment, les Activities et les Fragments ont une exis tence sous forme de duo layout- classe (pour mettre en regard l inter face gra - phique et le code asso cié), et les Activities sont en plus décla rées dans le Manifest de l appli ca tion. Ce qu il faut faire Les élé ments gra phiques sont défi nis dans les fichiers XML pré sents dans les layouts. Cha cun d entre eux est défini selon ses attri buts (taille et posi tion, style pour les textes, images pour les vues cor res pon dantes, etc.). L attri but per met tant au code de modi fier tout ou par tie des pro prié tés des vues est l id. Sup po sons que l on ait un champ texte dans une vue, défini dans le xml de la façon sui vante : 16

25 <TextView android:layout_width= wrap_content android:layout_height= wrap_content or/c1textbg android:clickable= false men/interspacing men/interspacing men/interspacing or/white android:textisselectable= false /> Au char ge ment du layout, nous avons deux options : nous sommes dans une Activity ou alors dans un Fragment. Dès lors, dans la méthode oncreate, nous avons deux variantes : protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); Dunod Toute reproduction non autorisée est un délit. TextView textlbl = (TextView) findviewbyid(r.id. n1v1t); //... Frag public View oncreateview(layoutinflater inflater, ViewGroup contai ner, Bundle savedinstancestate) View rootview = inflater.inflate(r.layout.frag ment, contai ner, false); TextView textlbl = (TextView) findviewbyid(r.id. n1v1t); //... 17

26 Ce qu il ne faut pas faire Bien qu il soit ten tant de défi nir un nou veau style visuel pour que son appli ca - tion se démarque de la concur rence, n oublions pas que les stan dards impo - sés par la pla te forme l emportent tou jours. Un bou ton doit appe ler une action de la part de l uti li sa teur et son empla - ce ment joue un rôle essen tiel à sa compré hen sion (exemple : le bou ton de retour à la vue pré cé dente est en haut à gauche). N hési tez pas à faire appel à un ergo nome ou un designer spécialisé dans l expé rience uti li sa teur (UX). Recette N 06 Défi nir plu sieurs fenêtres dans notre appli ca tion Ce qu il faut savoir Une Activity est décla rée dans le Manifest sous la forme d une paire classe/intent. <activity android:name="com.ex ample.mainactivity" android:label="@string/app_name" > <intent- filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category. LAUNCHER" /> </intent- filter> </activity> Ce qu il faut faire Ici, on déclare la pre mière Activity à char ger au lan ce ment de l appli ca - tion. Dans la classe asso ciée, on va ensuite char ger le layout (fichier xml de des crip tion gra phique) cor res pon dant. 18

27 public class MainActivity ex tends protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //... Le R.layout.activity_main fait réfé rence au fichier activity_main. xml, que l on trou vera dans le dos sier res/layout/. Les autres Activities sont décla rées de la même manière, l action et la caté go rie devant bien évi dem ment être dif fé rentes. Ce qu il ne faut pas faire Il est impor tant lors de la concep tion de vos appli ca tions de ne pas mul ti plier les vues. En effet, en plus des aspects ergo no miques, chaque vue occupe de l espace à la fois visuel le ment et en mémoire. La rela tive peti tesse de l écran implique néces sai re ment une sim pli fi ca tion de l inter face pour un usage mobile, mais les effets sur la mémoire sont plus sub tils : les vues peuvent être visuel le ment absentes, mais tou jours pré sentes en mémoire, condui sant pro gres si ve ment à une erreur sys tème. Recette N 07 Comment navi guer entre les fenêtres? Ce qu il faut savoir Les fichiers XML cor res pon dant aux dif fé rentes ins tances d Activity se trouvent dans le réper toire res/layout/ de votre pro jet. Le nom que vous don nez à vos fichiers sera repris dans la défi ni tion des IDs d Activity dans 19

28 la classe R, géné rée par le compi la teur, donc votre IDE vous inter dira les noms avec des carac tères spé ciaux et les espaces. La classe correspondant à l Activity ou au Fragment est res pon sable du char ge ment du layout cor res pon dant à sa vue dans sa méthode oncreate. Ce qu il faut faire On passe d une Activity à une autre en décla rant une «inten tion» : Soit une inten tion «fer mée» où l on con naît pré ci sé ment la classe de l Activity sui vante : Intent intent = new Intent(this, OtherActivity.class); Bundle b = new Bundle(); b.putstring("param1", "mon Texte"); b.putserializable("object1", obj); intent.putextras(b); startactivity(intent); // MainActivity.finish(); // Au cas où on n aurait pas besoin de // "reve nir" en arrière 20

29 Soit une Activity où l on con naît le type d action à faire (envoyer un mail, un mes sage, ouvrir une page Web, etc.) : Intent intent = new Intent(Intent.ACTION_SEND); startactivity(intent.createchooser(intent, "Envoyer")); Ce qu il ne faut pas faire Comme sur tous les appa reils mobiles, la mémoire est limi tée et gérée de façon la plus éco nome pos sible. Ainsi, il est cou rant de voir les vues détruites aus si tôt qu elles sont mas quées. C est pour quoi il est impor tant de sau ve gar der l état des dif fé rents élé ments gra phiques et de les res taurer le cas échéant. Par exemple, si nous sou hai tons sau ve gar der la valeur d un champ texte protected void onsaveinstancestate(bundle outstate) outstate.putstring("text field 1", tf.gettext()); super.onsaveinstancestate(outstate); Et pour le res taurer, le sys tème nous rap pel lera soit sur oncreate, soit sur onrestoreinstancestate : Dunod Toute reproduction non autorisée est un protected void onrestoreinstancestate(bundle savedinstancestate) if(savedinstancestate!= null) tf.settext(savedinstancestate.getstring("text field 1", ""); protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); 21

30 if(savedinstancestate!= null) tf.settext(savedinstancestate.getstring("text field 1", ""); //... Recette N 08 Navi ga tion Trans ver sale / Onglets Ce qu il faut savoir L autre moyen de navi guer dans une appli ca tion que de des cendre dans une arbo res cence est la navi ga tion pagi née, qu elle soit basée sur des onglets, ou sur un défi le ment. L objec tif est d avoir au sein d une même fenêtre plu sieurs «pages» conceptuellement reliées à la fenêtre, mais avec une identité ou un contenu dif fé rent. Exemple de vue avec onglets 22

31 Avec Android, il s agit en fait de la même chose, les onglets per met tant de sau ter ins tanta né ment d une page à l autre. Cela se fait au tra vers de Fragments, qui fonc tionnent qua si ment de manière iden tique aux Activities vues ci- dessus, mais ne sont pas indé pen dants. Ce qu il faut faire Il suf fit d avoir un ViewPager dans votre Activity, de lui don ner ses pages, et d affi cher, ou non, la barre d protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); mviewpager = (ViewPager) findviewbyid(r.id.pager); mviewpager.setadapter(msectionspageradapter); // Le pager // adap ter sera expli qué plus bas // Option nel : on met une barre d onglets final ActionBar actionbar = getactionbar(); actionbar.setnavigationmode(actionbar.navi GATION_MODE_TABS); Dunod Toute reproduction non autorisée est un délit. mviewpager setonpagechangelistener(new ViewPager. public void onpageselected(int posi tion) actionbar.setselectednavigationitem(posi tion); ); for (int i = 0; i < msectionspageradapter.getcount(); i++) if(i == 0) actionbar.addtab(actionbar.newtab().seticon(r.drawable.btn1).settablistener(this)); else if(i == 1) actionbar.addtab(actionbar.newtab().seticon(r.drawable.btn2).settablistener(this)); 23

32 else if(i == 2) actionbar.addtab(actionbar.newtab().seticon(r.drawable.btn3).settablistener(this)); else if(i == 3) actionbar.addtab(actionbar.newtab().seticon(r.drawable.btn4).settablistener(this)); else if(i == 4) actionbar.addtab(actionbar.newtab().seticon(r.drawable.btn5).settablistener(this)); else actionbar.addtab(actionbar.newtab().settext(msectionspageradapter.getpagetitle(i)).settablistener(this)); // Seule ment si on a une barre d public void ontabselected(actionbar.tab tab, FragmentTransaction fragmenttransaction) if(mviewpager.getcurrentitem()!= t.getposition()) mviewpager.setcurrentitem(t.getposition(), false); // Seule ment si on a une barre d public void ontabunselected(actionbar.tab tab, FragmentTransaction fragmenttransaction) // Seule ment si on a une barre d public void ontabreselected(actionbar.tab tab, FragmentTransaction fragmenttransaction) Le FragmentPagerAdapter est la classe res pon sable de gérer les pages. Les stra té gies de créa tion/mise à jour/des truc tion de pages sont lais sées à l appré cia tion du déve lop peur, mais quelques méthodes sont indis pen sables : 24

33 public int getcount() public Frag ment getitem(int posi tion) Note : En fonc tion des appa reils et des ver sions du sys tème d exploi ta tion, les vues peuvent poten tiel le ment être détruites pour libé rer de la mémoire. Cepen dant, le Frag ment lui-même reste réfé rencé et seul ce qui cor res pond au layout est chargé/déchargé. Par consé quent, deux stra té gies cou rantes s opposent, celle de créer le frag - ment la pre mière fois uni que ment pour conser ver des variables qui auraient besoin de dépas ser la durée de vie de la vue : private Fragment1 f1 = null; private Fragment2 f2 = null; public Fragment getitem(int position) if(posi tion == 0) if(f1 == null) f1 = new Fragment1(); return f1; else if(posi tion == 1) if(f2 == null) f2 = new Fragment2(); return f2; Dunod Toute reproduction non autorisée est un délit. //... Ou alors celle qui sup pose que le frag ment n a pas de rai son d exis ter sans son inter face et qu ainsi nous pou vons le recréer à chaque fois : public Fragment getitem(int position) if(posi tion == 0) return new Fragment1(); else if(posi tion == 1) return new Fragment2(); //... 25

34 Ce qu il ne faut pas faire Toutes les méthodes liées à l inter face gra phique sont appe lées par le sys - tème de manière asyn chrone. Il n y a donc aucune garan tie sur un moment pré cis d exé cu tion, qui dépend de la charge pro ces seur, mémoire, etc. Une chose est indis pen sable tou te fois : toutes les mani pu la tions gra phiques doivent se faire sur le thread lié à l inter face uti li sa teur. Toute vio la tion de ce prin cipe génère une excep tion qui peut faire plan ter l appli ca tion. Pour appe ler une méthode sur le thread UI, on pro cé dera de la sorte : getactivity().runonuithread(new public void run() //... ); Recette N 09 Pas sage d infor ma tion d une fenêtre à une autre Ce qu il faut savoir Les don nées sont pas sées au tra vers des Extras (putextras(bundle), putextra(string), etc.) et récu pérées par l Activity sui vante dans sa méthode oncreate. Ce qu il faut faire On récu père donc nos Extras dans l Intent qui a démarré notre Activity. 26

35 protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); //... Bundle b = getintent().getextras(); String url = b.getstring("param1"); Object obj = (Object) b.get("object1"); //... Ce qu il ne faut pas faire Atten tion à ne pas pas ser trop d infor ma tions et à se limi ter au strict mini mum à des fins de per for mances. De même, si une information est utile à toutes les vues, elle devra être pla cée à un endroit unique au lieu d être copiée d une vue à l autre. 27

36

37 Loca li sa tion des appli ca tions Chapitre 3 La mobi lité, par défi ni tion, abo lit la notion d appar te nance à une zone géo - gra phique, mais pas celle d appar te nance à une culture et ses pré fé rences lin guis tiques. Ainsi, il devient indis pen sable de loca li ser vos appli ca tions et ce, pour plu sieurs rai sons : La prise en main plus rapide et plus confor table dans sa langue natale (inter face mais aussi contenu) ; Tou cher un public le plus large pos sible, ce qui est le but de toute appli - ca tion ; Per mettre, dans une cer taine mesure, de retour ner une image à la fois inter na tionale et de proxi mité. Il va nous être pos sible de mettre en place dif fé rents degrés de loca li sa tion dans nos appli ca tions, en fonc tion de la finesse avec laquelle nous sou hai te - rons nous confor mer aux spé ci fici tés régio nales. Il nous sera ainsi pos sible de loca li ser : Le texte à affi cher : afficher l infor ma tion dans la langue de l uti li sa teur ; Les images : dé finir des icones ou des élé ments gra phiques spé ci fiques ; L agen ce ment des élé ments gra phiques : pour, par exemple, prendre en compte le sens de lec ture ou la lon gueur des mots qui seront uti li sés en fonc tion de la langue choi sie. Recette n 10 Comprendre la mécanique de sélec tion de la langue uti li sée Ce qu il faut savoir Au lan ce ment de l appli ca tion, le sys tème choi sit une Locale cor res pon dant à celle de l uti li sa teur. À par tir de cette Locale et en fonc tion des langues 29

38 dis po nibles dans l appli ca tion il va déter mi ner la plus proche. Pour cela, les langues sont clas sées dans un arbre qui défi nit une rela tion entre les dif fé - rentes langues. Ce qu il faut faire Pre nons un exemple : la tota lité des chaînes fran co phones se trouvent dans le dos sier values fr aux quelles nous sub sti tue rons les par ti cu la ri tés régio - nales de la France et du Canada res pec ti ve ment dans les dos siers valuesfr-fr et values fr-rca. La nota tion values- xx-ryy est basée sur les codes de langues et les codes régio naux : - xx avec la nota tion ISO YY avec la nota tion ISO À noter que la casse n a ici pas d impor tance, elle amé liore la lisi bilité. Dans le cas où une langue ne serait pas gérée par le sys tème sur lequel tour - nera l appli ca tion, une des règles prin ci pales est de pri vi lé gier les res sources loca li sées. On peut donc consi dé rer que l appli ca tion est lan cée avec les res - sources cor res pon dantes à la langue du sys tème et si celle- ci est introu - vable, ce sont les res sources par défaut les plus proches qui seront prises en compte. C est pour quoi il est impor tant de défi nir, dès le départ, quelle est la langue par défaut de l appli ca tion, car il s agit de la langue uti li sée si les para mètres de loca li sa tion du sys tème ne sont pas reconnus et si le code s appuie sur le sys tème auto ma tique. Ce qu il ne faut pas faire Atten tion aux langues qui ne seraient pas gérées par le sys tème sur lequel tour nera l appli ca tion. Le choix de la Locale à uti li ser se fait en allant du plus pré cis (région) au plus géné rique (res source glo bale de l appli ca tion) en pas sant par les défi - ni tions de langues. Ainsi, pour les chaînes du Canada, dans l ordre, le sys - 30

39 tème essaiera les dos siers values fr-rca puis values fr puis la racine values. Dans le code, il est pos sible de direc te ment for cer le char ge ment d une locale par ti cu lière ou de lais ser cela au sys tème auto ma tique. Note : Même si glo ba le ment, le para mé trage de langue du péri phérique est une des priori tés dans le choix de la res source, ce n est pas tou jours évident quand il s agit d images ou de fonc tion na li tés par ti cu lières, spé ci fiques au péri phérique hôte comme une réso lu tion d écran, une orien ta tion, un péri - phérique de sai sie, etc. Recette n 11 Loca li sa tion de texte à l aide de res sources Ce qu il faut savoir Dunod Toute reproduction non autorisée est un délit. Afin de rendre une appli ca tion inter na tionale, il est pos sible de défi nir des élé ments qui seront auto ma ti que ment traduits dans dif fé rentes langues. Par auto ma ti que ment, on entend que le déve lop peur devra main te nir une table de cor res pon dance de chaque terme dans les dif fé rentes langues. Il est pos sible de loca li ser du texte, mais éga le ment des images ou encore des inter faces complètes (nous ver rons le cas des inter faces dans une recette spé ci fique), ceci afin de four nir à l uti li sa teur une appli ca tion adap tée à sa langue. Ce qu il faut faire Nous pren drons pour exemple une appli ca tion fran co phone avec deux spé ci - fici tés régio nales et l anglais comme langue à uti li ser sur des péri phériques dont la Locale ne cor res pond pas au fran çais. Il est pos sible d uti li ser les res sources de façon opti male pour évi ter les redon dances inutiles tout en inté grant les par ti cu la ri tés régio nales au maxi - mum. 31

40 Les res sources se trouvent dans le dos sier res de l appli ca tion, typi que ment /workspace/mon Application/res Voici l arbo res cence du dos sier de res sources pour la par tie qui nous inté - resse, à savoir les chaînes de carac tères : Res/ values/ strings.xml values fr/ strings.xml values fr-rca/ strings.xml values fr-rfr/ strings.xml Nous défi nis sons un fichier fran co phone géné rique (values fr) : <resources> <string name="action_settings">paramètres</string> <string name="hello_world">bonjour le monde francophone!</ string> <string name="button1">mon bouton</string> </resources> Pour les spé ci fici tés régio nales, ici le Canada (values fr-rca), nous rem - pla çons uni que ment ce qui doit l être : <resources> <string name="hello_world">bon jour le Canada!</string> </resources> Si le péri phérique est confi guré pour le fran çais de Suisse, c est alors la res - source values fr qui sera uti li sée, si celle- ci n est pas pré sente, alors la res source values sera uti li sée, dans notre cas en langue anglaise. En effet, c est elle qui est défi nie dans le fichier values/strings.xml. Une fois nos fichiers défi nis, nous allons pou voir uti li ser ces res sources grâce aux identifiants de Pre nons comme exemple une Activity basique avec un bou ton et un champ texte : 32

41 <RelativeLayout xmlns:android=" res/android" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" men/activity_ver tical_margin" men/activity_hori zontal_margin" men/activity_hori zontal_margin" men/activity_ver tical_margin" tools:context=".mainactivity" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="35dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparenttop="true" android:layout_margintop="24dp" /> </RelativeLayout> Dunod Toute reproduction non autorisée est un délit. En fonc tion de la langue de l uti li sa teur, les textes seront dif fé rents : En fran çais cana dien, le champ texte contien dra donc «Bon jour le Canada» et le bou ton «Mon bou ton» ; En fran çais de Suisse, le champ texte contien dra «Bon jour le monde fran - co phone» et le bou ton «Mon bou ton» ; En alle mand, comme dans n importe quelle autre langue non fran co phone, ce sont les valeurs définies dans le fichier values/strings.xml qui seront uti li sées. Il est éga le ment pos sible de faire appel à ces chaînes direc te ment dans le code tout en conser vant l uti li sation de la loca li sa tion : String chainebienvenue = this.getstring(r.string.hello_world); 33

42 Ce qu il ne faut pas faire Loca li ser une appli ca tion est une tâche consé quente sur laquelle de l aide peut être requise pour les langues que le déve lop peur ne maitriserait pas. De nom breuses agences de tra duc tion existent, mais peu sont spé cia li sées en déve lop pe ment logiciel. Afin d évi ter les contresens et les inco hé rences, il est recom mandé de tra vailler avec une équipe ayant des connais sances à la fois tech niques et lin guis tiques. Recette n 12 Loca li sa tion de texte à l aide des Bundles Ce qu il faut savoir Les Bundles sont un héri tage du Java tra di tion nel ne pou vant ser vir qu à loca li ser du texte et sont sou vent uti li sés pour l inter na tiona li sation des appli - ca tions multiplateformes. Ce sont des fichiers de pro prié tés sur le prin cipe du couple clé/valeur. Il est pos sible d uti li ser ces fichiers pour loca li ser d autres élé ments (en spé - ci fiant des che mins dif fé rents pour des élé ments). Cependant, nous ver rons plus loin dans ce cha pitre des méthodes plus spé ci fiques à Android. Ce qu il faut faire Les «res sources» que nous uti li sons se trouvent dans le dos sier assets de l appli ca tion, typi que ment /workspace/mon Application/assets : stringbundle.properties stringbundle_en_gb.properties stringbundle_fr_ca.properties stringbundle_fr_fr.properties 34

43 # en_us (stringbundle.properties) btnyes = Yes btnno = No btncancel = Cancel btnnew = New msgwelcome = Welcome to our international application # fr_fr (stringbundle_fr_fr.properties) btnyes = Oui btnno = Non btncancel = Annuler btnnew = Nouveau msgwelcome = Bienvenue dans notre application pour la France Il faut ensuite impor ter les classes cor res pon dantes pour pou voir les uti li - ser dans le code : import java.util.locale; import java.util.resourcebundle; Dans le cas de l uti li sation des Bundles, l obten tion de la langue du sys - tème n est plus auto ma tique comme avec les res sources et doit se faire au lan ce ment de l appli ca tion : private Locale currentlocale = Locale.getDefault(); private ResourceBundle strbundle = ResourceBundle. getbundle( assets/stringbundle, currentlocale); La chaîne est récu pérée grâce à sa clé dans le bundle qui nous inté resse : String messagebienvenue = strbundle.getstring( msgwelcome ); Recette n 13 Loca li ser des images Ce qu il faut savoir La loca li sa tion des images fonc tionne selon un prin cipe très simi laire à celui des res sources, les fichiers sont sto ckés dans une arbo res cence. 35

44 Ce qu il faut faire Par exemple, nous allons affi cher les dra peaux pour cer taines régions, les images à uti li ser pour la langue fran çaise seront ainsi dans les réper toires : res/drawable fr-hdpi flag.png res/drawable fr-rca-hdpi flag.png res/drawable fr-rfr-hdpi flag.png Celles à uti li ser en l absence de contenu spé ci fique dans le réper toire (dra - peau du Royaume- Uni) : Res/drawable hdpi flag.png Fran çais France Fran çais Canada Fran çais Suisse Comme nous pou vons le voir, l envi ron ne ment fran çais de Suisse uti lise l image conte nue dans res/drawable fr-hdpi qui est le dra peau de la fran co pho nie. 36

45 Tout autre para mé trage nous aurait affi ché l Union Jack avec du texte en anglais. Atten tion, les priori tés lin guis tiques prennent le pas sur les priori tés de réso - lu tion. Ainsi, si vous avez des res sources spé ci fiques pour un petit écran et des res sources pour la langue de l uti li sa teur, ce sont ces der nières qui seront choi sies. Pour gérer ces aspects, l uti li sation des Bundles per met une dis so cia tion entre les aspects de loca li sa tion et les aspects phy siques de l appa reil. Ce qu il ne faut pas faire Dunod Toute reproduction non autorisée est un délit. Par fois la seule tra duc tion des images et du texte ne suf fit pas. Pre nons l exemple d un bou ton de lan ce ment, le fait d avoir un texte compressé de type «Démar rer» n est pas idéal, de même qu avoir un gros bou ton avec un petit texte «Go». Également, si l on consi dère des langues écrites de droite à gauche, le fait d avoir le bou ton «OK» à droite n a pas de sens. Dans toutes ces situa tions, il devient dès lors impé ra tif de modi fier l affi - chage de manière consé quente en fonc tion de la langue. La loca li sa tion des layouts se fera sur le même prin cipe que pré cé dem - ment avec par exemple un réper toire layout fr pour les élé ments fran - co phones. D une manière géné rale, l anglais est une langue très concise, il faut gar - der à l esprit qu une simple phrase peut conte nir beau coup de sens par fois dif fi cile à tra duire. C est pour quoi il est géné ra le ment admis d uti li ser des élé ments 30 % plus grand que la chaîne anglaise d ori gine, ce qui reste un mini mum. Un exemple concret que nous ren controns sou vent : Privacy Policy Qui sera tra duit par : Poli tique de confi den tia lité 37

46 Nous pas sons d une chaîne de 14 à 28 carac tères (sans par ler de la chasse de la police qui sera uti li sée) qu il est dif fi cile de rac cour cir davan tage et qui est sou vent uti li sée dans un lien ou un bou ton. En plus d une perte de cré di bi lité avec des chaînes tron quées que l on voit trop sou vent, le risque prin ci pal est aussi de perdre l agen ce ment des contrôles. Donc, atten tion au choix des contrôles qui devront être adap tés à la chaîne qu ils contiennent (android:layout_width="wrap_content") avec leur agen ce ment rela tif sur le layout (android:layout_align Left="@+id/id_du_controle_sur_lequel_on_s_aligne_a_ gauche"). Le cas par ti cu lier des langues lues de droite à gauche (RTL) Les langues lues de droite à gauche comme l arabe ou l hébreu doivent être prises en compte de façon par ti cu lière car elles impactent aussi le layout de l appli ca tion. Ainsi, tous les champs et bou tons non cen trés devront se retrou ver ali gnés sur la droite de l écran. Le layout étant une res source comme une autre, il suf fira de le loca li ser de la même manière sans devoir pas ser par du code de mise en forme de l exis - tant. Dans notre cas, cela donne l arbo res cence sui vante : Res/ layout/ activity_main.xml layout ar/ activity_main.xml Le fichier activity_main.xml contient tous les contrôles néces saires ali - gnés à droite. Atten tion cepen dant, cette approche a un impact impor tant sur la main te - nance du code en dou blant la charge poten tielle de tra vail sans même par ler des orien ta tions por trait ou pay sage. 38

47 Seconde PAR TIE Accé Der aux compo sants phy siques de l appa reil Uti li ser les cap teurs de l appa reil Chapitre 4 De plus en plus d appli ca tions uti lisent des types d inter ac tions plus riches que le duo sou ris/cla vier. Que ce soit la console Wii de Nintendo ou encore les ter mi naux mobiles, de nou veaux usages basés sur les mou ve ments de l appa reil sont appa rus. Android étant un sys tème ouvert, il donne accès de façon complè te ment libre aux cap teurs dis po nibles et pré sents sur l appa reil, notam ment : L accé lé ro mètre, Le gyro scope, Le magné to mètre, Le lux mètre, Le cap teur de proxi mité, etc. Recette N 14 Utiliser l accé lé ro mètre Ce qu il faut savoir L accé lé ro mètre est un cap teur qui n est pas sys té ma ti que ment dis po nible sur les appa reils Android. Il n y a pas de méthode simple pour savoir si tel ou

48 tel cap teur est dis po nible sur un appa reil ; il faut donc tenter de récu pé rer une ins tance d accès aux don nées et ne rien faire si cette ins tance est nulle. Ce qu il faut faire Pour savoir si l accé lé ro mètre est dis po nible, il faut donc : demander au contexte appli ca tif le ges tion naire de cap teurs, demander le cap teur cor res pon dant à l accé lé ro mètre, véri fier qu il n est pas nul. /** * accelisavailable * méthode qui déter mine si les a ccéleromètres sont dis po nibles c le contexte d exé cu tion (@see getapplicationcontext()) true si les acceleromètres sont dis po nibles, false sinon */ public static boolean accelisavailable(context c) SensorManager sensormanager = (SensorManager) c.getsystemservice(context.sensor_ser VICE); Sensor accelerometer = sensormanager. getdefaultsensor(sensor.type_accelerometer); return (accelerometer!= null); Géné ra le ment, on uti lise cette fonc tion dans la méthode onstart() de l Activity. En sup po sant que la classe dans laquelle cette fonc tion est décla rée s appelle AccelerometerReader : /// méthode appelée au démarrage de l acti vité public void onstart() super.onstart(); boolean accelerator = AccelerometerReader. accelisavailable(getapplicationcontext()); // affi cher un dia logue si l accelerometre n est pas // dis po nible, par ex 40

49 Une fois cette vali da tion faite, tous les cap teurs fonc tionnent sur le modèle stan dard du Listener : on implé mente l inter face SensorEventListener, puis la méthode onsensorchanged et on réagit aux chan ge ments de valeurs. On s enre gistre auprès du SensorManager comme suit : /** * startacceleration * méthode qui démarre l acqui sition de données en provenance * des acceléromètres c le contexte d exé cu tion (@see getapplicationcontext()) l la classe res pon sable de gérer les don nées (peut être this) */ public void startacceleration(context c, SensorEventListener l) SensorManager sensormanager = (SensorManager) c.getsystemservice(context.sensor_ser VICE); Sensor accelerometer = sensormanager. getdefaultsensor(sensor.type_accelerometer); if(accelerometer!= null) sensormanager.registerlistener(l, accelerometer, SensorManager.SENSOR_DELAY_NOR MAL); Évidemment, lors qu on n a plus besoin des chan ge ments de valeurs des accé lé - ro mètres, on se désinscrit du cap teur pour évi ter de vider la bat te rie inuti le ment. Dunod Toute reproduction non autorisée est un délit. /** * stopacceleration * méthode qui arrête l acqui sition de données en provenance * des acceléromètres c le contexte d exé cu tion (@see getapplicationcontext()) l la classe res pon sable de gérer les don nées (peut être this) */ public void stopacceleration(context c, SensorEventListener l) SensorManager sensormanager = (SensorManager) c.getsystemservice(context.sensor_ser VICE); Sensor accelerometer = sensormanager. getdefaultsensor(sensor.type_accelerometer); if(accelerometer!= null) sensormanager.unregisterlistener(l, accelerometer); 41

50 Note : L idéal étant bien sûr de gar der les valeurs de sensormanager et accelerometer comme variable d ins tances, pour évi ter de les cher cher à chaque fois. Tou te fois, ce sont des objets par ta gés dans le sys tème qui ne devraient pas varier d un moment à l autre (en tout cas pas tant qu on n a pas redé marré l Activity). Il ne reste qu à réagir aux chan ge ments de valeurs dans la méthode onsensorchanged : public void onsensorchanged(sensorevent event) if(event.sensor.gettype()!= Sensor.TYPE_ACCELEROMETER) return; float ax = event.values[0]; float a y = event.values[1]; float az = event.values[2]; // Faire quelque chose avec les vec teurs d accé lé ra tion Ce qu il ne faut pas faire Atten tion, ces chan ge ments de valeurs peuvent être très fré quents et sont empi lés sur le thread d appel. Il ne faut donc pas faire d opé ra tions trop longues ou trop coû teuses en terme de res sources, pour évi ter que le sys tème n empile les valeurs plus vite que l on ne peut les dépi ler, ce qui engen dre rait un retard de plus en plus impor tant sur l affi chage des infor ma tions. Recette N 15 Détecter un mou ve ment Ce qu il faut savoir Un mou ve ment se défi nit par une vitesse non nulle. Une accé lé ra tion quant à elle cor res pond à une varia tion de la vitesse. Si mon accé lé ra tion est constante, ma vitesse aug mente (ou dimi nue) de façon linéaire. 42

51 Dès lors, détecter un mou ve ment est compli qué lorsque l on n a accès qu aux accé lé ro mètres. Si le mou ve ment se pro duit à vitesse constante, la varia tion est nulle et la valeur des accé lé ro mètres ne change pas. Dans le vide de l espace, s il n y a aucun corps céleste à por tée rai son nable et aucun moteur de mou ve ment, l accé lé ra tion est négligeable dans les trois dimen sions. Position des axes Dunod Toute reproduction non autorisée est un délit. Dans notre réa lité quo ti dienne, il y a une accé lé ra tion constante (qui est heu - reu se ment compen sée par le plan cher des vaches, ici, sur Terre) qui est la gra vité. En pra tique, à la sur face de notre pla nète, on a une gra vité moyenne plus ou moins orien tée vers le centre de la Terre (le bas, donc) qui a une valeur de 9,81 m/s/s (ou m/s²). Autre ment dit, si votre appa reil est posé à plat sur une table, la valeur des accé lé ro mètres sera d envi ron 0 en X et en Y, et de -9,81 en Z. Un mou ve ment a deux compo santes prin ci pales que nous allons uti li ser pour nos besoins : une rota tion, une varia tion de l accé lé ra tion dans le temps. La rota tion nous indique l orien ta tion de l appa reil dans l espace : si X vaut -9,81, Y et Z valant 0, on le tient en mode pay sage (haut de l appa reil vers la gauche) de manière par fai te ment ver ti cale. Note : La plu part des jeux cherchent donc à déter mi ner le «bas» et la «gauche» par rap port à une posi tion stan dard pour déter mi ner si l appa reil est plu tôt pen ché d un côté ou de l autre. Il est inté res sant de noter qu une valeur de 0 dans deux des trois compo - santes du vec teur n est pas inté res sante du tout pour qui veut déter mi ner 43

52 l orien ta tion exacte de l appa reil dans l espace : il n y a par exemple pas moyen de faire la dif fé rence entre por trait et pay sage pour un appa reil posé à plat sur une table. La seconde compo sante est plus déli cate à manier et plus «incer taine». Un mou ve ment a géné ra le ment un début et une fin. Par exemple, je prends le télé phone sur la table et je le mets dans ma poche. Si les deux extré mi - tés de cette séquence sont sta tiques, détecter un mou ve ment consiste donc à détecter un chan ge ment de valeur dans les accé lé ro mètres (en fil trant le bruit de fond et les erreurs d arron dis). Dans un disque dur, par exemple, on cherche géné ra le ment à savoir s il y a mou ve ment tout court, pour évi ter de per cu ter les pla teaux avec la tête de lec ture. En cas d accé lé ra tion quel conque, les têtes se rétractent. Ce qu il faut faire Ici on détectera le début d un mou ve ment de la manière sui vante : // Ne pas oublier de les initialiser en début d utilisation private float px, py, pz; public void onsensorchanged(sensorevent event) if(event.sensor.gettype()!= Sensor.TYPE_ACCELEROMETER) return; float ax = event.values[0]; float a y = event.values[1]; float az = event.values[2]; if(math.abs(px - ax) > 0.05 Math.abs(pY - a y) > 0.05 Math.abs(pZ - az) > 0.05) // On a changé d orien ta tion ou de vitesse! 44

53 De même, si on veut détecter l arrêt d un mou ve ment : // Ne pas oublier de les initialiser en début d utilisation private float px, py, pz; public void onsensorchanged(sensorevent event) if(event.sensor.gettype()!= Sensor.TYPE_ACCELEROMETER) return; float ax = event.values[0]; float a y = event.values[1]; float az = event.values[2]; if(math.abs(px - ax) <= 0.05 Math.abs(pY - a y) <= 0.05 Math.abs(pZ - az) <= 0.05) // On s est arrêté else px = ax; py = a y; pz = az; Ce qu il ne faut pas faire Atten tion, encore une fois, les accé lé ro mètres nous donnent le changement de vitesse et l orien ta tion. Rien d autre. Pour détecter un chan ge ment de posi tion (à vitesse constante), on est obligé de se réfé rer à la géo locali sa tion. Dans le cas où on serait dans l espace, le GPS ne mar che rait donc pas. Si vous êtes sur Terre, vous pou vez vous réfé rer au cha pitre sui vant. 45

54

55 La géo locali sa tion Chapitre 5 Se loca li ser et être loca lisé : les usages de la géo locali sa tion appli qués aux péri phériques nomades sont des plus nom breux et per mettent de pro po ser à l uti li sa teur dif fé rents ser vices en fonc tion de l endroit où ce der nier se trouve comme : Four nir des ser vices de navi ga tion rou tière, Indi quer à l uti li sa teur un ensemble de lieux à proxi mité de sa posi tion, Per son na li ser l infor ma tion en fonc tion du lieu, etc. En effet, les ser vices sont extrê me ment variés et se basent pour la plu part sur les mêmes fon da men taux : Affi cher sa posi tion, Cal cu ler la dis tance entre 2 points, Affi cher des points d inté rêt à proxi mité. Recette N 16 Obte nir notre position géolocalisée Ce qu il faut savoir La plu part des appa reils ont plu sieurs dis po si tifs de loca li sa tion : Un GPS, une puce qui va tri an gu ler sa posi tion par rap port à un réseau satellitaire, Pour les télé phones por tables, une tri an gu la tion par rap port aux antennes relais, Dans les autres cas, une géo locali sa tion struc tu relle en fonc tion du nœud de réseau par lequel le péri phérique accède à Inter net. Android pro pose l accès sépa ré ment à cha cune de ces méthodes, il nous fau dra ainsi la choi sir en fonc tion du but recher ché. 47

56 Ce qu il faut faire Pour récu pé rer les coor don nées géo gra phiques de l appa reil, on passe par une brique sys tème qui se nomme LocationManager. Le LocationManager fonc tionne comme la plu part des classes de ce type en Java : on défi nit une des classes du pro jet comme délé guée ; celle- ci réagira à des chan ge ments de posi tion. public class MyLocationManager implements LocationListener public void onlocationchanged(location l) if(loca tion!= null) double lati = loca tion.getlatitude(); double longi = loca tion.getlongitude(); Celle-ci sera appelée à chaque chan ge ment et contien dra ainsi à chaque fois la nou velle posi tion. Nous dis po sons alors de deux variables de type double qui contiennent res pec ti ve ment la lati tude et la lon gi tude. Pour que notre classe réagisse à l envi ron ne ment, nous allons uti li ser un objet de type MyLocationManager ou une autre classe implé men tant l inter face LocationListener. Nous allons tout d abord récu pé rer le ges tion naire sys tème : LocationManager lm = (LocationManager) getsystemservice(context.loca TION_SER VICE); Puis, nous allons demander par exemple à avoir les véri tables don nées GPS avec une véri fi ca tion toutes les secondes (1000 milli secondes), si la posi tion change de plus de 500 m : lm.requestlocationupdates(locationmanager.gps_provider, 1000L, 500.0f, gest); Le pro blème de la méthode ci- dessus est qu elle ne fonc tion nera pas si le GPS n est par fois pas dis po nible (si l on se trouve à l inté rieur d un bâti ment par exemple). Pour cor ri ger cela, nous pou vons aussi avoir les don nées géo - gra phiques depuis l accès réseau selon le même prin cipe : 48

57 lm.requestlocationupdates(locationmanager.network_provider, 1000L, 500.0f, gest); Recette N 17 Affi cher la posi tion sur une carte Ce qu il faut savoir Il existe plu sieurs façons d affi cher une carte, mais Google nous four nit une brique sys tème effi cace et simple d emploi, à savoir GoogleMaps. Cela néces site au préa lable son auto ri sa tion dans la console API de votre compte déve lop peur. Ce qu il faut faire Nous allons pro cé der par l inter mé diaire d un élé ment de type MapFragment placé dans le layout de notre Activity comme suit : <fragment android:name= com.google.android.gms.maps.mapfragment android:layout_width= match_parent android:layout_height= match_parent /> Dunod Toute reproduction non autorisée est un délit. Positionnez- le comme vous le sou hai tez dans votre inter face, puis dans le code ; si vous sou hai tez accé der à la carte affi chée, uti li sez : GoogleMap gmap = ((MapFragment) getfragmentmanager(). findfragmentbyid(r.id.map)).getmap(); Dès lors, les contrôles d affi chage, de type de carte, etc. sont acces sibles et modi fiables. Par exemple, pour chan ger le type d affi chage en mode satel lite : gmap.setmaptype(googlemap.map_type_satel LITE); 49

58 De la même manière, nous pou vons chan ger la zone affi chée pour posi tion - ner la carte autour de notre posi tion : LatLng southwest = new LatLng(maxSud, maxouest); LatLng northeast = new LatLng(maxNord, maxest); LatLngBounds rect = new LastLngBounds(southwest, northeast); CameraUpdate cam = CameraUpdateFactory.newLatLngBounds(rect); gmap.animatecamera(cam); Atten tion, il est impor tant de remar quer si l on regarde le code ci- dessus que : On défi nit l extré mité sud- ouest du rec tangle (maxsud et maxouest, ce qui repré sente le point le plus au sud et à l ouest), donc le point en bas à gauche ; On défi nit l extré mité nord-ouest du rec tangle (maxnord et maxest, ce qui repré sente le point le plus au nord et à l est), donc le point en haut à droite ; On crée l objet Google map avec les deux extré mi tés définies au-des sus ; On indique à l affi chage de se foca li ser sur le rec tangle défini. Une fois la carte affi chée, il nous reste à affi cher notre posi tion. Affi cher sa posi tion sur la carte est fourni en stan dard par le MapFragment et par la brique sous- jacente. Pour affi cher un point positionnel stan dard, il suf fit de faire : gmap.setmylocationenabled(true); Utilisation d un fragment 50

59 Ce qu il ne faut pas faire Atten tion, l uti li sation des MapFragments est très consom ma trice de mémoire et de réseau au chargement. Il est impor tant pour garan tir une bonne expé rience uti li sa teur d ini tia li ser l objet avec les bonnes infor ma tions (par exemple, le niveau de zoom requis) pour évi ter tout char ge ment inutile. Recette N 18 Cal cu ler la dis tance entre deux points Ce qu il faut savoir Il existe dif fé rentes méthodes per met tant de calculer la dis tance entre deux points. Les points pour ront être obte nus selon la méthode vue dans la par tie pré - cé dente ou bien défi nis direc te ment. On obtient ainsi deux paires de lati tude/lon gi tude (double) : lat1, lng1, lat2, lng2 expri mées en degrés et conver tibles en degrés, minutes, secondes. Dunod Toute reproduction non autorisée est un délit. Note : Pour cal cu ler la dis tance nous pou vons faire appel aux mathématiques ou à des méthodes sys tèmes. L avan tage de l approche mathéma tique est qu elle sera dis po nible en per ma - nence alors que la méthode GoogleMaps, bien que plus pré cise, néces si tera impé ra ti ve ment un accès au réseau. Méthode de Pythagore Cette méthode est rapide mais rela ti ve ment impré cise. Elle est recom man dée pour des dis tances infé rieures à 10 kilo mètres. Nous sup po se rons qu une seconde d'arc cor res pond à envi ron 31 mètres et qu un degré cor res pond à 111 kilo mètres (à savoir 31 mètres x 3 600). Le rayon moyen de la Terre est de km. La cir confé rence d un cercle est 2*π*R, soit km, pour

60 Donc 1 fait 40030/360 soit 111 km. Une minute fait 1/60 e de degré, et une seconde fait 1/3 600 e de degré, soit res pec ti ve ment 1,85 km, et 30,89 m. Évi dem ment, plus on se rap proche des pôles, et plus cette approxi ma tion est fausse : l écart entre deux degrés de lon gi tude sur le cercle arc tique fait plutôt de l ordre de 28 km, et au pôle il est presque de 0. Ce qu il faut faire On va ainsi expri mer la distan ce avec Pythagore ( (a² + b²)) : /** pythagoriandistance * méthode qui cal cule une dis tance selon l approxi ma tion plane * et la for mule de Pythagore lat1 lati tude du point 1 lng1 lon gi tude du point 1 lat2 lati tude du point 2 lng1 lon gi tude du point 2 la dis tance en metres */ public static double pythagoriandistance(double lat1, double lng1, double lat2, double lng2) double distancesecondes = Math.sqrt( Math.pow( Math.abs((lat2 * 3600) - (lat1 * 3600)), 2 ) + Math.pow( Math.abs((lng2 * 3600) - (lng1 * 3600)), 2 ) ); return (distancesecondes * 31); La fonc tion ci- dessus nous ren voie ainsi la dis tance en mètres. Méthode d Haversine La seconde méthode consiste à uti li ser le théo rème d Haversine qui est plus complexe mais plus pré cis, car pre nant en compte la roton dité de la Terre. Cette méthode s approche dans la concep tion du cal cul de taille moyenne d un degré comme vu pour la méthode de Pythagore, qui suppose une Terre parfaitement sphérique alors que dans la réalité elle est un peu aplatie. 52

61 /** haversinedistance * méthode qui cal cule une dis tance à la façon d Haversine lat1 lati tude du point 1 lng1 lon gi tude du point 1 lat2 lati tude du point 2 lng1 lon gi tude du point 2 la dis tance en metres */ public static double haversinedistance(double lat1, double lng1, double lat2, double lng2) double earthradius = ; // Attention, l unité choi sie ici défi nit l unité de sor tie : ici, en mètres double dlat = Math.toRadians(lat2-lat1); double dlng = Math.toRadians(lng2-lng1); double sindlat = Math.sin(dLat / 2); double sindlng = Math.sin(dLng / 2); double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); double dist = earthradius * c; return dist; Méthodes sys tème Dunod Toute reproduction non autorisée est un délit. Comme nous le disions plus haut, il est éga le ment pos sible de faire appel à des méthodes qui feront ce cal cul pour nous. Android nous four nit notam ment un appel sys tème qui fait le cal cul direc te ment : /// androiddistance /// méthode qui cal cule une dis tance à l aide du sys tème public static double androiddistance(double lat1, double lng1, double lat2, double lng2) float results[] = new float[3]; // Android nous four nira 3 infor ma tions : dis tance, cap au départ et cap à l arri vée android.loca tion.loca tion.distancebetween(lat1, lng1, lat2, lng2, results); return (double)(results[0]); 53

62 Cette méthode, si elle paraît plus simple, a cepen dant le défaut de devoir être dis po nible lorsque l uti li sa teur y fait appel. Ainsi, il est pos sible de baser notre cal cul sur celle- ci en priorité mais de pré voir le cas où elle ne serait pas dis po nible et d uti li ser en second lieu une méthode mathéma tique. Ce qu il ne faut pas faire Atten tion à l uti li sation de don nées en cas d uti li sation d API effec tuant des appels dis tants. Ces der nières étant inté res santes à uti li ser, l idéal est de dis po ser d une méthode locale en cas d indis po ni bi lité du réseau. Recette N 19 Affi cher des points d inté rêt à proxi mité Ce qu il faut savoir À par tir de la posi tion de l uti li sa teur, il va être pos sible de lui pro po ser un ensemble d élé ments per son na li sés en fonc tion de cette der nière. Les dif fé rents points à affi cher peuvent être obte nus de nom breuses manières, que ce soit en les inté grant dans l appli ca tion via un fichier, ou direc te ment depuis un Web Ser vice tel que les APIs de Google. Dans tous les cas, ces points seront défi nis par une lati tude, une lon gi tude et un nom. Les APIs Google Maps repré sentent un point sur la carte par un objet de type MarkerOptions qui se construit de la sorte : MarkerOption o = new MarkerOptions() posi tion(new LatLng(<latitude>, <longitude>)).title(<titre>).visible(true) Google Maps affiche l ensemble des points qui lui sont trans mis. Dès lors, il nous faut fil trer la liste ini tiale en compa rant les coor don nés GPS pour défi nir les points qui sont à proxi mité et qui nous inté ressent. 54

63 Ce qu il faut faire Sup po sons une méthode qui crée des points aléa toi re ment autour d une posi - tion don née dans un rayon donné, dans le cadre d un jeu par exemple : /** createrandommarkers lati tude La lati tude du centre de la zone lon gi tude La lon gi tude du centre de la zone radius Le rayon de la zone size Le nombre de points à créer Un tableau de points à ajou ter sur un GoogleMap */ private ArrayList<MarkerOptions> createrandommarkers(int size, double radius) ArrayList<MarkerOptions> result = new ArrayList<MarkerOptions>(); Random r = new Random((new Date()).getTime()); for (int i = 0 ; i < size ; i++) int d1 = r.nextint(2) % 2; // posi tive/negative for lat if(d1 == 0) d1 = -1; int d2 = r.nextint(2) % 2; // posi tive/negative for lng if(d2 == 0) d2 = -1; double newlat = lati tude + r.nextdouble()*radius * d1; double newlng = lon gi tude + r.nextdouble()*radius * d2; Dunod Toute reproduction non autorisée est un délit. result.add(new MarkerOptions().posi tion(new LatLng(newLat, newlng)).title("pt #"+i).visible(true) ); return result; Cette liste pour rait alors être fil trée grâce aux fonc tions de dis tance, comme suit : /** filterlistbydistance * fonc tion qui ren voie une liste dont la dis tance au point de réfé rence est inférieure à une cer taine valeur 55

64 lat lati tude du point de réfé rence lng lon gi tude du point de réfé rence l liste des points à fil trer cutof dis tance maximale au point de réfé rence en mètres liste fil trée */ public static ArrayList<MarkerOptions> filterlistbydistance(arraylist<markeroptions> l, double lat, double lng, double cutoff) ArrayList<MarkerOptions> result = new ArrayList<MarkerOptions>(); for(markeroptions o : l) if(hello.androiddistance(lat, lng, o.getposition().lati tude, o.getposition().lon gitude) <= cutoff) result.add(o); return result; Ainsi, à par tir d un nombre de points géné rés comme au-des sus ou non, et que l on nomme markers, on peut obte nir une repré sen ta tion gra phique sur la carte comme suit : // gmap est un objet GoogleMap valide, markers est un tableau, // Vector ou ArrayList de points à afi cher for(markeroptions o : filterlistbydistance(markers, lati tude, lon gi tude, 500.0)) gmap.addmarker(o); Ce qu il ne faut pas faire Dans le cas où vous maîtri sez la source des points d inté rêt, l idéal est de ne four nir à l appli ca tion que ce qui est néces saire pour évi ter des traitements trop consé quents. Atten tion cepen dant à ne pas être trop res tric tif, ce qui pro duira l effet inverse, à savoir un trop grand nombre de requêtes dis tantes. 56

65 Troisième partie Inter agir avec les appli ca tions du sys tème Inter agir avec les photos Chapitre 6 Parmi les nou veaux usages ame nés par les péri phériques mobiles, la prise de photos est deve nue l une des fonc tions les plus impor tantes pour les uti - li sa teurs. D une fonc tion na lité acces sible, l appa reil photo est devenu aujourd hui un élé ment majeur des télé phones avec des cap teurs allant jus qu à 41 Mpx sur cer tains péri phériques et, tous les jours, s échangent des mil lions de photos sur les réseaux. Que ce soit pour les par ta ger sur des réseaux sociaux ou pour cap tu rer l ins - tantané, les télé phones por tables sont tous munis d une appli ca tion basique de prise de vue ainsi que d au moins une appli ca tion per met tant l orga ni sa tion des photos sous la forme d une biblio thèque. Il est éga le ment pos sible pour nos appli ca tions d inter agir avec ces élé - ments et ainsi, de les enri chir de fonc tion na li tés photo gra phiques ou d édi tion d image. Nous ne cou vri rons pas dans ce cha pitre le para mé trage avancé de la caméra uti li sée, pour nous foca li ser sur les entrées/sor ties dans la bibliothèque de photo généralement partagée par l ensemble des appli ca tions de photo graphie dis po nibles sur le Play Store.

66 Recette N 20 Accé der à la biblio thèque de photos Ce qu il faut savoir La frag men ta tion des ver sions et des sur couches des construc teurs, ainsi que la pos si bi lité d ajou ter ou sup pri mer n importe quel compo sant sys tème sur Android signi fie qu il n existe pas néces sai re ment qu une seule appli ca tion de ges tion de biblio thèque de photo sur l appa reil de l uti li sa teur. Il se peut même, dans de rares cas, qu il n en n existe pas. Application Galerie Ce qu il faut faire Le méca nisme des Intents et des Activities nous per met de pas ser la main à une appli ca tion a priori inconnue : Intent i = new Intent(Intent.ACTION_PICK, android.provider.mediastore.images.media.external_content_ URI); startactivityforresult(i, ACTIVITY_SELECT_IMAGE); Une fois la sélec tion effec tuée, le «contrat» lié au tra vers de l Intent nous dit que le sys tème revien dra dans notre code grâce à la méthode sui vante : 58

67 @Override protected void onactivityresult(int requestcode, int resultcode, Intent imagereturnedintent) super.onactivityresult(requestcode, resultcode, imagereturnedintent); switch(requestcode) case SELECT_PHOTO: if(resultcode == RESULT_OK) Uri selectedimage = imagereturnedintent.getdata(); InputStream imagestream = getcontentresolver(). openinputstream(selectedimage); Bitmap yourselectedimage = BitmapFactory. decodestream(imagestream); Ce qu il ne faut pas faire Lors de l utilisation de ce type d élé ment, il est impor tant d implé men ter l ensemble des méthodes pour inter agir avec ce der nier, y compris le bou ton per met tant l annu la tion. Recette N 21 Uti li ser la caméra Ce qu il faut savoir De la même manière, la pré sence d une caméra acces sible, ainsi que l appli - ca tion ou le compo sant sys tème per met tant de s en ser vir, ne sont pas connus à l avance. Il faut donc construire un Intent cor res pon dant et attendre le retour. 59

68 Ce qu il faut faire La cap ture d image néces site d appe ler un Intent séparé, et donc de sto cker la photo prise dans un endroit acces sible à la fois par notre appli ca tion et celle qui pourra prendre la photo. Ici, nous fai sons le choix de la mettre dans le sto ckage External et de pas ser cette Uri à l Intent char gée d effec tuer la prise de vue. private Uri outputfileuri; private void openimageintent() // Déter mine l Uri de l image à sau ver, prise par la caméra. final File root = new File(Environment. getexternalstoragedirectory() + File.separator + "MyDir" + File.separator); root.mkdirs(); final String fname = "IMG_"+(new Date()).getTime(); final File sdimagemaindirectory = new File(root, fname); outputfileuri = Uri.fromFile(sdImageMainDirectory); // Caméra. final List<Intent> cameraintents = new ArrayList<Intent>(); final Intent captureintent = new Intent(android.provider. MediaStore.ACTION_IMAGE_CAP TURE); final PackageManager packagemanager = getactivity(). getpackagemanager(); final List<ResolveInfo> listcam = packagemanager. queryintentactivities(captureintent, 0); for(resolveinfo res : listcam) final String packagename = res.activityinfo.packagename; final Intent intent = new Intent(captureIntent); intent.setcomponent(new ComponentName(res.activityInfo. packagename, res.activityinfo.name)); intent.setpackage(packagename); intent.putextra(mediastore.extra_out PUT, outputfileuri); cameraintents.add(intent); // Ajout des options de la caméra. captureintent.putextra(intent.extra_ini TIAL_INTENTS, cameraintents.toarray(new Parcelable[])); startactivityforresult(captureintent, PICTURE_REQUEST_CODE); 60

69 Le retour peut se faire sous trois formes : l Activity de prise de vue a réussi et le contenu est allé se mettre dans le fichier que nous avons indi qué ; la prise de vue a réussi et un autre fichier a été créé ; la prise de vue a réussi, mais le fichier n a pas pu être rem pli et les don nées sont pas sées en para mètres du retour. Sup po sons que nous avons une ImageView pour affi cher le résul tat de la cap ture, le code de retour devient alors : Dunod Toute reproduction non autorisée est un public void onactivityresult(int requestcode, int resultcode, Intent data) if(resultcode == MainActivity.RESULT_OK) if(requestcode == PICTURE_REQUEST_CODE) final boolean iscamera; if(data == null) iscamera = true; else final String action = data.getaction(); if(action == null) iscamera = false; else iscamera = action.equals(android.provider. MediaStore.ACTION_IMAGE_CAP TURE); Uri selectedimageuri; if(iscamera) selectedimageuri = outputfileuri; else 61

70 getdata(); selectedimageuri = data == null? null : data. if(selectedimageuri!= null) imageview.setimageuri(selectedimageuri); else if(outputfileuri!= null && outputfileuri. getpath()!= null && new File(outputFileUri.getPath()). exists()) imageview.setimageuri(outputfileuri); else if(data.getextras().get("data")!= null) imageview.setimagebitmap((bitmap) data.getextras(). get("data")); Ce qu il ne faut pas faire Comme pour la plu part des interations avec les compo sants sys tème sous Android, il faut être prudent : l image peut avoir été enre gis trée ou non, avoir un for mat d image quel conque et être modi fiable ou non. Il faut donc pré voir un maxi mum de pos si bi li tés et s appuyer sur les méthodes de mani pu la tion d image four nies dans l OS, jus qu au moment où celles- ci ne sont plus suf fi santes. Par exemple, dans le cas de l appli ca tion de filtres sur l image, il faut conver - tir la photo jus qu au moment où l on peut intéragir direc te ment avec les pixels, ou bien uti li ser les fonc tions inté grées, mais pas mélan ger les deux. Recette N 22 Contrô ler le flash de la caméra Ce qu il faut savoir Il est impor tant de noter que l allu mage du flash n écrase pas néces sai re ment la sélec tion de l uti li sa teur si celui- ci a demandé à ce qu il soit éteint ou auto ma tique. 62

71 Ce qu il faut faire La pre mière étape sera de contrôler la pré sence du flash sur l appa reil. Ceci pourra être effec tué via le code sui vant : context.getpackagemanager().hassystemfeature(packagemanager. FEATURE_CAMERA_FLASH); Une fois cette véri fi ca tion faite, nous pour rons acti ver le flash de la manière sui vante : Camera mycam = Camera.open(); Parameters camparameters = cam.getparameters(); camparameters.setflashmode(parameters.flash_mode_torch); mycam.setparameters(camparameters); mycam.startpreview(); De la même manière pour inter rompre le flash, nous pour rons procéder ainsi : mycam.stoppreview(); mycam.release(); Ce qu il ne faut pas faire Atten tion à bien cou per le flash lorsque celui- ci n est plus néces saire. Recette N 23 Inté grer la librai rie Zbar dans un pro jet Android Ce qu il faut savoir Zbar est un framework Open Source capable de lire la plu part des for mats de code-barres et de QR Code. 63

72 Nous allons uti li ser cette librai rie pour effec tuer le trai te ment de déco dage de l image et ainsi, récu pé rer la valeur conte nue dans les codes-barres scannés. Ce qu il faut faire Pour inté grer Zbar, qui est déve loppé en C, dans notre pro jet Android, nous avons besoin d uti li ser la JNI (Java Native Inter face). Nous avons alors deux pos si bi li tés : faire la compi la tion et le wrapper nous-même, uti li ser un wrapper pour Android. Pour des rai sons de commo di tés, nous allons uti li ser le wrapper ZBarAndroidSDK-0.2 ( il contient déjà les librai ries mais il est pos sible de les compi ler à par tir des sources de Zbar. Pour pou voir scan ner les codes- sbarres, nous avons besoin d uti li ser la caméra ; il nous faut donc ajou ter les per mis sions ainsi que les fonc tion na li - tés d auto fo cus dans le fichier Manifest : <uses permission android:name= android.per mission.camera /> <uses feature android:name= android.hardware.camera /> <uses feature android:name= android.hardware.camera.auto fo cus /> Une fois les fichiers ajou tés, il va nous fal loir lier Zbar à notre pro jet. Nous allons alors créer une classe char gée de gérér notre caméra qui héri - tera de SurfaceView et implé men tera SurfaceHolder.Callback. Puis notre Ativity sera char gée de trai ter le déco dage. Notre classe CameraPreview char gée de gérer l acqui si tion des images pro ve nant du péri phérique caméra hérite de la classe SurfaceView qui four - nie une sur face de des sin dans notre envi ron ne ment, dont on peut contrôler le for mat et la taille. Elle prend en charge le pla ce ment de la sur face à l écran. On implé mente éga le ment l inter face SurfaceHolder.Callback qui nous per met de rece voir les infor ma tions sur les chan ge ments pro ve nant de la sur face. 64

73 public class CameraPreview ex tends SurfaceView implements SurfaceHolder.Callback //surface qui contiendra l aperçu de la caméra private SurfaceHolder mholder; //Périphérique caméra (autorisations nécessaires dans le //manifest) private Camera mcamera; //Reception des trames du flux d image private PreviewCallback previewcallback; /*Mise au point de la caméra (déclaration d autofocus * dans le manifest pour éviter l installation sur * periphériques fixed focus */ /** * Construc teur publique par défaut (complet) context le contexte d exé cu tion camera le péri phérique à uti li ser previewcb la callback à uti li ser pour la preview autofocuscb la callback à uti li ser pour l auto fo cus */ public CameraPreview(Context context, Camera camera, PreviewCallback previewcb, AutoFocusCallback autofocuscb) super(context); mcamera = camera; previewcallback = previewcb; autofocuscallback = autofocuscb; Dunod Toute reproduction non autorisée est un délit. // Acti vation de la mise au point per ma nente si sup por tée, // sinon mise au point logi cielle (API >=9) Camera.Parameters parameters = camera.getparameters(); for (String focusmode : parameters. getsupportedfocusmodes()) if (focusmode == Parameters.FOCUS_MODE_CONTINUOUS_ PICTURE) parameters.setfocusmode(parameters.focus_mode_ CONTINUOUS_PICTURE); autofocuscallback = null; break; 65

74 // Ajout de SurfaceHolder.Callback pour les noti fi cations // de construc tion et des truc tion de la sur face mholder = getholder(); mholder.addcallback(this); public void surfacecreated(surfaceholder holder) // Une fois la sur face créée on active l aper çu de la // caméra. try mcamera.setpreviewdisplay(holder); catch (IOException e) Log.d( DBG, Erreur lors de l acti vation de l aper çu : + e.getmessage()); public void surfacedestroyed(surfaceholder holder) // Libé ra tion de l aper çu de la caméra quand la sur face // est détruite public void surfacechanged(surfaceholder holder, int for mat, int width, int height) // Ges tion des actions en cas de modification ou de // rota tion de l aper çu if (mholder.getsurface() == null) // Aper çu inexis tant return; // Arrêt de l aper çu avant toute modi fi ca tion try mcamera.stoppreview(); catch (Excep tion e) // Excep tion levée en cas d aper çu inexis tant. 66

75 try // Rota tion de l image pour suivre l orien ta tion du // péri phérique mcamera.setdisplayorientation(180); mcamera.setpreviewdisplay(mholder); mcamera.setpreviewcallback(previewcallback); mcamera.startpreview(); mcamera.auto Fo cus(autofocuscallback); catch (Excep tion e) Log.d( DBG, Erreur lors de l acti vation de l aper çu : + e.getmessage()); Recette N 24 Trai ter les infor ma tions ren voyées par Zbar pour la reconnais sance des sym boles Dunod Toute reproduction non autorisée est un délit. Ce qu il faut savoir Une fois Zbar inté gré à notre pro jet, nous pou vons cap tu rer des images puis les trai ter à l aide de la librai rie pour obte nir en retour l infor ma tion sto ckée dans le code-barres ou le QR Code concerné. Ce qu il faut faire Notre Activity prin ci pale est char gée du trai te ment des images venant de la camé ra pour y recher cher les codes-barres et récu pé rer les infor ma tions qu ils contiennent. 67

76 // On importe notre classe d acqui si tion des images import com.ex ample.cookbook_qrcode.camerapreview; public class MainActivity ex tends Activity private Camera mcamera; // Péri phérique caméra (autorisations nécessaires dans manifest) private CameraPreview mpreview; // Instantiation de notre classe CameraPreview private Handler autofocushandler; // Ges tion de l auto fo cus TextView scantext; Button scanbutton; ImageScanner scan ner; // Déco dage des codes barres private boolean barcodescanned = false; // Si un code-barres // est déjà scanné private boolean previewing = true; // Si prêt à scan ner // On charge la librai rie static public boolean oncreateoptionsmenu(menu menu) getmenuinflater().inflate(r.menu.main, menu); return true; public void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.main); autofocushandler = new Handler(); // Ins tance de notre caméra mcamera = getcamerainstance(); 68

77 // Notre logique de scan ner de codes barres scan ner = new ImageScanner(); // On fixe la den sité des passes du scan ner sur x et y scan ner.setconfig(0, Con fig.x_density, 3); scan ner.setconfig(0, Con fig.y_density, 3); // On ajoute l aper çu à notre layout mpreview = new CameraPreview(this, mcamera, previewcb, autofocuscb); FrameLayout preview = (FrameLayout)findViewById(R. id.camerapreview); preview.addview(mpreview); scantext = (TextView)findViewById(R.id.scanText); scanbutton = (Button)findViewById(R.id.ScanButton); Dunod Toute reproduction non autorisée est un délit. // Lan ce ment du scan, on relance le scan seule ment si un // résul tat est déjà trouvé scanbutton.setonclicklistener(new OnClickListener() public void onclick(view v) if (barcodescanned) barcodescanned = false; scantext.settext( Scan en cours... ); mcamera.setpreviewcallback(previewcb); mcamera.startpreview(); previewing = true; mcamera.auto Fo cus(autofocuscb); ); // On libère la caméra quand l appli ca tion n est plus // visible public void onpause() super.onpause(); releasecamera(); 69

78 // Créa tion ou récu pé ra tion de l ins tance de l objet Camera public static Camera getcamerainstance() Camera cam = null; try cam = Camera.open(); catch (Excep tion ex) // Caméra déjà instanciée return cam; // Libé ra tion de la caméra private void releasecamera() if (mcamera!= null) previewing = false; mcamera.setpreviewcallback(null); mcamera.release(); mcamera = null; // Auto fo cus logi ciel appelé quand // Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE // n est pas dis po nible sur l appa reil private Runnable doautofocus = new Runnable() public void run() if (previewing) mcamera.auto Fo cus(autofocuscb); ; PreviewCallback previewcb = new PreviewCallback() public void onpreviewframe(byte[] data, Camera camera) Camera.Parameters parameters = camera.getparameters(); Size size = parameters.getpreviewsize(); 70

79 Y800 ); getdata()); ; // Y800 => for mat pré féré en niveaux de gris 8bpp Image imgbarcode = new Image(size.width, size.height, imgbarcode.setdata(data); int result = scan ner.scanimage(imgbarcode); if (result!= 0) previewing = false; mcamera.setpreviewcallback(null); mcamera.stoppreview(); // Conte neur avec les résul tats du scan SymbolSet symbols = scan ner.getresults(); for (Symbol symbol : symbols) scantext.settext("résul tat : " + symbol. barcodescanned = true; Dunod Toute reproduction non autorisée est un délit. // Simu la tion de l auto fo cus AutoFocusCallback autofocuscb = new AutoFocusCallback() public void onautofocus(boolean success, Camera camera) // Appel de l auto fo cus logi ciel toutes les secondes autofocushandler.postdelayed(doautofocus, 1000); ; Notre appli ca tion est à présent capable de trai ter des codes-barres et des QR Code. 71

80 De nom breux outils sont dis po nibles pour géné rer des codes, nous pou vons notam ment citer : Ce qu il ne faut pas faire Lors de la créa tion d un QR Code re dirigeant vers une URL, il est impor tant que celui-ci pointe vers un domaine sur lequel vous avez tota le ment la main. En effet, de nom breuses socié tés se sont retrou vées coin cées suite à l édi tion de pros pec tus conte nant ces QR Codes qui re dirigeaient vers un site hébergé chez un tiers. En cas de litige avec ce tiers, il faut ré- imprimer les élé ments (et gérer ceux déjà impri més et dif fu sés). 72

81 Mails, SMS et calen Driers Chapitre 7 La fonc tion pre mière du télé phone est de pou voir joindre et de res ter joignable mais on a dépassé depuis long temps le simple stade de la commu ni ca tion télé pho nique vocale. L uti li sation des SMS et des mails fait par tie inté grante de l expé rience uti li sa teur avec l orga ni sa tion de son temps, per son nel ou pro fes sion nel, grâce aux dif fé rents calen driers et autres agen das syn chro - ni sés ou non. À l ins tar du cha pitre pré cé dent, la sou plesse d Android fait que nous n avons pas de garan tie quant à la pré sence d une ou plu sieurs appli ca tions de mes - sa ge rie mail ou même SMS sur le péri phérique où tour nera notre appli ca tion. Nous veille rons donc à lais ser le libre choix à l uti li sa teur dans la mesure du pos sible. Recette N 25 Envoyer un mail depuis une appli ca tion Ce qu il faut savoir Envoyer un sur Android peut par fois être un casse-tête : il existe plu - sieurs appli ca tions capables de faire l action cor res pon dant à «envoyer un mes sage». Inter agir avec une appli ca tion en par ti cu lier est pos sible, étant donné que l Intent déclaré est public, mais fer mer la pos si bi lité pour un uti li sa teur de choi sir l appli ca tion qui lui convient le mieux peut parfois paraître un peu extrême. Bien évi dem ment, le revers de la médaille c est que poten tiel le ment beau - coup d appli ca tions peuvent décla rer cet Intent : Facebook, WAYN, Twitter, en plus des appli ca tions de mail plus «clas siques». 73

82 Ce qu il faut faire Le code ci-après essaie d être res tric tif vis-à-vis des appli ca tions réel le ment , sans tou te fois sup pri mer l éven tuel dia logue «Quelle appli ca tion souhaitez- vous uti li ser pour ce type d action?» Aucune application mail n est présente/configurée Une seule application par mail configurée 74

83 Intent intent = new Intent(Intent.ACTION_SEND); // Le for mat text/plain pour texte géné rique ou // mes sage/rfc822 pour dis po ser d un texte enri chi. intent.settype("mes sage/rfc822"); String all s = null; ArrayList<String> list = null; if(new_list.equalsignorecase(listname)) list = new ArrayList<String>(); else list = MMServerInteraction.sharedInstance().get Lists(). get(listname); if(list == null) return; for(string e : list) if(all s == null) all s = e; else all s = all s+","+e; // String uritext = "mailto:" + all s + "?subject=" + Uri.encode("Titre : "+displayed.title) + "&body=" + Uri. encode("j ai trouvé cet article inté res sant, et sou haite le par ta ger avec vous.\n\n" + displayed.title + "\n"+originalurl); // Uri uri = Uri.parse(uriText); Dunod Toute reproduction non autorisée est un délit. // intent.setdata(uri); intent.putextra(intent.extra_ , list.toarray(new String[list.size()])); intent.putextra(intent.extra_subject, "Titre : " + displayed. title); intent.putextra(intent.extra_text, "J ai trouvé cet article intéressant, et souhaite le partager avec vous.\n\n" + displayed.title + "\n" + originalurl); startactivity(intent.createchooser(intent, "Partager par ")); 75

84 Ce qu il ne faut pas faire Le pas sage par les Intents signi fie que l on n a que très peu de contrôle sur l appli ca tion qui sera choi sie par l uti li sa teur pour envoyer votre mes - sage. Il se peut que celle- ci rajoute auto ma ti que ment une signa ture, change le formatage, etc. Il est donc impor tant d être à la fois le plus agnos tique pos sible, et le plus complet pos sible. Recette N 26 Ajou ter des élé ments à un mail Ce qu il faut savoir En plus du texte, le corps de notre mail peut être mis en forme et inté grer des images. Cette mise en forme se fera au tra vers d un formatage HTML stan dard. Ce qu il faut faire Pour l inté gra tion de pièces jointes dans votre , ces dernières doivent être acces sibles aux autres appli ca tions (dont celle de mail), et par consé - quent sto ckées dans le répertoire cor res pon dant à vos Externals. L atta che ment se fait ensuite de façon simple, après le EXTRA_TEXT, il suf fit de rajou ter un EXTRA_STREAM cor res pon dant au fichier : /** * methode basique d atta chement intent l Intent preconfigure d envoi f le fichier à atta cher */ void attachfileto intent(intent intent, File f) intent.putextra(intent.extra_stream, Uri.fromFile(f)); 76

85 Mes sage avec pièce jointe Dunod Toute reproduction non autorisée est un délit. Ce qu il ne faut pas faire Atten tion lors de l envoi d images ou de vidéos à ne pas inté grer des élé ments d une taille trop impor tante ce qui aurait pour consé quence un envoi par fois impos sible sans le Wifi ou encore un refus par le ser veur. 77

86 Recette N 27 Envoyer des SMS/MMS depuis une appli ca tion Ce qu il faut savoir Android per met l accès sim pli fié aux SMS depuis la classe SmsManager. Celle- ci est char gée de gérer le pro to cole le plus appro prié (GSM/CDMA), d enco der vos don nées, et de les envoyer. Le sys tème va même plus loin, vous per met tant d enchaîner l envoi de mes sage avec d autres par ties de votre appli ca tion, en fonc tion du résul tat de l envoi. Note : Atten tion! Les per mis sions SEND_SMS sont bien évi dem ment requises. Ce qu il faut faire Si l on sou haite envoyer un mes sage le plus sim ple ment pos sible, on peut faire comme suit : public void envoyersmstexte(string destinataire, String message) android.telephony.smsmanager mgr = android.telephony. SmsManager.getDefault(); // la selection manuelle de GSM/CDMA est deprecated mgr.sendtextmessage(des tinataire, null, message, null, null); Pour les deux der niers paramètres, il s agit des Intents à appe ler : en fin d envoi, à récep tion. 78

87 Récep tion de notre SMS Astuce : il est pos sible d envoyer des SMS entre les dif fé rentes ins tances de l émulateur, pour cela il suf fit d envoyer son iden ti fiant en tant que des ti na - taire (par exemple 5556). Dunod Toute reproduction non autorisée est un délit. senddatamessage La méthode senddatamessage, qui prend un port de des ti nation et un tableau d octets en lieu et place du texte du mes sage est la ver sion plus basse du pro to cole. On peut l uti li ser pour envoyer du texte que l appa reil est inca pable d affi cher, par exemple. Le port à uti li ser dépend de beau coup de choses, mais celui uti lisé le plus sou vent est L envoi de MMS, quant à lui, ne peut se faire qu au tra vers des Intents : public void sendimage(string des ti na taire, File pngimg) // PNG seule ment ici, adap ter le type en fonc tion Intent intent = new Intent(android.content.Intent.ACTION_ SEND); intent.settype("image/png"); intent.putextra("address", destinataire); intent.putextra(intent.extra_stream, Uri.fromFile(pngImg)); getactivity().getapplicationcontext().startactivity(intent. createchooser(intent, "Envoyer une image")); 79

88 Ce qu il ne faut pas faire L envoi de SMS sans vali da tion de l uti li sa teur est pos sible au niveau du code. Cepen dant toute appli ca tion qui le ferait serait en oppo si tion avec les condi - tions d uti li sation du Google Play Store. En effet, ce der nier men tionne : «N envoyez aucun SMS, aucun e- mail ni aucun autre mes sage au nom de l uti li sa teur sans don ner à celui- ci la pos si bi lité d en vali der le contenu et de confir mer le nom du des ti na taire sou haité.» Recette N 28 Ajou ter un événement dans un calen drier Ce qu il faut savoir L inter ac tion avec les calen driers se fait au tra vers des classes présentes dans CalendarContract et ses classes inté grées. Pour accé der aux calen driers, vous devez avoir les per mis sions requises (READ_CALENDAR et WRITE_CALENDAR). Ce qu il faut faire Pour lis ter les différents calen driers dis po nibles sur votre appa reil, uti li sez la méthode sui vante : /** * getcalendars un Cursor (struc ture iterative) des calen driers disponibles renvoit les parametres sui vants pour chaque calen drier: ID, compte, nom affi ché, nom interne, cou leur */ 80

89 public Cursor getcalendars() Uri uri = CalendarContract.Calendars.CONTENT_URI; String[] pro jec tion = new String[] CalendarContract.Calendars._ID, CalendarContract.Calendars.ACCOUNT_NAME, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, CalendarContract.Calendars.NAME, CalendarContract.Calendars.CALENDAR_COL OR ; CursorLoader cl = new CursorLoader(getActivity(). getapplicationcontext(), uri, pro jec tion, null, null, null); Cursor calendarcursor = cl.loadinbackground(); return calendarcursor; Une fois l ID du calen drier selectionné, un événement s ajoute de la sorte : Dunod Toute reproduction non autorisée est un délit. /** * ajouterevtaucalendrier * methode qui ajoute un evenement dans un calen drier debut date de debut de l evenement (java.util) fin date de fin de l evenement (java.util) titre titre de l évé ne ment description version longue de la description de l évènement l ID de l évé ne ment */ public String ajouterevtaucalendrier(date debut, Date fin, String titre, String des crip tion, int idcalendrier) // Construction des détails de l Event long startmillis = 0; long endmillis = 0; Calendar begintime = Calendar.getInstance(); begintime.settime(debut); startmillis = begintime.gettimeinmillis(); Calendar endtime = Calendar.getInstance(); endtime.settime(fin); endmillis = endtime.gettimeinmillis(); 81

90 // In sertion de l Event ContentResolver cr = getactivity().getcontentresolver(); ContentValues values = new ContentValues(); values.put(calendarcontract.events.dtstart, startmillis); values.put(calendarcontract.events.dtend, endmillis); values.put(calendarcontract.events.title, titre); values.put(calendarcontract.events.des CRIPTION, description); values.put(calendarcontract.events.calendar_id, idcalendrier); Uri uri = cr.in sert(calendarcontract.events.content_uri, values); // Récu père l ID pour un nou vel event String eventid = uri.getlastpathsegment(); return eventid; Il est éga le ment pos sible de pas ser par un Intent pour uti li ser l appli ca tion stan dard de ges tion du calen drier, de la façon sui vante : Intent intent = new Intent(Intent.ACTION_IN SERT).setType("vnd.android.cursor.item/event").putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begintime.gettimeinmillis()).putextra(calendarcontract.extra_event_end_time, endtime. gettimeinmillis()).putextra(calendarcontract.extra_event_all_day, false).putextra(events.title, title).putextra(events.des CRIPTION, description) //.putextra(events.event_loca TION, "Earth") // option nel, position //.putextra(events.rrule, "FREQ=DAILY;COUNT=10") // option nel, frequence.putextra(events.availability, Events.AVAILABILITY_BUSY) //.putextra(events.access_level, Events.ACCESS_PRIVATE) // option nel, visibilité //.putextra(intent.extra_ , "my.friend@ex ample.com") // option nel, invitations ; startactivity(intent); 82

91 Ce qu il ne faut pas faire Tous les calen driers ne se valent pas : cer tains sont par ta gés, cer tains sont en lec ture seule, etc. Il est impor tant de trou ver les bons argu ments pour ajou ter un évé ne ment au calen drier : s il est en lec ture seule, on ne pourra bien évi dem ment pas le modi fier. Recette N 29 Ajou ter une alarme dans un calen drier Ce qu il faut savoir Une alarme est appe lée CalendarContract.Reminder et est atta chée à un événement (au tra vers de son ID). Ce qu il faut faire Dunod Toute reproduction non autorisée est un délit. Par consé quent, le code pour ajou ter une alarme est très simi laire au pré cé - dent : on doit juste ajou ter la méthode pour inter agir avec l uti li sa teur, et le nombre de minutes avant l évé ne ment pour l alarme. /** * méthode qui ajoute une alarme (un évé ne ment qui pré vient l utilisateur) debut date de debut de l événement (java.util) fin date de fin de l événement (java.util) titre titre de l évé ne ment description version longue de la description de l événement methode l une des méthodes dis po nibles dans ReminderColumns: METHOD_ALARM/METHOD_ALERT/METHOD_DEFAULT/ METHOD_ /METHOD_SMS l ID du reminder */ 83

92 public String ajouteralerteaevenement(date debut, Date fin, String titre, String des crip tion, int idcalendrier, int minutes, String methode) long startmillis = 0; long endmillis = 0; Calendar begintime = Calendar.getInstance(); begintime.settime(debut); startmillis = begintime.gettimeinmillis(); Calendar endtime = Calendar.getInstance(); endtime.settime(fin); endmillis = endtime.gettimeinmillis(); // In sertion de l Event ContentResolver cr = getactivity().getcontentresolver(); ContentValues values = new ContentValues(); values.put(calendarcontract.reminders.dtstart, startmillis); values.put(calendarcontract.reminders.dtend, endmillis); values.put(calendarcontract.reminders.title, titre); values.put(calendarcontract.reminders.des CRIPTION, description); values.put(calendarcontract.reminders.calendar_id, idcalendrier); values.put(calendarcontract.reminders.method, methode); values.put(calendarcontract.reminders.minutes, minutes); Ce qu il ne faut pas faire Il est pos sible de déclen cher une alarme en fonc tion de la posi tion GPS de l uti li sa teur, ce qui peut être plus per tinent que d ajou ter une alarme qui ne se déclen chera pas au moment le plus oppor tun. 84

93 Recette N 30 Accé der au car net d adresses Ce qu il faut savoir Android four nit un car net d adresses per met tant de gérer notre base de contacts. Dans cette base, chaque entité est défi nie par dif fé rents élé ments tels que le nom, le pré nom, le numéro de télé phone, etc. L ensemble des appli ca tions du sys tème uti lisent cette base pour iden ti fier par exemple un nom ou une photo par rap port à un numéro de télé phone ou encore un mail. Par exemple si l on reçoit un mail d un contact déjà connu et dis po sant d une photo, cette der nière sera affi chée à côté du nom de l émet teur. Dunod Toute reproduction non autorisée est un délit. Contact ajouté au car net d adresses Résul tat à la récep tion du SMS précédent 85

94 Ce qu il faut faire Évidemment on a besoin d avoir les per mis sions READ_CONTACTS. Pour lis ter les contacts, il suf fit de créer un Cursor poin tant sur les dif fé rentes entrées du car net d adresses : Cursor cursor = getcontentresolver().query(contactscontract. CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); Pour les lis ter, il suf fit ensuite de faire : while (cursor.movetonext()) String name = cursor.getstring(cursor. getcolumnindex(contactscontract.commondatakinds.phone.display_ NAME)); String phonenumber = cursor.getstring(cursor. getcolumnindex(contactscontract.commondatakinds.phone.number)); // faire quelque chose avec name et phonenumber Ce qu il ne faut pas faire Accé der au car net d adresses n est pas une action ano dine et beau coup d appli ca tions ont subi une mau vaise presse parce qu elles récu pé raient les contacts des uti li sa teurs sans rai son évi dente. Depuis les règles de confi den - tia lité ont évo lué mais cela ne doit pas empê cher le déve lop peur de s assu rer de n accé der qu à des res sources utiles à l appli ca tion, et ce avec le consen - te ment de l uti li sa teur. 86

95 Uti li ser les noti Fi cations du sys tème Chapitre 8 Les noti fi cations sont un moyen simple d atti rer l atten tion de l uti li sa teur, quelle que soit l appli ca tion au pre mier plan, afin de lui indi quer que notre pro gramme dis pose de nou velles infor ma tions. L action pro vo quée par un tap sur une noti fi cation, et ce quel que soit le sys tème est de rame ner le pro - gramme au pre mier plan. Nous allons voir qu il existe plu sieurs types de notifications : locales, sys - tème et push. La dif fé rence prin ci pale en termes de fonc tion ne ment entre le type de noti fi - cation local/sys tème et push est que l on doit enre gis trer l appa reil auprès des ser vices de noti fi cation de Google et mettre en place un ser veur pour rece voir des noti fi cations en mode push, tan dis que leurs cou sines locales/sys tème ne néces sitent aucun para mé trage ni enre gis tre ment. Recette N 31 Uti li ser les notifications locales Ce qu il faut savoir Les noti fi cations locales sont envoyées à l inté rieur même de l appli ca tion grâce au LocalBroadcastManager, ainsi on obtient une sécu rité accrue en ne pre nant pas le risque d envoyer des infor ma tions en dehors de l appli ca tion. Récep tion du mes sage dans les logs 87

96 Ce qu il faut faire Notre Activity gère l émis sion et la récep tion des noti fi cations locales : public class MainActivity ex tends Activity public void onresume() super.onresume(); // On ins crit mmessagereceiver auprès du ges tion naire et // on filtre les éléments mon- event. LocalBroadcastManager.getInstance(this). registerreceiver(mmessagereceiver, new IntentFilter ( mon-event )); // Ges tion de la récep tion des intents pour les évé ne ments // de type mon- event private BroadcastReceiver mmessagereceiver = new public void onreceive(context context, Intent intent) // On va lire les don nées mes sage de l intent reçu String mes sage = intent.getstringextra( message ); Log.d( receiver, Mes sage reçu : + message); protected void onpause() // On désinscrit mmessagereceiver quand l acti vité n est // pas visible LocalBroadcastManager.getInstance(this). unregisterreceiver(mmessagereceiver); super.onpause(); 88

97 // Cette méthode est assi gnée au bou ton btnsend grâce à la // pro priété onclick dans le layout public void onclick(view view) Log.d( sender, Envoi d un message ); sendmessage(); // Fonc tion d envoi de mes sage avec l intent mon- event. private void sendmessage() Intent intent = new Intent( mon-event ); intent.putextra( message, Données de mon message. ); LocalBroadcastManager.getInstance(this). sendbroadcast(intent); Ce qu il ne faut pas faire Bien que pra tiques, il est recom mandé de ne pas abu ser des noti fi cations afin de ne pas sur char ger l uti li sa teur d infor ma tions. Gar dons en tête que la plu part des appli ca tions actuelles pro posent un sys tème de noti fi cation, ce qui peut lar ge ment contri buer à l aga ce ment de cer tains uti li sa teurs qui se ver raient noyés sous les mes sages et désinstalleraient l appli ca tion. Recette N 32 Uti li ser les notifications système Ce qu il faut savoir Les noti fi cations sont géné rées par l appli ca tion à des ti nation du sys tème, comme par exemple pré ve nir qu un SMS a été reçu. Cette noti fi cation apparait dans la barre de noti fi cation Android, si l uti li sa teur a auto risé l appli ca tion à uti li ser ces noti fi cations, on peut éga le ment gérer les inter ac tions sur cette noti fi cation ; nous allons voir comment un clic peut être traité par l appli ca tion qui a émis la noti fi cation. 89

98 Ce qu il faut faire Dans notre Activity prin ci pale, nous créons la méthode char gée d envoyer la noti fi cation. public class MainActivity ex tends Activity //... // Cette méthode est assi gnée au bou ton btnsend grâce à la // pro priété onclick dans le layout public void onclickcreatenotification(view view) // Intent déclenché lors de la demande de noti fi cation Intent intent = new Intent(this, ReceiverActivity.class); PendingIntent pintent = PendingIntent.getActivity(this, 0, intent, 0); // Créa tion des noti fi cations // On uti lise addaction (API >= 16) avec le même intent // pour l exemple Noti fi cation noti fi cation = new Noti fi cation.builder(this).setcontenttitle( Titre noti fi cation ).setcontenttext( Détails de la noti fi cation ). setsmallicon(r.drawable.ic_launcher).setcontentintent(pintent).addaction(r.drawable.ic_launcher, Réveil, pintent).addaction(r.drawable.ic_launcher, Café, pintent). build(); // On récu père le ges tion naire de noti fi cation NotificationManager notificationmanager = (NotificationManager) getsystemservice(noti FI CATION_SER VICE); // On cache le ges tion naire après l appel noti fi cation.flags = Noti fi cation.flag_auto_can CEL; // On envoie les noti fi cations au ges tion naire notificationmanager.notify(0, noti fi cation); Nous fai sons appel à l Activity ReceiverActivity.class en cas de clic sur la noti fi cation qui est liée au layout actitvity_noti fi cation_ result qui ne contient qu un TextView pour notre exemple. 90

99 public class ReceiverActivity ex tends protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.actitvity_noti fi cation_result); Notification système envoyée par notre application Ce qu il ne faut pas faire Ces noti fi cations sont gérées au sein de l appli ca tion, ce qui sup pose donc que cette même appli ca tion soit lan cée. Afin de pou voir contac ter le péri phérique à tout moment, il convient de s orien ter vers des noti fi cations dis tantes et non locales. Recette N 33 Noti fi cations push avec le GCM Ce qu il faut savoir Pour les noti fi cations push nous uti li sons le Google Cloud Messaging (GCM) ancien ne ment Cloud to Device Messaging (C2DM). Les noti fi cations push sont archi tec tu rées autour de 3 points : le ser veur de noti fi cation GCM (Google), 91

100 le ser veur appli ca tif d où seront envoyés les mes sages (Nous), le péri phérique Android qui contient l appli ca tion (Nous/Client). Donc, en plus de notre appli ca tion, il fau dra mettre en place un sys tème d envoi des noti fi cations qui ira s authen ti fier auprès des ser veurs GCM et qui trans mettra la noti fi cation aux péri phériques sou hai tés. Compte Google et SDK Avant de commen cer, il faut créer un compte Google, créer un API Project et acti ver le Cloud Messaging pour Android. Cela nous per met tra d obte nir un iden ti fiant (Project Id), de géné rer une clé ser veur (Key for server apps (with IP locking)) dans l onglet API Access pour authen ti fier notre sys tème d envoi des noti fi cations auprès des ser vices GCM. Nous allons uti li ser les helper librai ries du GCM qui per mettent de sim pli fier l uti li sation du GCM, ce n est pas obli ga toire mais cela fait par tie des bonnes pra tiques pré co ni sées par Google. Il faut télécharger le SDK, on le fait direc te ment grâce au SDK Mana ger, il suf fit de cocher Extras > Google Cloud Messaging for Android Library et d a ccepter la licence d uti li sation. Installation du GCM avec Android SDK Manager Une fois téléchargée, il suf fit d inté grer gcm.jar au pro jet. Note : Il faut pen ser à chan ger la cible de l émulateur, si vous l uti li sez et que ce n est pas déjà fait, pour poin ter vers Google API au lieu de Android, sinon cela ne mar chera pas ; ceci est valable pour tous les déve lop pe ments uti li sant les compo sants Google, qui ne sont pas pré sents par défaut. 92

101 Ce qu il faut faire Pour uti li ser le GCM notre appli ca tion doit y être auto ri sée, on modi fie donc le Manifest en consé quence. Per mis sions spé ci fiques à notre appli ca tion : <permission android:name= com.ex ample.cookbook_noti fi cation. permission.c2d_mes SAGE android:protectionlevel= signa ture /> <uses permission android:name= com.ex ample.cookbook_noti fi - cation.per mission.c2d_mes SAGE /> Per mis sions géné rales : <!-- Récep tion mes sages GCM. --> <uses permission android:name= com.google.android.c2dm. per mis sion.receive /> <!-- Connexion GCM aux Google Ser vices. --> <uses permission android:name= android.per mis sion.inter NET /> <!-- GCM néces site un compte Google. --> <uses permission android:name= android.per mis sion.get_accounts /> <!-- Empêche la mise en veille quand un mes sage est reçu. --> <uses permission android:name= android.per mission.wake_lock /> Dunod Toute reproduction non autorisée est un délit. Le BroadcastReceiver qui gère les 2 Intents envoyés par le GCM à mettre dans la sec tion appli ca tion : <receiver android:name= com.google.android.gcm.gcmbroadcastreceiver android:permission= com.google.android.c2dm.permission.send > <intent- filter> <action android:name= com.google.android.c2dm.intent. RECEIVE /> <action android:name= com.google.android.c2dm.intent. REGISTRATION /> <!-- Uti lisé pour les API < > <category android:name= com.ex ample.cookbook_noti fi cation /> </intent- filter> </receiver> 93

102 Astuce : Les Intents sont défi nis dans le Manifest plu tôt que dans l appli - ca tion elle- même car cela per met de les rece voir même quand l appli ca tion n est pas lan cée. Et enfin le ser vice appelé par GCMBroadcastReceiver, à pla cer éga le - ment dans la sec tion appli ca tion : <service android:name=.gcmintentservice /> Il s agit du nom que nous avons donné à la classe de notre futur ser vice. Nous allons ensuite créer notre Activity prin ci pale. Celle- ci n a pour but que d enre gis trer le péri phérique auprès des ser veurs GCM : import com.google.android.gcm.gcmregistrar; public class MainActivity ex tends Activity // Numéro qui cor res pond à notre Project ID Google private static final String SENDER_ID = XXXXXXXXXXXX protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); // On véri fie que le péri phérique sup port GCM GCMRegistrar.checkDevice(this); // On véri fie que le Manifest contient toutes les infor ma tions // néces saires // Peut-être retiré avant la mise en pro duc tion GCMRegistrar.checkManifest(this); final String regid = GCMRegistrar.getRegistrationId(this); if (regid.equals( )) GCMRegistrar.register(this, SENDER_ID); // On afiche le numéro d enre gis tre ment dans les logs if (GCMRegistrar.isRegistered(this)) Log.d("GCM", "Enre gis tre ment : " + GCMRegistrar. getregistrationid(this)); 94

103 Nous allons ensuite créer notre ser vice. Il sera chargé de trai ter les noti fi - cations push, nous en pro fi tons éga le ment pour uti li ser les noti fi cations sys - tème que nous avons vues pré cé dem ment : public class GCMIntentService ex tends com.google.android.gcm. protected void onerror(context arg0, String arg1) /* * Appe lée quand le péri phérique essaye de s ins crire ou se désinscrire * et que le GCM retourne une erreur. */ Log.d( GCM, Erreur GCM : + arg1.tostring()); Dunod Toute reproduction non autorisée est un protected void onmessage(context arg0, Intent arg1) /* * Appe lée quand notre ser veur envoie un mes sage au GCM et que * celui- ci l envoie au péri phérique. * Si le mes sage contient des don nées (payload) son contenu est * dis po nible en tant qu extras dans l Intent. */ Log.d( GCM, Mes sage GCM reçu : + arg1. getstringextra("mes sage")); sendnotification(arg0, arg1.getstringextra("mes protected void onregistered(context arg0, String arg1) /* * Appelée quand une demande d ins crip tion est reçue et passe en * para mètre le registration ID assi gné par le ser veur GCM au couple * péri phérique/appli ca tion. * Cet ID devrait être envoyé à notre ser veur pour qu il puisse 95

104 * nous envoyer des noti fi cations push. */ Log.d("GCM", "Ins crip tion GCM : " + protected void onunregistered(context arg0, String arg1) /* * Appe lée une fois le péri phérique désinscrit du GCM. * Cet ID devrait être envoyé à notre ser veur pour qu il puisse * nous désinscrire de sa liste. */ Log.d( GCM, Désinscription GCM : + arg1.tostring()); /** * On informe l uti li sa teur de la noti fi cation push par une * noti fi cation dans android */ public void sendnotification(context context, String mes sage) // Intent déclen ché lors de la demande de noti fi cation Intent intent = new Intent(this, ReceiverActivity.class); PendingIntent pintent = PendingIntent.getActivity(this, 0, intent, 0); // Créa tion des noti fi cations Noti fi cation noti fi cation = new Noti fi cation.builder(this).setcontenttitle( Push GCM ).setcontenttext(mes sage).setsmallicon(r.drawable. ic_launcher).setcontentintent(pintent).build(); // On récu père le ges tion naire de noti fi cation NotificationManager notificationmanager = (NotificationManager) getsystemservice(noti FI CATION_SER VICE); // On cache le ges tion naire après l appel noti fi cation.flags = Noti fi cation.flag_auto_can CEL; // On envoie les noti fi cations au ges tion naire notificationmanager.notify(0, noti fi cation); 96

105 Mes sage push envoyé depuis notre ser veur. Pour que tout cela fonc tionne, il faut pou voir envoyer notre demande auprès des ser veurs du GCM qui se char ge ront d envoyer la noti fi cation à notre appli ca tion. Nous allons mon trer rapi de ment comment cela fonc tionne. Pour des rai sons de sim pli cité, notre exemple est en PHP et aucune ges tion n est implé men tée, il montre juste le prin cipe de fonc tion ne ment. Il fau drait donc rajou ter au mini mum l ins crip tion/désinscription de nos péri - phériques grâce à l id fourni lors de l ins crip tion de l appli ca tion au GCM <?php // La clé que nous avons générée pour notre pro jet $apikey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // Server API key Dunod Toute reproduction non autorisée est un délit. // Le numéro d enre gis tre ment de tous nos péri phériques // (reçu par le péri phérique Android lors de l enre gis tre ment) // Il est bien sûr recom mandé de sto cker ces infor ma tions dans // une base de don nées per met tant de gérer vos uti li sa teurs $registrationids = array( "APA-EnwHlV6Iiy5fSP9Nhaw09wjBouYjOopPwQk02--0F9lOQl7eioésx_eqLeTFYq_OsfvNIXiPk-0_ ukqk0dafqzdvap4s85vshcs3pbd-dktoopjepgybkvdwt6ayobycoj_ aqbi5p6odjtu" ); // Mes sage envoyé $message = Mes sage push de test GCM. ; // Les infor ma tions pour trans mettre notre demande en mode POST $url = ; $fields = array( registration_ids => $registrationids, data => array( message => $message ), ); 97

106 $headers = array( ); Authorization: key=. $apikey, Content- Type: appli ca tion/json // On ouvre la connexion $ch = curl_init(); // On met en place nos para mètres curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) ); // On envoie $result = curl_exec($ch); // On ferme la connexion curl_close($ch); // On afiche notre résul tat // Si vous n avez aucun résul tat alors cela ne fonc tionne pas du tout echo Résul tat :.$result;?> On obtient un résul tat de ce genre quand la demande a été trai tée cor rec - te ment : Résultat : "multicast_ id": ,"success":1,"failure":0,"canonical_ ids":0,"results":["mes sage_ id":"0: %5c041308f9fd7ecd"] 98

107 Ce qu il ne faut pas faire Très pra tique d un point de vue édi teur, il est ten tant de vou loir uti li ser la noti fi cation push. Il faut gar der à l esprit que l uti li sa teur n aura cer tai ne ment pas que votre appli ca tion d ins tal lée et pourra vite se retrou ver sous une mon - tagne de noti fi cations. Même si le GCM per met de n envoyer que le der nier mes sage d un type donné (défini au moment de l envoi du mes sage par le ser veur) il est judi cieux de ne pas abu ser de cette fonc tion na lité. 99

108

109 Inté gra tion de publi cité Chapitre 9 L essor rapide des usages liés au mobile a fait naître un nou veau média per - met tant aux annon ceurs d atteindre leur cible. Au fur et à mesure que le nombre d uti li sa teurs et d appli ca tions croît, dif fé rents dis po si tifs de régies publi ci taires ont vu le jour pour per mettre aux déve lop peurs d inté grer de la réclame dans leurs appli ca tions et de pou voir en tirer béné fice. Également, ce nou veau mar ke ting mobile per met d adap ter le mes sage à l uti li sa teur en pre nant en compte de nou velles métriques peu uti li sées à ce jour, comme la loca li sa tion de l uti li sa teur par exemple. La pre mière chose qui vient à l esprit quand on parle de publi cité en ligne et d Android est la société Google, il n est donc pas éton nant de trou ver leurs solu tions packagées pour ce sys tème d exploi ta tion. Dans cette par tie, nous allons voir comment inté grer de la publi cité dans nos appli ca tions grâce à AdMob pour des rai sons de sim pli cité mais il faut noter que ce n est évi dem ment pas la seule régie publi ci taire dis po nible. Puis nous ver rons éga le ment comment opti mi ser l affi chage, comme par exemple ne rien affi cher si les annonces ne sont pas dis po nibles. Recette N 34 Créer un compte AdMob Ce qu il faut savoir Pour pou voir uti li ser le SDK AdMob il faut créer un compte et obte nir un iden - ti fiant d édi teur (publisher id). Ce qu il faut faire La créa tion de compte se fait à l adresse sui vante : 101

110 Une fois connecté, il faut créer le lien pour votre appli ca tion dans l onglet «Sites & Apps». Onglet Sites & Apps de l inter face AdMob Notre appli ca tion s appelle «test», il faut sai sir le nom de l appli ca tion, inutile de mettre quoi que ce soit pour l URL tant que notre appli ca tion est en cours de déve lop pe ment. Nous obte nons alors un iden ti fiant d édi teur qu il faut ren sei gner dans le code de notre appli ca tion. Emplacement du Publisher ID 102

111 Ce qu il ne faut pas faire L uti li sation de régie publi ci taire est enca drée par les condi tions d uti li sation du ser vice. Même si cela semble évident pour évi ter de géné rer des clics sur ses propres publi ci tés et avoir du contenu dis po nible à tout moment on uti lise le mode de test. Dans le cas où l appli ca tion aurait été publiée avec le mode de test activé dans le code, il est pos sible de le désactiver dans le para mé trage de l appli ca tion dans l inter face web en sélec tion nant «Disable test mode for all requests» le temps de cor ri ger le pro blème. Paramètrage de l appli ca tion AdMob : Test mode. Recette N 35 Intégrer le SDK AdMob dans un pro jet Ce qu il faut savoir Dunod Toute reproduction non autorisée est un délit. Une fois la librai rie téléchargée, il faut l'ajou ter au pro jet. À l heure où nous rédi geons ces lignes, il s agit de la ver sion (GoogleAdMobAdsSdk jar). Ce qu il faut faire Pour pou voir uti li ser le SDK nous allons modi fier le Manifest pour ajou ter nos per mis sions et notre Activity. 103

112 Per mis sions : <uses permission android:name= android.per mis sion.inter NET /> <uses permission android:name= android.per mission.access_ NETWORK_STATE /> Activity : <activity android:name= com.google.ads.adactivity android:configchanges= keyboard keyboardhidden orien tation screenlayout uimode screensize smallestscreensize /> Le contrôle chargé d affi cher la publi cité contient des para mètres spé ci - fiques, il faut donc ajou ter leur défi ni tion dans le layout, activity_main. xml dans notre cas. xmlns:ads=" Notre contrôle peut alors être ajouté : <com.google.ads.adview xmlns:googleads= google.ads android:layout_width= fill_parent android:layout_height= wrap_content googleads:adsize= SMART_BAN NER /> Il y a aussi la pos si bi lité d indi quer ici que nous sommes en mode de test, ce qui a pour consé quence de ne pas comp ta bi li ser les clics et de tou jours avoir une publi cité de dis po nible pour l affi cher dans notre appli ca tion avec la ligne sui vante : googleads:testdevices="test_emulator" On peut éga le ment lan cer les publi ci tés dès le char ge ment avec la commande sui vante : googleads:loadadoncreate="true" 104

113 Le mieux reste encore de gérer cela direc te ment dans le code. Si la confi gu ra tion n est pas bonne, un mes sage d erreur apparaît dans le contrôle en mode gra phique dans notre édi teur. Conseil : Pen sez à consul ter le LogCat avec le tag «Ads», son aide sera sou vent pré cieuse car, même si le contrôle est vide, cela ne veut pas dire qu il n est pas fonc tion nel. Ads : To get test ads on this device, call adrequest. addtestdevice(adrequest.test_emulator); Ads : onfailedtoreceivead(ad request successful, but no ad returned due to lack of ad inventory.) Ce qu il ne faut pas faire Il faut évi ter de défi nir le même para mé trage, comme le mode de test, dans le Manifest et dans le code sous peine de publier une appli ca tion qui pourra paraître non ter mi née. Recette N 36 Gérer les publi ci tés Dunod Toute reproduction non autorisée est un délit. Ce qu il faut savoir Les publi ci tés ne sont pas tou jours dis po nibles, que ce soit pour des pro - blèmes de connectivité réseau mais éga le ment parce qu aucune ne cor res - pond aux filtres qui ont été mis place. Il faut donc gar der à l esprit que le layout pourra chan ger de forme ou tout sim ple ment inté grer un espace vide. 105

114 Ce qu il faut faire Nous commen çons par impor ter les dépen dances pour AdMob : import com.google.ads.ad; import com.google.ads.adlistener; import com.google.ads.adrequest; import com.google.ads.adview; import com.google.ads.adrequest.errorcode; Pour monitorer ce qui se passe, nous allons uti li ser un listener qui va nous per mettre de réagir en fonc tion des dif fé rents retours pour, par exemple, cacher le ban deau de publi cité quand le réseau est blo qué ou qu une erreur empêche la récep tion et ainsi opti mi ser notre affi chage au maxi mum. private class MyAdListener implements public void ondismissscreen(ad arg0) // Lors qu une publi cité a été cliquée et que l on // retourne à l appli ca tion madstatus.settext( Retour après clic sur une publi cité public void onfailedtoreceivead(ad arg0, ErrorCode arg1) // Lorsqu une erreur empêche de rece voir la publi cité madstatus.settext( Erreur : + arg1.tostring() + \npub : + R.string.error_receive_ad); // On masque le ban deau de publi cité if (madview.getvisibility() == AdView.VISIBLE) public void onleaveapplication(ad arg0) // Lors qu une publi cité est cliquée et lance une acti vité // qui quitte l appli ca tion (e.g. Navi ga teur web) madstatus.settext( Publi cité cliquée et creation activité 106

115 externe public void onpresentscreen(ad arg0) // Lors qu une publi cité est cliquée et lance une acti vité // interne (pub en plein écran) madstatus.settext( Publi cité cliquée et creation activité interne public void onreceivead(ad arg0) // Lors qu une publi cité est reçue madstatus.settext( Publi cité reçue ); // On afiche le ban deau de publi cité s il est caché if (madview.getvisibility() == AdView.GONE) madview.setvisibility(view.visible); Main te nant que notre Listener est créé, nous allons l implé men ter dans notre Activity. Pour des rai sons de sim pli cité nous sommes dans l Activity prin ci pale. Dunod Toute reproduction non autorisée est un délit. public class MainActivity ex tends Activity private AdView madview; private TextView protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); // TextView qui afi chera les actions pour notre exemple madstatus = (TextView) this.findviewbyid(r.id.status); // Contrôle uti lisé pour l afi chage des publi ci tés madview = (AdView) this.findviewbyid(r.id.pub); // On enre gistre notre écou teur qui ser vira à gérer les publicités 107

116 madview.setadlistener(new MyAdListener()); AdRequest adrequest = new AdRequest(); // On met en place le mode de test // ATTEN TION : il fau dra le supprimer lors de la // publi ca tion de l appli ca tion adrequest.addtestdevice(adrequest.test_emulator); // On peut éga le ment orien ter les publi ci tés que l on sou haite diffu ser avec des mots clés //adrequest.addkeyword( games ); // On charge le module de publi cité madview.loadad(adrequest); //... Affichage de la publicité en mode paysage Ce qu il ne faut pas faire Si l on fait le choix de cacher la publi cité lorsque celle- ci n est pas dis po nible, il faut faire atten tion au layout qui verra son contenu modi fier avec potentiellement une rup ture de l orga ni sa tion des contrôles. 108

117 QUA TRIème PAR TIE Inter agir avec des ser Vices à dis tance Commu ni ca tions syn chrones et asyn chrones Chapitre 10 Recette N 37 Recupérer des don nées simples Ce qu il faut savoir Avec la mul ti pli cation des appli ca tions multiplateformes (et web), le prin ci pal sys tème d échanges de don nées est le WebService, qui uti lise géné ralement le pro to cole HTTP et des requêtes rela ti ve ment simples. Ce qu il faut faire Le pro to cole HTTP est construit autour d une idée simple : celle d une commu - ni ca tion qui comprend de pré fé rence un unique échange ques tion/réponse. Par exemple, lors qu on charge une page web, on se connecte sur le port 80 du ser veur (port stan dard défini auprès de l IANA), et on envoie la commande «GET /».

118 En retour, le ser veur nous ren voie le texte (sous forme de HTML) cor res pon - dant à la page d accueil. Une fois cette page char gée en mémoire, le code est par couru par le moteur de rendu, qui iden ti fie les fichiers sup plé men taires à récu pé rer (images, css, scripts), et envoie les requêtes sup plé men taires, par exemple «GET /logo.png» Une fois tous les élé ments récu pérés, le moteur les assemble et les affiche. Une requête HTTP est donc rare ment compo sée d un seul échange avec le ser veur : les sys tèmes d authen ti fi cation, le pas sage en SSL, etc. requièrent des connexions mul tiples et ité ra tives. C est pour cela que l on peut char ger une page web dans des condi tions extrêmes, où l on chan ge rait par exemple de rou tage réseau (EDGE/3G/Wifi) sou vent, chaque élé ment étant chargé dans une connexion à part. Sur Android, la commu ni ca tion réseau n a pas le droit d être effec tuée sur le thread principal (aussi appelé UI thread). Par consé quent, la norme est de démar rer des tâches de fond pour l acti - vité réseau, soit au tra vers de la classe Thread (en fai sant par exemple new Thread(Runnable).start()), soit au tra vers de Tasks (en fai sant par exemple AsyncTask.execute(Runnable)). Dans son expres sion la plus basique, la commu ni ca tion sur le réseau est natu relle en Java : comme pour les fichiers, les connexions réseau consistent en fait à mani pu ler des Streams. Par exemple, lire le contenu d une URL sous forme de chaîne de carac tères depuis un ser veur web : String readcontentsofurl(string urlstr) throws IOException URL url = new URL(urlStr); HttpURLConnection urlconnection = (HttpURLConnection) url. openconnection(); InputStream in = urlconnection.getinputstream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String result, line = reader.readline(); result = line; while((line=reader.readline())!= null) result += line + \n ; return result; 110

119 Atten tion, cette fonc tion ne peut pas être appe lée par un tap, ou une quel - conque action venant du thread prin ci pal. Java per met la décla ra tion de classes ano nymes tem po raires pour ce genre de choses : public void onclick(view v) Thread t = new Thread(new public void run() try System.out.println(readContentsOfURL(" google.com")); catch(ioexception ioe) System.err.println("Error reading the URL"); System.err.println(e.getLocalizedMessage()); ); t.start(); Ceci est stric te ment équi va lent (en termes de nombre de threads créés, et méca nisme géné ral) à : Dunod Toute reproduction non autorisée est un délit. public void onclick(view v) AsyncTask.execute(new public void run() try System.out.println(readContentsOfURL(" google.com")); catch(ioexception ioe) System.err.println("Error reading the URL"); System.err.println(e.getLocalizedMessage()); ); L avan tage du Thread est qu on peut rendre l opé ra tion syn chrone en appe lant t.join(). Par exemple, une classe qui charge une image de façon syn chrone : 111

120 public class HTTPImageLoader private String imageurl = null; private Drawable image = null; public HTTPImageLoader(String urlstr) this.imageurl = urlstr; public Drawable getimage() if(imageurl == null image!= null) return image; Thread t = new Thread(new public void run() try URL url = new URL(imageURL); HttpURLConnection urlconnection = (HttpURLConnection) url.openconnection(); InputStream in = urlconnection.getinputstream(); image = Drawable.createFromStream(in, null); catch(malformedurlexception m) System.err.println( L URL + imageurl + n est pas correcte ); catch(ioexception io) System.err.println( Le char ge ment de l URL + imageurl + " a échoué avec l erreur sui vante : + io.getlocalizedmessage()); ); t.start(); try // Attendre la fin du char ge ment t.join(); catch (InterruptedException e) e.printstacktrace(); return image; 112

121 Cette classe s uti lise de la manière sui vante : HTTPImageLoader il = new HTTPImageLoader(" android.com/assets/images/dac_logo.png"); Drawable img = il.getimage(); System.out.println(img.getIntrinsicHeight() + " ; " + img. getintrinsicwidth()); Ce qui nous donne dans la console : System.out(1055): 13 ; 62 Ce qu il ne faut pas faire Dans l exemple ci- dessus, le téléchargement d une image peut prendre plu - sieurs secondes, ce qui peut blo quer les inter ac tions avec l uti li sa teur. Ce cas de figure n est bien entendu pas recom mandé puis qu il dégra derait for te ment l expé rience uti li sa teur. Il serait pré fé rable de réa li ser le téléchargement en tâche de fond, une tech nique que l on appelle éga le ment tâche asyn chrone. Recette N 38 Récupérer des données de manière asyn chrone Ce qu il faut savoir Comme vu pré cé dem ment, Android n auto rise pas les commu ni ca tions réseaux stan dards sur le thread prin ci pal. Par défi ni tion, le sys tème est donc asyn chrone, dans la mesure où l on sait quand cela démarre, mais pas néces - sai re ment quand ça s arrête. Le pro blème consiste donc géné ra le ment à mettre en place un sys tème de noti fi cation ou de callback, qui per met de réagir à la fin du char ge ment. 113

122 Ce qu il faut faire Pour être prag ma tique, il est nor mal de fonc tion ner de manière simi laire au sys tème des Listeners, présent dans la plu part des packages Java, et par exten sion Android, ou d uti li ser les classes internes et les scopes afin d appe - ler des méthodes de la classe appe lante. Méthode 1 : Listeners public inter face AsyncListener public void chargementtermine(url u, String contenu); public class AsyncLoader ex tends Thread private URL urlacharger = null; private AsyncListener delegate = null; public AsyncLoader(URL u, AsyncListener l) urlacharger = u; delegate = l; public void run() try HttpURLConnection urlconnection = (HttpURLConnection) urlacharger.openconnection(); InputStream in = urlconnection.getinputstream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String result, line = reader.readline(); result = line; while((line=reader.readline())!=null) result+=line+ \n ; delegate.chargementtermine(urlacharger, result); catch(malformedurlexception m) System.err.println( L URL + urlacharger + n est pas correcte ); catch(ioexception io) System.err.println( Le char ge ment de l URL + urlacharger + a échoué avec l erreur sui vante : + io.getlocalizedmessage()); 114

123 Méthode 2 : classes internes public abstract class AsyncLoader protected void chargementtermine(url u, String contenu); // À sur char ger par les classes qui ser vi ront au char ge ment protected void chargercontenu(url u) new Thread(new Runnable() public void run() try HttpURLConnection urlconnection = (HttpURLConnection) u.openconnection(); InputStream in = urlconnection.getinputstream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String result, line = reader.readline(); result = line; while((line=reader.readline())!=null) result+=line+ \n ; chargementtermine(u, result); catch(malformedurlexception m) System.err.println( L URL + urlacharger + n est pas correcte ); catch(ioexception io) System.err.println( Le char ge ment de l URL + urlacharger + a échoué avec l erreur sui vante : + io.getlocalizedmessage()); Dunod Toute reproduction non autorisée est un délit. ).start(); Pour uti li ser ce méca nisme, il suf fit de faire quelque chose du genre : public class ChargementPageGoogle ex tends AsyncLoader protected void chargementtermine(url u, String contenu) // Faire quelque chose avec contenu public ChargementPageGoogle() chargercontenu(new URL( )); 115

124 Ce qu il ne faut pas faire Dans le cas d un téléchargement asyn chrone, atten tion à ne pas tenter de trai ter les don nées qui ne seraient pas encore affi chées, au risque d affi cher des infor ma tions fausses ou par tielles. Il est inté res sant de main te nir des don nées en cache pour dis po ser d une base d infor ma tion. Recette N 39 Envoyer des requêtes spé ci fiques au ser veur Ce qu il faut savoir L inté rêt majeur de la commu ni ca tion réseau est de récu pé rer des don nées para mé trées : flux de nou velles en RSS, liste des tâches à effec tuer, infor - ma tions contex tuelles, etc. Il faut donc pou voir pas ser des infor ma tions au ser veur, pour obte nir une réponse cir constanciée. Les pro to coles du Web, et plus par ti cu liè re ment HTTP, fonc tionnent sur le modèle d une liste d asso cia tions clef/valeur, comme par exemple : nom = "Developpeur" = "[email protected]" date = 01/01/1970 Ce qu il faut faire Deux méthodes sont pos sibles pour faire pas ser ces para mètres. La ver - sion la plus ancienne (qu on appelle commu né ment GET) est de rajou ter un point d inter ro ga tion à la fin de l URL, suivi des para mètres sépa rés par des esperluettes. 116

125 Par exemple : L avan tage évident de cette méthode est sa sim pli cité : on conca tène les chaînes, et on récu père le résul tat. GET ou POST La méthode GET pose de sérieux pro blèmes de sécu rité : n importe qui pou - vant voir l URL char gée a accès aux para mètres. C est pour quoi une seconde méthode existe : POST qui per met de pla cer les para mètres à l inté rieur de la requête. Pour uti li ser la méthode POST il suf fit de chan ger les lignes de créa tion de la requête : HttpURLConnection urlconnection = (HttpURLConnection) u.openconnection(); // Si par exemple String params = num=100&q=\ Android+4.0\ ; byte[] post Data = URLEncoder.encode(params).getBytes(); urlconnection.setdooutput(true); urlconnection.setrequestmethod( POST ); urlconnection.setrequestproperty( Content- Length, Integer. tostring(post Data.length)); urlconnection.getoutputstream().write(post Data); urlconnection.getoutputstream().close(); // Trai ter la réponse dans getinputstream() Dunod Toute reproduction non autorisée est un délit. Ce qu il ne faut pas faire Il faut éviter l'accès aux paramètres que permet la méthode GET (cf. ci-dessus). Envoyer un iden ti fiant et un mot de passe, par exemple, serait poten tiel le - ment désas treux, y compris dans le cas d un échange en HTTPS, étant donné que si le contenu est sécu risé, l URL en revanche ne l est pas. Ce n est donc pas une pra tique à recom man der. Au contraire, l envoi en POST est une méthode qui per met de pla cer les para mètres à l inté rieur de la requête et évite donc d expo ser inuti le ment des infor ma tions plus ou moins sen sibles. 117

126 Recette N 40 Trai ter des don nées JSON Ce qu il faut savoir Le for mat JSON (JavaScript Object Nota tion) est un for mat de don nées per - met tant de repré sen ter des infor ma tions de manière struc tu rée, notam ment dans le cas de commu ni ca tions avec un ser vice Web. Un docu ment JSON est composé de 2 types d élé ments complexes : Des ensembles de paires Nom/Valeur. Les clefs sont néces sai re ment des chaînes de carac tères (noms de variables), Des listes ordon nées de valeurs. La racine du flux JSON est tou jours un dic tion naire (ensemble de paires). Exemple de fichier JSON uti lisé par Google pour l envoi des élé ments à affi - cher sur une carte : markers : [ lat : , lng : , html : Lieu1, lat : , lng : , html : Lieu2, lat :45.62, lng : , html : Lieu3 ] Ce qu il faut faire Android contient les classes de conver sion Objets <-> JSON, au tra vers de son JSONObject. Par exemple : 118

127 JSONObject json = new JSONParser().getJSONFromUrl(url); Un objet JSON est en essence un dic tion naire (ou HashMap), avec des clefs de type String. On récu pé rera donc par exemple la date (pas sée sous forme de chaîne) asso ciée à la clef «updatedate» en fai sant : json.getstring("updatedate"); Les types de don nées dans un flux JSON sont : des dic tion naires (JSONObject), des tableaux d objets (JSONArray), des boo léens, des entiers, des doubles (nombres flot tants), des chaînes de carac tères. De la même manière, on peut géné rer un flux JSON pour l envoyer vers un ser veur en fai sant par exemple : JSONObject json = new JSONObject(); json.put("nom", "Développeur"); json.put("index", 4); String flux = json.tostring(); Dunod Toute reproduction non autorisée est un délit. Ce qu il ne faut pas faire De nom breux parseurs JSON pour Android ont vu le jour ces der nières années et vous pour rez en trou ver trace sur GitHub, Google Code ou encore dans cer - tains pro jets que vous pour riez reprendre. Il serait alors ten tant de se lan cer dans une mise à jour afin de s évi ter une re facto ri sa tion du code, cepen dant, comme nous l avons vu pré cé dem ment, il existe aujourd hui des méthodes plus adap tées. 119

128 Recette N 41 Géné ra li sa tion aux sockets Ce qu il faut savoir HTTP est un pro to cole très lar ge ment utilisé pour la commu ni ca tion, mais il arrive qu on ait besoin de commu ni quer selon un pro to cole plus rare (FTP, SMTP, etc.), ou encore un pro to cole «mai son» pour des rai sons de per for - mance ou de contraintes métiers. Les RFC Les RFC (Request for Comments) sont des docu ments offi ciels spé ci fiant les dif fé rentes implémentations et nor ma li sa tions d élé ments tech niques, qu il s agisse de maté riels ou de pro to coles. Dans le cas de l implémentation d un pro to cole stan dar disé ces docu ments nous per met tront de nous confor mer au dit pro to cole. Un socket est un outil per met tant un échange bidirectionnel de don nées entre un client et un ser veur. En Java, la classe Socket per met de gérer soi- même les envois (et la récep - tion) des don nées, et fonc tionne en gros à la manière des objets de type File : une fois la connexion créée et ouverte, on lit et écrit des don nées des sus à l aide de *Stream. Ce qu il faut faire Ima gi nons une commu ni ca tion avec le ser veur , sur le port 4321, selon un pro to cole qui serait : client : HELLO serveur : HELLO client : my name is Developpeur ser veur : HELLO Developpeur 120

129 En Java, cela commen ce rait par : Socket s = new Socket(" ", 4321); BufferedReader inreader = new BufferedReader(new InputStreamReader(s.getInputStream())); BufferedWriter outwriter = new BufferedWriter(new BufferedOutputStream(s.getOutputStream())); outwriter.write( HELLO, 0, 5); outwriter.newline(); outwriter.flush(); String reponse = inreader.readline(); if(!reponse.equals( HELLO )) // erreur // À sup po ser que name contienne le nom à envoyer String envoi = my name is + name; outwriter.write(envoi, 0, envoi.length); outwriter.newline(); outwriter.flush(); // etc. Ce qu il ne faut pas faire Atten tion, la plu part des API de commu ni ca tion réseau lèvent une excep tion lors qu elles sont exé cu tées sur le thread prin ci pal, et ce pour ne pas blo quer l exé cu tion des inter ac tions uti li sa teurs. Il convient donc de faire sys té ma ti que ment les opé ra tions réseaux sur un thread séparé et d appe ler runonuithread lorsque c est néces saire que ce soit pour indi quer une action ter mi née ou pour cer tains appels spé ci fiques dans les API concer nées. 121

130

131 Inté gra tion d élé ments vidéo Chapitre 11 Les péri phériques mobiles ont révo lu tionné l uti li sation qui est faite des fichiers mul ti mé dias. L uti li sation du MP3 et l arri vée de péri phériques comme l ipod ont démo cra tisé des uti li sations qui res taient confi den tielles. Par la suite, c est la vidéo qui a fait son arri vée pour être inté grée dans tous les péri phériques mobiles. Enfin, avec le déve lop pe ment de la 3g et du Wifi, c est la consul ta tion de res sources dis tantes (YouTube par exemple) qui a contri bué à enri chir cette offre numé rique pour les uti li sa teurs. Une des par ti cu la ri tés de la vidéo est la quan tité de res sources qui est néces - saire pour l'affichage, que ce soit en termes de sto ckage ou de puis sance de cal cul. Les SDK modernes font de leur mieux pour four nir des API per met tant de mettre de côté cette complexité latente afin de per mettre au déve lop peur de se foca li ser sur l expé rience uti li sa teur. Aujourd hui, une pro por tion non négli geable de l ensemble du tra fic réseau mon dial est dédiée à la récu pé ra tion de conte nus mul ti mé dias, ce qui a eu des consé quences sur les archi tec tures des réseaux et sur celles des appli - ca tions pour garan tir une bonne expé rience uti li sa teur malgré le volume de don nées concerné. Recette N 42 Télécharger une vidéo et la sto cker sur le péri phérique Ce qu il faut savoir Android four nit dif fé rents méca nismes per met tant de lire des conte nus mul - ti mé dias sur les plateformes mobiles. Le sys tème four nit plu sieurs méthodes pour lire les vidéos et il nous sera pos sible de choi sir celle qui sera la mieux adap tée à notre besoin. Cepen dant la pre mière ques tion qui se pose lorsque l on parle de lec ture de conte nus est l empla ce ment et le for mat des fichiers vidéo. 123

132 Concer nant l empla ce ment, la plu part des méthodes per mettent de lire des conte nus situés sur le péri phérique ou sur des ser veurs dis tants. Pour des rai sons de per for mances, il est sou vent plus inté res sant de télécharger d abord la res source, puis de la consul ter. Ce qu il faut faire Comme vu dans les cha pitres pré cé dents, Android n auto rise pas l uti li sation du thread prin ci pal pour les opé ra tions réseaux. Par défi ni tion, le sys tème est donc asyn chrone, dans la mesure où l on sait quand cela démarre, mais pas néces sai re ment quand cela s arrête. Le pro blème consiste donc géné ra le ment à mettre en place un sys tème de noti fi cation ou de callback, qui per met de réagir à la fin du char ge ment. De manière prag ma tique, il est nor mal de fonc tion ner de manière simi laire au sys tème des Listeners, présent dans la plu part des packages Java, et par exten sion Android, ou d uti li ser les classes internes et les scopes vus pré cé - dem ment afin d uti li ser les méthodes de la classe appe lante Sup po sons que l on sou haite uti li ser une méthode basée sur les listeners : public inter face AsyncListener public void chargementtermine(url u, String contenu); public class AsyncLoader ex tends Thread private URL urlacharger = null; private AsyncListener delegate = null; public AsyncLoader(URL u, AsyncListener l) urlacharger = u; delegate = l; public void run() try HttpURLConnection urlconnection = (HttpURLConnection) urlacharger.openconnection(); InputStream in = urlconnection. getinputstream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 124

133 String result, line = reader.readline(); result = line; while((line=reader.readline())!=null) result+=line+ \n ; delegate.chargementtermine(urlacharger, result); catch(malformedurlexception m) System.err.println("L URL " + urlacharger + " n est pas cor recte"); catch(ioexception io) System.err.println("Le chargement de l URL " + urlacharger + " a échoué avec l erreur sui vante: " + io.getlocalizedmessage()); Ou encore une méthode basée sur les classes internes : public abstract class AsyncLoader protected void chargementtermine(url u, String contenu); // a surcharger par les classes qui serviront au chargement Dunod Toute reproduction non autorisée est un délit. protected void chargercontenu(url u) new Thread(new Runnable() public void run() try HttpURLConnection urlconnection = (HttpURLConnection) u.openconnection(); InputStream in = urlconnection. getinputstream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String result, line = reader.readline(); result = line; while((line=reader.readline())!=null) result+=line+ \n ; 125

134 chargementtermine(u, result); catch(malformedurlexception m) System.err.println("L URL " + urlacharger + " n est pas cor recte"); catch(ioexception io) System.err.println("Le chargement de l URL " + urlacharger + " a échoué avec l erreur sui vante: " + io.getlocalizedmessage()); ).start(); Pour uti li ser ce méca nisme, il suf fi rait donc de pro cé der ainsi : public class ChargementVideo ex tends AsyncLoader protected void chargementtermine(url u, String contenu) // faire quelque chose avec contenu public ChargementVideo() chargercontenu(new URL(" mp4")); Ce qu il ne faut pas faire À l heure de la sur en chère aux pixels, où l on pro pose des vidéos avec des réso lu tions de plus en plus éle vées, il est impor tant de consi dé rer avant tout le péri phérique qui sera uti lisé pour lire les conte nus. Ainsi, dans le cas d un télé phone, l uti li sa teur regarde une vidéo sur un écran d une dia go nale infé rieure à 4 pouces (~10 cm). De fait, dans de très nom breux cas d uti li sation, des vidéos d une réso lu tion équi va lente à 640x480 seront suf fi santes et pour ront être téléchargées bien plus rapi de ment et affi chées de manière plus fluide. 126

135 Il peut éga le ment être inté res sant de pou voir pré sen ter le contenu à l uti - li sa teur sous dif fé rentes réso lu tions liées à l appa reil de des ti nation (1080p à 2.5 Mbits/s pour une tablette et 720p à 1 Mbit/s pour un télé phone, par exemple), ou au type de contenu (pour des ani ma tions, les réso lu tions infé - rieures sont tout à fait per ti nentes). Recette N 43 Lire une vidéo Ce qu il faut savoir Lire une vidéo sur un appa reil Android fait par tie des attentes nor males et stan dard de l uti li sa teur. Il existe des moyens simples de char ger, pré sen ter et contrô ler des médias dans les API de base du sys tème. La ver sion 4.0 d Android sup porte les for mats les plus cou rants : le H.263 (3GPP), le H.264 (MP4) ou encore le VP8 (WebM et Mastroska). Ce qu il faut faire Pour lire une vidéo, il suf fit d avoir une VideoView à l écran, char gée depuis un layout ou ini tia li sée dans le code, et ensuite de lui indi quer le fichier à char ger : Dunod Toute reproduction non autorisée est un public void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); // // Dans le cas d une Activity VideoView video = findviewbyid(r.id.video_view); // Dans le cas d un Frag ment, par exemple VideoView video = rootview.findviewbyid(r.id.video_view); // À sup po ser que la méthode getvideopath() nous renvoit // le che min d accès de la vidéo video.setvideopath(this.getvideopath()); video.start(); 127

136 Ce qu il ne faut pas faire De nom breux para mètres sont à prendre en compte dans le cas de la lec ture de vidéos depuis un ser veur dis tant à par tir d un péri phérique mobile. En effet, du fait de condi tions réseaux extrê me ment variables, voire de la pos sible inter rup tion du réseau, il est impor tant de défi nir l ensemble des méthodes qui per met tront d adap ter le contexte à ces situa tions. Par ailleurs, dif fé rents dis po si tifs de dif fu sion de conte nus, tels que le pro - to cole RTSP, peuvent éga le ment être à consi dé rer pour garan tir une bonne expé rience uti li sa teur et ce, quelles que soient les condi tions. Les classes pré sentes dans Android permettent d affi cher la vidéo à l inté - rieur d autres vues, ainsi que le contrôle ou l appli ca tion d effets en temps réel. Tou te fois, il est impor tant de noter que la lec ture d une vidéo uti lise énor mé ment de res sources, que ce soit en termes de temps pro ces seur, de mémoire, ou de débit. Bien que la ten ta tion de faire des trai te ments poten - tiel le ment lourds en paral lèle de la lec ture soit forte, il faut bien se rap pe ler que l appa reil est à ce moment- là déjà très sol li cité. Par consé quent, il faut limi ter au maxi mum les opé ra tions multithreads, et se rap pe ler que le trai te ment image par image doit prendre au maxi mum 50 ms (pour 20 images / seconde). Jouer plu sieurs vidéos en même temps est pos sible, mais la flui dité res sen tie par l uti li sa teur dépen dra for cé ment du temps passé par Android à décom pres ser, puis affi cher les images, et donc de la réso lu tion de la vidéo, de son débit et de la géné ra tion de l appa reil sur lequel on sou haite le faire. Recette N 44 Lire une vidéo depuis YouTube Ce qu il faut savoir Les four nis seurs de conte nus, tel que YouTube, ne per mettent pas de télécharger leurs conte nus direc te ment notam ment pour des rai sons de droits d auteurs. Pour pou voir lire une vidéo sur YouTube, vous devez uti li ser l API épo nyme, four nie par Google. 128

137 Elle auto rise l uti li sation d un Frag ment indé pen dant de lec ture, ainsi qu une classe YouTubePlayerView intégrable dans une Activity, qui doit du coup héri ter de YouTubeBaseActivity. Note : atten tion, vous ne pou vez pas avoir une vue infé rieure à 200x110 dp pour ce contrôle. La rai son pour laquelle on doit héri ter le YouTubeBaseActivity est qu elle contient le contrô leur pour la vue. Ce qu il faut faire Sup po sons que l on sou haite affi cher une vidéo dont l adresse d inté gra tion est : Vous pour rez défi nir une fonc tion qui ajoute une vue de lec ture vidéo d une cer taine taille comme suit public void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.playerview); Dunod Toute reproduction non autorisée est un délit. YouTubePlayerView youtubeview = (YouTubePlayerView) findviewbyid(r.id.youtube_view); youtubeview.initialize(developer_key, this); protected YouTubePlayer.Provider getyoutubeplayerprovider() return (YouTubePlayerView) findviewbyid(r.id.youtube_view); 129

138 On pourra ensuite faire appel au player hérité de la super classe pour enchaî - ner les videos ou les playlists : // On peut aussi char ger une playlist avec // this.player.cueplaylist("id playlist"); this.player.cuevideo("id video"); // ici mo1dmo9jh3y this.player.play(); Ce qu il ne faut pas faire La consul ta tion de ces videos néces site une connexion réseau stable. Aussi, il est impor tant de gérer le cas d indis po ni bi lité de l accès au site. Par ailleurs, les contrôles de lec ture de cette vue sont ceux de YouTube. Il est donc dif fi cile voire impos sible de contrô ler les actions uti li sa teur ou d en rajou ter. Par exemple, mas quer la vue web ne sus pend pas la lec ture. Seule une sup pres sion pure et simple de l arbo res cence per met tra de «déchar - ger» la vidéo. 130

139 Réseaux sociaux Chapitre 12 Les réseaux sociaux ont révo lu tionné la façon de commu ni quer de mil lions de per sonnes de par le monde et s invitent aujourd hui dans notre quo ti dien avec les appa reils mobiles. Qu il s agisse de par ta ger une réac tion face à l actua lité, de par ta ger la photo de son der nier lieu de vacances ou encore de s adres ser en masse à sa commu nauté vir tuelle, l usage des réseaux sociaux est bel et bien ancré chez une majo rité des uti li sa teurs de smartphones. Facebook et Twitter font partie des réseaux sociaux les plus popu laires. Leur usage est glo bal, cer taines de leurs fonc tion na li tés comme la mes sa - ge rie ins tanta née pour Facebook en font même un outil quasi pro fes sion nel dans cer tains pays comme ceux de l Amérique du Sud où l échange de pro fils sup plante presque LinkedIn. Les plus jeunes délaissent l au pro fit des mes sages Facebook ou des tweets en direct et les plus connec tés d entre nous y par tagent chaque ins tant de leur vie. En tant que déve lop peur, il est ainsi inté res sant de pro po ser d inté grer des fonc tion na li tés sociales dans son appli ca tion à la fois pour per mettre à l uti li - sa teur de par ta ger direc te ment et aisé ment le contenu consulté et de pro fi ter du même coup de la viralité du réseau social. Facebook, avec sa base annon cée de plus d un milliard d uti li sa teurs actifs, et Twitter, qui reven dique déjà plus de 500 mil lions de gazouilleurs, per - mettent de tou cher un large public plus ou moins adepte de ces nou veaux réseaux. Vos utilisateurs sont cer tai ne ment de ceux-là. Recette n 45 Connexion aux différentes API Ce qu il faut savoir La plu part des API uti lisent le pro to cole OAuth pour per mettre un accès sécu - risé tout en pro té geant les identifiants de l uti li sa teur du ser vice. La der nière ver sion du pro to cole est OAuth 2.0 à l heure actuelle, vous trou ve rez toutes les infor ma tions néces saires dans les docu ments RFC 6749 et RFC

140 Même si nous allons nous inté res ser à la ver sion 2.0, la ver sion plus ancienne 1.0a est encore très uti li sée (RFC 5849) et comporte des différences notables en par ti cu lier avec l uti li sation du SSL dans la ver sion 2.0 qui per met de sim - pli fier son uti li sation. Ce qu il faut faire Le prin cipe de fonc tion ne ment est tou jours le même, seuls les ser vices autour de l authen ti fi cation pour chaque SDK peuvent varier en fonc tion du four nis - seur. Clas si que ment, nous ren controns l enchaî ne ment sui vant : Créa tion d un token propre à l appli ca tion que vous aurez enre gis trée auprès du four nis seur (Google, Twitter, Facebook, etc.), pour éviter les ten - ta tives d usur pa tion ; Envoi d une demande d authen ti fi cation au four nis seur qui retourne une URL pour authen ti fier l uti li sa teur et un token ; On véri fie que la réponse cor res pond à la demande de notre appli ca tion avec le token ; Échange d infor ma tion pour authen ti fier l uti li sa teur du ser vice, on récu - père donc un access token et un id token de l uti li sa teur ; Connexion au ser vice et récu pé ra tion des infor ma tions de l uti li sa teur à par tir de l id token ; On peut faire ce que l on sou haite avec cet accès. 132

141 Configuration de l authentification Ce qu il ne faut pas faire Dunod Toute reproduction non autorisée est un délit. Il est ten tant de demander les identifiants de l uti li sa teur pour les sto cker direc te ment dans l appli ca tion, mais cela va à l encontre des poli tiques de sécu rité. De plus, en cas de perte de ces infor ma tions, l uti li sa teur devra chan ger son mot de passe dans le meilleur des cas. Dans la mesure où il n est pas rare que le même mot de passe soit uti lisé pour accé der à dif fé - rents ser vices, cela accen tue encore le pro blème, sans par ler des retom bées juri diques et en termes d image pour le déve lop peur de l appli ca tion au cas où cela se pro dui rait. Il est donc beau coup plus sûr de sto cker les access token et id token qui per - mettent de se connec ter au compte de l uti li sa teur avec un double contrôle (app + uti li sa teur), sans jamais être en contact avec des infor ma tions trop sen sibles. De plus, en cas de pro blème, il suf fit à l uti li sa teur de refu ser la liai son avec votre appli ca tion. 133

142 Recette n 46 Uti li ser les API de Twitter Ce qu il faut savoir Contrai re ment à ios, Android ne pos sède pas, ou pas encore, de solu tion interne pour la ges tion des réseaux sociaux, il faut donc soit créer sa propre solu tion ou bien pas ser par une biblio thèque externe. Pour Twitter, nous avons fait le choix d uti li ser la biblio thèque Twitter4j ( et plus pré cisément twitter4j-core jar qui permet de nous sim pli fier la tâche. À noter que nous aurions éga le ment pu uti li ser l API socialauth android ( qui sup porte une grande quan tité de réseaux sociaux. Connexion de notre application pour utiliser l API 134

143 Ce qu il faut faire Le plus complexe est de se connec ter au ser vice. Dans notre cas, nous avons spé ci fié que nous déve lop pions une appli ca tion web dans le para mé trage coté Twitter pour que la demande de token se fasse par le navi ga teur web directement et non par une couche REST ; le prin cipe reste iden tique. Il va fal loir, entre autres choses, sto cker nos clés développeur ainsi que celles du client. Voici nos variables : private static final String TAG = "social"; private static final String TW_CONSU MER_KEY = "Notre clé"; private static final String TW_CONSU MER_SECRET = "Notre clé secrète"; // Pré fixe uti li sé pour nos commu ni ca tions //(per met de véri fier les retours) static final String CALLBACK_URL = "oauth://cookbooksocial"; // Clé uti li sée pour le sto ckage de para mètres sous forme clé/ valeur private static final String PREFS_NAME = "DUNOD_SOCIAL_TEST"; private static final String TW_TOKEN = "DS_TWTOKEN"; private static final String TW_TOKENSECRET = "DS_TWTSECRET"; Dunod Toute reproduction non autorisée est un délit. // Notre objet de communication private static Twitter twitter; // Sto ckage des tockens au moment de l authen ti fi cation private static RequestToken requesttoken; // Id du der nier tweet private static Status laststatus; // Notre vue text private TextView twview; // Nos diffé rents bou tons private Button btntwconnect, btntwdisconnect, btntwdelete, btntwsend; 135

144 Ainsi que notre logique de sto ckage dans les pré fé rences de l appli ca tion : Sto ckage des tokens private void storeaccesstoken(long l, AccessToken accesstoken) // store accesstoken.gettoken() // store accesstoken.gettokensecret() SharedPreferences settings = getsharedpreferences(prefs_ NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putstring(tw_token, accesstoken.gettoken()); editor.putstring(tw_tokensecret, accesstoken. gettokensecret()); editor.commit(); Récu pé ra tion des tokens private HashMap<String, String> getaccesstoken() SharedPreferences settings = getsharedpreferences(prefs_ NAME, 0); HashMap<String, String> result = new HashMap<String, String>(); String token = settings.getstring(tw_token, null); String tokensecret = settings.getstring(tw_tokensecret, null); result.put(tw_token, token); result.put(tw_tokensecret, tokensecret); return result; 136

145 Sup pres sion de nos tokens sto ckés public void deleteaccesstoken() SharedPreferences settings = getsharedpreferences(prefs_ NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.remove(tw_token); editor.remove(tw_tokensecret); editor.commit(); Log.d(TAG, "accesstoken deleted"); twview.settext(getstring(r.string.not_connected)); Toutes les demandes néces sitent une action sur le réseau, il nous faut donc tra vailler de manière asyn chrone. Nous uti li se rons des AsyncTask. Dunod Toute reproduction non autorisée est un délit. Connexion au ser vice private class LoginToTwitterTask ex tends AsyncTask<Uri, Void, protected Void doinbackground(uri... params) HashMap<String, String> stored = getaccesstoken(); try if(stored.get(tw_token) == null stored.get(tw_ TOKENSECRET) == null) Log.d(TAG, "LoginToTwitterTask : accesstoken indis ponible."); startswith(callback_url)) Log.d(TAG, "LoginToTwitterTask : récu pé ra tion accesstoken."); 137

146 if (params.length > 0 && params[0]. tostring(). // OAuth verifier String verifier = params[0]. getqueryparameter("oauth_verifier"); Log.d(TAG, "Verifier : " + verifier); AccessToken accesstoken = twitter. getoauthaccesstoken(requesttoken, verifier); storeaccesstoken(twitter.verifycredentials(). getid(), accesstoken); new LoginToTwitterTask().execute(); else Log.d(TAG, "LoginToTwitterTask : connexion au site Twitter pour authen ti fi cation."); ConfigurationBuilder cb = new ConfigurationBuilder(); // On uti lise nos clés four nies par Twitter cb.setoauthconsumerkey(tw_consu MER_KEY); cb.setoauthconsumersecret(tw_consu MER_SECRET); Confi gu ra tion conf = cb.build(); TwitterFactory factory = new TwitterFactory(conf); twitter = factory.getinstance(); requesttoken = twitter. getoauthrequesttoken(callback_url); Log.d(TAG, "LoginToTwitterTask : URL connexion TW : " + requesttoken.getauthenticationurl()); // On passe l URL de connexion twitter à l intent pour l affi cher avec un navi ga teur startactivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL()))); else // On a les accesstoken, on connecte l appli ca tion Log.d(TAG, "LoginToTwitterTask : accesstoken dis po nible."); 138

147 ConfigurationBuilder confbuilder = new ConfigurationBuilder(); Confi gu ra tion conf = confbuilder.setoauthconsumerkey(tw_consu MER_KEY).setOAuthConsumerSecret(TW_CONSU MER_SECRET).setOAuthAccessToken(stored.get(TW_TOKEN)).setOAuthAccessTokenSecret(stored.get(TW_ TOKENSECRET)).build(); twitter = new TwitterFactory(conf).getInstance(); final User user = twitter.verifycredentials(); runonuithread(new public void run() twview.settext(user.getname()); btntwconnect.setvisibility(view.gone); btntwdisconnect.setvisibility(view.visible); ); Dunod Toute reproduction non autorisée est un délit. catch (Excep tion e) // TODO: handle excep tion Log.d(TAG, "LoginToTwitterTask - Error : " + e.getmessage() + e.tostring()); return protected void onpostexecute(void result) // TODO Auto generated method stub super.onpostexecute(result); new ReadTweetTask().execute(); 139

148 Recette n 47 Commu ni quer sur Twitter Ce qu il faut savoir Comme nous l avons vu à la recette 45, la plu part des API uti lisent le pro to cole OAuth pour per mettre un accès sécu risé, tout en pro té geant les identifiants de l uti li sa teur du ser vice. La der nière ver sion du pro to cole est OAuth 2.0 au moment de la rédac tion de l ouvrage. Toutes les infor ma tions néces saires sont acces sibles dans les docu ments RFC 6749 et RFC Cepen dant, la ver sion plus ancienne 1.0a est encore très uti li sée (RFC 5849) et comporte des différences notables en par ti cu lier avec l uti li sation du SSL dans la ver sion 2.0 qui per met de sim pli fier son uti li sation. Exemple de tweet Ce qu il faut faire Pour commu ni quer sur Twitter, nous retrouverons prin ci pa le ment 3 méthodes : L envoi d un mes sage, La sup pres sion d un mes sage, La lec ture de la timeline. 140

149 Envoi d un tweet private class SendTweetTask ex tends AsyncTask<String, Void, protected Void doinbackground(string... arg0) String texttosend = arg0[0]; try // Envoi du tweet if (twitter!= null) twitter4j.status status = twitter. updatestatus(texttosend); Log.d(TAG, "Envoi du tweet : " + status.gettext()); laststatus = status; catch (TwitterException e) // Error in updating status Log.d(TAG, "Erreur envoi du Tweet" + e.getmessage()); return null; Dunod Toute reproduction non autorisée est un délit. Sup pres sion d un tweet private class DeleteTweetTask ex tends AsyncTask<Long, Void, protected Void doinbackground(long... arg0) long tweetid = arg0[0]; 141

150 try // Envoi du tweet if (twitter!= null) twitter4j.status status = twitter. destroystatus(tweetid); Log.d(TAG, "Sup pres sion du tweet "+ status. getid()+" : " + status.gettext()); laststatus = status; catch (TwitterException e) // Error in updating status Log.d(TAG, "Erreur sup pres sion du Tweet" + e.getmessage()); return null; Recette n 48 Récu pé rer une timeline de Twitter Ce qu il faut savoir Twitter per met de créer des Embedded timelines permettant aux déve lop - peurs d inté grer dans leurs appli ca tions des timelines pré- définies. Il est bien entendu pos sible de récu pé rer la timeline liée à un uti li sa teur. 142

151 Ce qu il faut faire Lec ture de la timeline private class ReadTweetTask ex tends AsyncTask<Void, Void, protected List<twitter4j.Status> doinbackground(void... params) List<twitter4j.Status> statuses = null; try if (twitter!= null) statuses = twitter.gethometimeline(); Dunod Toute reproduction non autorisée est un délit. catch (TwitterException e) // Error in updating status Log.d(TAG, "Erreur Lec ture du Tweet" + e.getmessage()); catch (Excep tion ex) Log.d(TAG, "Erreur lec ture" + ex.getmessage()); return protected void onpostexecute(list<twitter4j.status> statuses) super.onpostexecute(statuses); 143

152 if (statuses!= null) for (twitter4j.status status : statuses) TextView text = (TextView) findviewbyid(r. id.displaytext); text.append("tweet id : " + status.getid() + " :\n" + status.getuser().getname() + " : " + status.gettext()); text.append("\n \n"); //Log.d(TAG, "Tweet id : " + status.getid() + " : "+ status.getuser().getname() + " : " + status.gettext()); Récupération d une timeline 144

153 Amazon Web Ser Vices Chapitre 13 Pour les fon da men taux de la mise en place d un Web Ser vice vous pour rez vous repor ter aux annexes de ce livre. Nous allons voir ici comment uti li ser, au sein de nos appli ca tions, les ser vices tiers exis tants les plus popu laires. Aujourd hui, à cause de la complexité crois sante des archi tec tures et des besoins variables de puis sance, de nom breux acteurs se sont posi tion nés sur le mar ché de l héber ge ment mutualisé des fonc tion na li tés de base de don nées, de sto ckage et de cal cul. Amazon pro pose au tra vers de sa pla te forme AWS (Amazon Web Ser vices) tout un ensemble de ser vices selon un modèle de pay- per-use incluant un volume d échange gra tuit par mois, ce qui per met au déve lop peur de mettre gra tui te ment en place des appli ca tions uti li sant de faibles volumes de don - nées. Cette pla te forme comprend notam ment : Un ser vice de sto ckage de fichier (S3), Un ser vice de base de don nées (Simple DB). Dans ce cha pitre nous abor de rons ces deux outils pour sto cker des don nées au tra vers de ce ser vice. Recette N 49 Uti li ser Awazon Web Ser vices S3 Ce qu il faut savoir Cloud, vous avez dit Cloud? Der rière l appel la tion Cloud se cache un ensemble de concepts qui ne sont pas vrai ment de grandes nou veau tés. L idée prin ci pale est de délé guer une par tie de son archi tec ture à un ser vice dis tant fourni par un pres tataire. Parmi l ensemble des offres actuelles se dégagent trois grands modèles : 145

154 saas : «Soft ware As A Ser vice» : Dans ce modèle, une entre prise accède à une appli ca tion en mode hébergé sans avoir à prendre en consi dé ra tion l ins tal la tion ou la main te nance de celle- ci, iaas : «Infra struc ture As A Ser vice» : Des infra struc tures virtualisées sont mises à dis po si tion, ce qui per met de créer une infra struc ture vir tuelle qui peut être dimen sion née en fonc tion des besoins, paas : «Platform As A Ser vice» : Il s agit d une ver sion évo luée du modèle pré cé dent qui four nit à l entre prise une pla te forme per met tant d héber - ger les appli ca tions et les don nées sans avoir à se pré oc cu per du sys tème d exploi ta tion et de l infra struc ture maté rielle. Le terme Cloud vient du fait que le point d entrée n est pas fixe comme une URL par ti cu lière ou un ser veur donné. Cela pose sou vent la ques tion pour les entre - prises de savoir à quel endroit sont héber gées leurs don nées phy si que ment. C est d ailleurs en réponse à cette pro blé ma tique que dif fé rents hébergeurs fran çais ont lancé leurs offres de Cloud garan tis sant un héber ge ment phy - sique sur le ter ri toire natio nal. Cet aspect est à prendre en compte du fait des dif fé rences de lois en vigueur selon les pays. Ce qu il faut faire AWS four nit un SDK pour Android qui per met de sim pli fier les accès aux dif - fé rents ser vices pro po sés par Amazon notam ment : Amazon Simple Storage Ser vice (S3) : un envi ron ne ment de sto ckage, Amazon Simple DB : base de don nées mutualisée, Amazon EC2 : pla te forme de cal cul dis tri bué. Le SDK est libre ment téléchargeable depuis aws-sdk-android Depuis la console AWS, il est néces saire de défi nir une clé d accès qui est compo sée de deux par ties : Un iden ti fiant de clé d accès, Une clé d accès secrète. C est ce couple qui sera uti lisé par l appli ca tion et qui per met tra de gérer des dépôts de don nées (Buckets). Le SDK four nit un ensemble de méthodes per met tant entre autres de créer et sup pri mer des buckets et de mani pu ler leurs conte nus. 146

155 Note : Il existe plu sieurs manières d ajou ter les librai ries asso ciées à Amazon dans votre pro jet. La méthode que nous allons indi quer ici pré sente l avan tage d être modu laire, sans inclure plus que néces saire dans le pro jet. Le SDK AWS per met d inté grer au mieux l uti li sation de ses ser vices grâce à la modu la rité de ses librai ries. Nous avons donc les deux types de choix sui vants : Tout en un avec aws- android-sdk-version.jar qui contient tous les fichiers néces saires pour tous les ser vices AWS. Cette ver sion reste assez lourde avec ses 4 Mio, Modu laire avec aws- android-sdk-version-core.jar qui contient la base néces saire à l uti li sation des dif fé rents ser vices, à laquelle nous ajou te rons les modules qui nous inté ressent. Cette ver sion nous offre un départ plus léger avec ses 1,5 Mio + le poids de chaque module. Conseil : il faut noter que la librai rie aws- android-sdk-version-debug.jar per met d inté grer tous les ser vices ainsi que la pos si bi lité de tra cer plus faci - le ment tout ce qui se passe. Elle reste donc la solu tion idéale pour les pro jets en cours de déve lop pe ment. Dunod Toute reproduction non autorisée est un délit. Pour l exemple, nous allons inté grer les librai ries essen tielles à l uti li sation de S3. Nous uti li sons donc les librai ries sui vantes (pour un poids de 1,7 Mio) : aws- android-sdk-version-core.jar, aws-android-sdk-version-s3.jar. Comme d habi tude il suf fira de les copier dans le dos sier libs et de les ajou ter au Java build path. Il suf fit ensuite dans nos classes de faire un im port cor res pon dant à nos besoins : import com.amazonaws.ser vices.s3.amazons3client; import com.amazonaws.auth.basicawscredentials import com.amazonaws.ser vices.s3.model.deleteobjectrequest; import com.amazonaws.ser vices.s3.model.listobjectsrequest; import com.amazonaws.ser vices.s3.model.objectlisting; import com.amazonaws.ser vices.s3.model.putobjectrequest; import com.amazonaws.ser vices.s3.model.region; import com.amazonaws.ser vices.s3.model.s3objectsummary; 147

156 Ce qu il ne faut pas faire Comme toute inclu sion de sources tierces dans un pro jet, il convient de véri - fier que la ver sion du SDK uti li sée est bien la plus récente et la plus adap tée (tout le monde se sou vien dra de la dis pa ri tion pro blé ma tique de l API 1.0 de Twitter au pro fit de la ver sion 1.1). Amazon pro po sant des ser vices de cloud en per pé tuelle évo lu tion, il est alors essen tiel d assu rer une veille accrue sur les outils four nis aux déve lop peurs. Recette N 50 Gérer des buckets avec Amazon S3 Ce qu il faut savoir Chaque élé ment sto cké sur Amazon S3 est contenu dans un bucket. Un bucket est un conte neur ayant un nom unique dans S3 et qui per met de sto cker tous types d objets. Le fonc tion ne ment est très simi laire aux noms de domaines avec une liberté de gérer les noms au sein du domaine tout en appar te nant à une hié rar chie. Cette simi li tude se retrouve éga le ment dans la pra tique étant donné que le bucket sera acces sible au tra vers d une URL de type nom_du_bucket. s3.amazonaws.com. Par exemple pour accé der à une vidéo nommé video.mp4 sto ckée dans un bucket nommé monbucket, l URL per met tant d y accé der serait : monbucket.s3.amazonaws.com/video.mp4. Ce qu il faut faire Tout d abord il est néces saire d ini tia li ser le client S3 : AmazonS3Client s3client = new AmazonS3Client(new BasicAWSCredentials(ACCESS_KEY_ID, SECRET_KEY)); 148

157 Il faut aussi pen ser à uti li ser le point d accès le plus proche pour maxi mi ser les per for mances. Dans notre cas nous uti li sons les para mètres recom man - dés pour l Europe de l ouest. s3client.setendpoint("s3-eu-west-1.amazonaws.com"); Pour chaque créa tion de bucket il fau dra aussi spé ci fier son empla ce ment. Note : Comme cela a été vu dans le cha pitre sur les commu ni ca tions syn - chrones et asyn chrones, toutes les actions qui touchent au réseau et néces - sitent un accès à Inter net ne peuvent pas être effec tuées direc te ment dans le thread prin ci pal sous peine de voir le sys tème tuer notre appli ca tion à cause d une mono po li sa tion des res sources trop impor tante. C est pour quoi toutes nos méthodes héri te ront de AsyncTask qui per met de faci le ment gérer des tâches asyn chrones sans la lour deur de ges tion clas - sique des threads. Pour créer un bucket, nous devons uti li ser la méthode createbucket comme suit : // On ini tia lise le client S3 s3client = new AmazonS3Client(new BasicAWSCredentials(ACCESS_ KEY_ID, SECRET_KEY)); s3client.setendpoint("s3-eu-west-1.amazonaws.com"); Dunod Toute reproduction non autorisée est un délit. private class CreateBucketTask ex tends AsyncTask<String, Void, protected Void doinbackground(string... bucketsnames) try // On créé les buckets direc te ment dans notre région // d uti li sation (par défaut Region.US_Stan dard) for(int i = 0; i < bucketsnames.length; i++) s3client.createbucket(bucketsnames[i], Region.EU_ Ireland); 149

158 catch (Excep tion e) // Excep tions pos sibles : AmazonClientException et // AmazonServiceException Log.d("AWS", "Erreur creation : " + e.tostring()); return null; Pour sup pri mer le bucket, nous pro cé dons de manière ana logue : private class DeleteBucketTask ex tends AsyncTask<String, Void, protected Void doinbackground(string... bucketsnames) try // On sup prime les buckets for(int i = 0; i < bucketsnames.length; i++) s3client.deletebucket(bucketsnames[i]); catch (Excep tion e) // Excep tions pos sibles : AmazonClientException et // AmazonServiceException Log.d("AWS", "Erreur sup pres sion : " + e.tostring()); return null; Nous pou vons appe ler nos actions de la façon sui vante : new CreateBucketTask().execute(BUCKET_NAME); et new DeleteBucketTask().execute(BUCKET_NAME); 150

159 Une fois le bucket créé, il est pos sible de gérer les fichiers qui sont à l inté rieur. Ce qu il ne faut pas faire Dans le cas de S3, comme dans tout sys tème de sto ckage dis tant, il faut bien sûr prendre en compte le temps de récu pé ra tion ou d envoi du fichier en fonc - tion de sa taille et de la connexion actuelle. Si on accède à un bucket par tagé entre plu sieurs uti li sa teurs, il faut éga le - ment prendre en compte le fait que le fichier peut avoir changé entre temps, ou qu un téléchargement peut être effec tué en paral lèle d un envoi par un autre appa reil. Dans le cas où l exac ti tude des fichiers est impor tante, il faut donc véri fier régu liè re ment que la ver sion en notre pos ses sion est bien la der nière en date, et avoir un méca nisme de mar quage ou de méta données. Recette N 51 Ges tion des fichiers Ce qu il faut savoir Dunod Toute reproduction non autorisée est un délit. Amazon S3 per met d accé der aux buckets et aux objets conte nus via un méca nisme combiné de : Listes de contrôle d accès (ACL) : Une A CL est une liste d auto ri sa tion (et pas d inter dic tion, tout ce qui n est pas auto risé étant inter dit). Une A CL peut por ter sur les élé ments sui vants : Un compte AWS, Tous les comptes AWS, N importe quelle requête. Policies de bucket : Un dis po si tif de contrôle au niveau du bucket et des objets conte nus. Ces règles sont atta chées au bucket. Policies Identity and Access Mana ge ment (IAM) : Méca nisme de contrôle construit sur le méca nisme de ges tion des iden ti tés d AWS. Ces règles sont atta chées à l uti li sa teur. 151

160 Ce qu il faut faire On peut par exemple envoyer un fichier de la manière sui vante : /** * FileUploadTask * Fonc tion qui upload un fichier sur Amazon S3 bucketname Le nom du bucket à uti li ser filename Le nom du fichier dans le bucket (key) file Le fichier lui même */ private class FileUploadTask ex tends AsyncTask<Void, Void, Exception> private String bucketname = null; private String filename = null; private File file = null; public FileUploadTask (String bucketname, String filename, File file) this.bucketname = bucketname; this.filename = filename; this.file = protected Excep tion doinbackground(void... params) try // Contruction de la demande // on peut rajou ter des para mètres A CL et des metadata // dans le cas de stream PutObjectRequest por = new PutObjectRequest(bucketName, filename, file); // Envoi du fichier s3client.putobject(por); catch (Excep tion e) // Excep tions pos sibles : AmazonClientException et // AmazonServiceException 152

161 Log.d("AWS", "Erreur d envoi : " + e.getmessage()); return e; return protected void onpostexecute(excep tion result) super.onpostexecute(result); Dunod Toute reproduction non autorisée est un délit. if (result!= null) // mes sage uti li sa teur new AlertDialog.Builder(MainActivity.this).setTitle("Erreur d envoi").setmessage(result.getmessage()).show(); else // mes sage uti li sa teur new AlertDialog.Builder(MainActivity.this).setTitle("Envoi ter miné").setmessage("le fichier a été envoyé avec suc cès.").show(); De la même façon, nous pou vons lis ter les fichiers pré sents dans le bucket. Dans l exemple sui vant, nous allons affi cher la liste de tous les élé ments dans une TextView, une barre de pro gres sion en mode acti vité sera éga le ment uti li sée : <ProgressBar android:id="@+id/progressbar1" style="?android:attr/progressbarstylehorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/btnlist" android:indeterminate="true" android:visibility="gone" /> 153

162 Nous affi chons la barre avant notre appel à la tâche, celle- ci se char gera de la faire dis pa raître. private class RetreiveBucketContentTask ex tends AsyncTask<Void, Void, protected List<S3ObjectSummary> doinbackground(void... params) try ListObjectsRequest lor = new ListObjectsRequest(); lor.setbucketname(bucket_name); ObjectListing ol = s3client.listobjects(lor); if (!ol.istruncated()) List<S3ObjectSummary> objectsummaries = ol.getobjectsummaries(); return objectsummaries; catch (Excep tion e) // Excep tions pos sibles : AmazonClientException et // AmazonServiceException Log.d("AWS", "Erreur liste : " + e.tostring()); return null; return protected void onpostexecute(list<s3objectsummary> result) super.onpostexecute(result); tvresult.settext("liste des élé ments du bucket :\n\n"); for (S3ObjectSummary objectsummary : result) tvresult.settext(tvresult.gettext() + objectsummary. getkey() + "\n"); 154

163 ProgressBar bar = (ProgressBar) findviewbyid(r. id.progressbar1); bar.setvisibility(progressbar.gone); Et enfin, sup pri mer un fichier donné, l effa ce ment se fai sant au tra vers de la clef S3 repré sen tant l objet. Dans notre cas il s agit du nom du fichier : /** * FileDeleteTask * Fonc tion qui sup prime un fichier sur Amazon S3 bucketname Le nom du bucket à uti li ser filename Le nom du fichier dans le bucket (key) */ private class FileDeleteTask ex tends AsyncTask<Void, Void, Exception> private String bucketname = null; private String filename = null; private File file = null; public FileDeleteTask (String bucketname, String filename) this.bucketname = bucketname; this.filename = filename; Dunod Toute reproduction non autorisée est un protected Excep tion doinbackground(void... params) try // Contruction de la demande DeleteObjectRequest dor = new DeleteObjectRequest(bucketName, filename); // Envoi du fichier s3client.deleteobject(dor); catch (Excep tion e) // Excep tions pos sibles : AmazonClientException et // AmazonServiceException 155

164 Log.d("AWS", "Erreur de sup pres sion : " + e.getmessage()); return e; return protected void onpostexecute(excep tion result) super.onpostexecute(result); if (result!= null) // mes sage uti li sa teur new AlertDialog.Builder(MainActivity.this).setTitle("Erreur de sup pres sion").setmessage(result.getmessage()).show(); else // mes sage uti li sa teur new AlertDialog.Builder(MainActivity.this).setTitle("Sup pres sion ter mi née").setmessage("le fichier a été sup primé avec succès.").show(); Ce qu il ne faut pas faire Dans un envi ron ne ment tra di tion nel, l un des objec tifs du déve lop peur est d opti mi ser les temps de trans fert pour garan tir un maxi mum de per for mance à par tir des res sources qu il a à sa dis po si tion. Dans un envi ron ne ment Cloud comme le pro pose AWS, il est impor tant d avoir à l esprit que, si la puis sance dis po nible per met de régler le pro blème de per for mance plus ou moins auto ma ti que ment, elle a aussi un coût finan - cier qui dépend du volume de don nées sto ckées et trans fé rées ainsi que du nombre de requêtes effec tuées. 156

165 Ainsi, si les consé quences d une mau vaise concep tion ne se res sen ti ront pas for cé ment au niveau per for mance, celle- ci peut néan moins engen drer des consé quences finan cières non négli geables. Recette N 52 Sto cker des don nées avec SimpleDB Ce qu il faut savoir SimpleDB est un envi ron ne ment de base de don nées non rela tion nel dis po - nible au sein d AWS et qui per met de gérer les don nées de type texte à l aide de dif fé rentes méthodes. SimpleDB peut- être consi déré comme un méca nisme sim pli fié de tables compo sées de dif fé rents élé ments : Le domaine (Domain) : est consi déré comme une table, L objet (Item) : une entrée dans la table, Un attri but (Attribute) : un iden ti fiant de colonne dans la table, Une valeur (Value) : qui est en fait dépen dante de l attri but et forme une paire attri but/valeur pour un objet donné. Dunod Toute reproduction non autorisée est un délit. Note : Chaque objet peut avoir un nombre d attri buts dif fé rent, ainsi seule la ges tion stricte par le déve lop peur per met de gar der un fonc tion ne ment proche de celui d une base de don nées. Il faut cepen dant gar der à l esprit que l on est plus proche du fonc tion ne ment d un tableur aux capa ci tés de sto ckage phé no mé nales. Que per met l API SimpleDB? L API mise à dis po si tion per met de réa li ser les actions sui vantes : 1. CreateDomain : Crée un domaine qui contient votre ensemble de don nées. 2. DeleteDomain : Sup prime un domaine. 3. ListDomains : Liste tous les domaines. 157

166 4. PutAttributes : Ajoute ou met à jour un objet et ses attri buts, ou ajoute une paire attri but/valeur à des objets déjà exis tants. Les objets sont auto ma - ti que ment indexés à leur récep tion. 5. DeleteAttributes : Sup prime un objet, un attri but ou un attri but/ valeur. 6. Select : Inter roge l ensemble des don nées avec la syn taxe fami lière «SELECT target FROM domain_name WHERE query_expres sion». Les tests de valeur pris en charge sont : =,!=, <, >, <=, >=, like, not like, between, in, is null, is not null et every(). 7. GetAttributes : Extrait un objet, et tout ou un sous- ensemble de ses attri buts et valeurs. 8. BatchPutAttributes : Pour un plus grand débit glo bal d écri ture en bloc, exé cute jus qu à 25 opé ra tions PutAttribute en un seul appel. 9. BatchDeleteAttributes : Pour un plus grand débit glo bal de sup - pres sion en bloc, exé cute jus qu à 25 opé ra tions DeleteAttributes en un seul appel. Ce qu il faut faire Avant d uti li ser SimpleDB il faut pen ser à ajou ter au pro jet la librai rie awsandroid-sdk sdb.jar Sup po sons que l on sou haite faire un car net d adresses simple, conte nant Pré nom, Nom, Numéro de télé phone, E- mail. La table s appel lera «contacts». De la même manière que pour S3, un client doit être créé (et éven tuel le ment conservé au niveau de l appli ca tion) pour l accès à SimpleDB : sdbclient = new AmazonSimpleDBClient(new BasicAWSCredentials(ACCESS_KEY_ID, SECRET_KEY)); // Ne pas oublier le endpoint cor res pon dant à notre région sdbclient.setendpoint( sdb.eu-west-1.amazonaws.com ); Créer la table cor res pon dante ne néces si tant pas de schéma par ti cu lier, on fait sim ple ment : 158

167 private class CreateDomainTask ex tends AsyncTask<String, Void, protected Void doinbackground(string... domainsnames) try // On crée les domaines for(int i = 0; i < domainsnames.length; i++) CreateDomainRequest cdr = new CreateDomainRequest(domainsNames[i]); sdbclient.createdomain(cdr); catch (Excep tion e) // Excep tions pos sibles : AmazonClientException, // AmazonServiceException // InvalidParameterValueException, // NumberDomainsExceededException, // MissingParameterException Log.d("AWS", "Erreur creation : " + e.tostring()); return null; Dunod Toute reproduction non autorisée est un délit. La créa tion des colonnes se fait au tra vers de la créa tion d objet pos sé dant des attri buts : private class CreateItemTask ex tends AsyncTask<Void, Void, Void> private String domainname = null; private String itemname = null; private Map<String, String> attributesmap = null; public CreateItemTask (String domainname, String itemname, Map<String, String> attributesmap) this.domainname = domainname; this.itemname = itemname; 159

168 this.attributesmap = protected Void doinbackground(void... params) try List<ReplaceableAttribute> attributes = new ArrayList<ReplaceableAttribute>(); // On crée l item avec ses attri buts for(map.entr y<string, String> e : attributesmap. entryset()) attributes.add(new ReplaceableAttribute(e.getKey(), e.getvalue(), Boolean.TRUE)); Log.d("AWS", "attri buts : " + e.getkey() + " valeur : " + e.getvalue()); PutAttributesRequest par = new PutAttributesRequest(domainName, itemname, attributes); sdbclient.putattributes(par); catch (Excep tion e) Log.d("AWS", "Erreur creation : " + e.tostring()); return null; Il suf fit ensuite d appe ler notre tâche : Map<String, String> data = new HashMap<String, String>(); data.put("nom", "Impérial"); data.put("prenom", "Fabrice"); data.put("tel", " "); data.put(" ", "my. @my domain.fr"); new CreateItemTask("contacts", "client0", data).execute(); 160

169 Une base de don nées sert prin ci pa le ment à la recherche d infor ma tions, ce qui se fait au tra vers de requêtes SELECT. Par exemple, une fonc tion qui per met d envoyer une requête SQL et de récu - pé rer le résul tat : private class QuerySelectTask ex tends AsyncTask<Void, Void, SelectResult> private String sql = null; public QuerySelectTask (String sql) this.sql = sql; Dunod Toute reproduction non autorisée est un protected SelectResult doinbackground(void... params) try SelectRequest sr = new SelectRequest(sql); // Ren voi de résul tat return sdbclient.select(sr); catch (Excep tion e) Log.d("AWS", "Erreur select : " + e.tostring()); return protected void onpostexecute(selectresult result) super.onpostexecute(result); // On traite le retour direc te ment dans un TextView pour // l exemple tvresult.settext("résul tat de la requête :\n\n"); for (Item item : result.getitems()) tvresult.settext(tvresult.gettext() + item.getname() + "\t"); for(attribute attribute : item.getattributes()) 161

170 tvresult.settext(tvresult.gettext() + attribute. getvalue() + "\t"); tvresult.settext(tvresult.gettext() + "\n"); // La même barre de progression utilisée précédemment ProgressBar bar = (ProgressBar) findviewbyid(r. id.progressbar1); bar.setvisibility(progressbar.gone); Il suf fit ensuite d appe ler notre tâche : ProgressBar bar = (ProgressBar) findviewbyid(r.id.progressbar1); bar.setvisibility(progressbar.visible); new QuerySelectTask ( SELECT * FROM contacts ).execute(); Il est éga le ment pos sible d effa cer des don nées obso lètes, le cas échéant : private class DeleteItemTask ex tends AsyncTask<String, Void, Void> private String domainname = null; public DeleteItemTask (String domainname) this.domainname = protected Void doinbackground(string... itemnames) try DeleteAttributesRequest dar = new DeleteAttributesRequest(); dar.setdomainname(domainname); 162

171 // On sup prime l item completement sans para mètre // d attri but for(int i = 0; i < itemnames.length; i++) dar.setitemname(itemnames[i]); sdbclient.deleteattributes(dar); catch (Excep tion e) Log.d("AWS", "Erreur sup pres sion : " + e.tostring()); return null; Il suf fit ensuite d appe ler notre tâche : new DeleteItemTask( contacts ).execute( client0 ); Ce qu il ne faut pas faire Atten tion, un objet n existe qu au tra vers de ses attri buts. À la manière d un tableur, effa cer une ligne n a pas de sens : on efface le contenu des cel lules de la ligne (déca lant éven tuel le ment les valeurs des lignes en des sous vers le haut). Dans SimpleDB, au lieu d avoir des numé ros de ligne, on a des noms de lignes. On n efface donc que le contenu des objets. 163

172

173 Windows Azure Mobile Ser Vices Chapitre 14 Recette n 53 Pré pa rer son pro jet pour Azure Ce qu il faut savoir Windows Azure est une pla te forme applicative sur le Cloud mise en place par Microsoft et dis po nible depuis Il s agit d une offre d héber ge ment d appli - ca tions, de don nées et de ser vices qui, depuis juin 2012, per met d héber ger des sites Web et d exé cu ter des machines vir tuelles Windows et Linux. La pla te forme Azure pro pose aujourd hui l ensemble des fonc tion na li tés des grands acteurs du Cloud dont Amazon, que nous avons pré cé dem ment évo qué. Dans le cadre de son offre Mobile Ser vices, Microsoft pro pose un accès mobile à une base de don nées SQL dans le Cloud. Une base est ainsi appe lée une appli ca tion et contient des tables et des don nées. Une des par ti cu la ri tés de ces tables est le «blob» qui est uti lisé pour sto - cker des don nées binaires de gros volumes. Il devient ainsi pos sible, dans une cer taine mesure, de sto cker des fichiers au tra vers de ce ser vice. Ce qu il faut faire Le SDK Azure pour Android est téléchargeable depuis un GitHub à l adresse sui vante : Comme pour toute base SQL acces sible sur un ser veur stan dard, l accès aux bases de Windows Azure se fait à tra vers la défi ni tion : Du nom d une base (Nom d appli ca tion), D un iden ti fiant, D un mot de passe. 165

174 Note : Windows Azure pro pose dif fé rents modèles de tari fi ca tion allant du Pay- Per-Use iden tique au modèle d Amazon à une tari fi ca tion sur base de for fait men suel, avec une limite sur les tailles de bases de don nées et les volumes de tran sac tions. Il nous faut dans un pre mier temps impor ter la librai rie dans notre pro jet : Framework uti lisé pour Windows Azure L uti li sation de cette librai rie se fera ensuite en impor tant le pro jet storage dans le Workspace puis en ajou tant dans les dépen dances de l appli ca tion le pro jet cor res pon dant en cochant la case «Is Library» : Propriétés du projet 166

175 Le framework per met de dis po ser d un accès sim pli fié à la par tie serveur notam ment au tra vers des packages com.windowsazure.samples. android.storageclient et com.windowsazure.samples.android. accesscontrol conte nant les classes sui vantes : com.windowsazure.samples.android.cloudclientaccount : gère la par tie iden ti fi cation, connexion et trans mis sion des don nées. com.windowsazure.samples.android.cloudtableclient : représente une table de la base. com.windowsazure.samples.android.cloudqueueclient : permet de commu ni quer avec le ser veur. Recette n 54 Créer un nou veau ser vice mobile Ce qu il faut savoir Windows Azure pro pose une solu tion Cloud sim pli fiant la ges tion du sto ckage, les noti fi cations et la confi gu ra tion de l authentification uti li sa teur. Ce ser - vice, nommé Mobile Services, per met aux déve lop peurs de sto cker des don nées sim ple ment et de pou voir y accé der sans avoir à se pré oc cu per de la ges tion de la par tie ser veur de leurs appli ca tions. Dunod Toute reproduction non autorisée est un délit. Ce qu il faut faire Pour créer le ser vice mobile, il fau dra se rendre dans la console d admi nis tra tion de Windows Azure et sélec tion ner Service Mobile dans le menu Calcul : Création du service mobile 167

176 Notre ser vice mobile va prin ci pa le ment être composé d une base de don nées qu il va nous fal loir défi nir. Configuration de l URL Base de don nées et appli ca tions mobiles sur Azure L approche choi sie par Windows Azure est de combi ner en un seul élé ment logique la notion d appli ca tion et de ser veur. Par conséquent, le choix de ce nom revêt une impor tance toute par ti cu lière : il défi nit éga le ment un nom de domaine et donc une URL d accès. Une fois ce ser veur vir tuel défini, nous allons para mé trer la base de don nées. Il est pos sible de défi nir une nou velle ins tance ou d uti li ser une base déjà exis tante. Nous pour rons ainsi défi nir les identifiants de connexion de notre base ainsi que le lieu de sto ckage de cette der nière. Configuration de la base de don nées 168

177 Les identifiants four nis per met tront éga le ment d accé der à la base en C#, PHP et node.js. Par ailleurs, l archi tec ture d accès est construite autour de REST, ce qui per met en théo rie d être complè te ment agnos tique quant à la pla te forme et au lan gage uti lisé. Dans le cas d Android, nous allons uti li ser un sys tème de clés qui dif fère légè re ment de ces para mètres : une clé d appli ca tion, une clé prin ci pale. Ces deux clés peuvent être géné rées direc te ment depuis la console d admi - nis tra tion Azure. Une fois les clés obte nues, le ser vice est prêt à être uti lisé. Interface d administration de Windows Azure Dunod Toute reproduction non autorisée est un délit. Ce qu il ne faut pas faire N oubliez pas que les ser vices de Cloud, s ils sim pli fient l accès aux don nées, n en res tent pas moins des ser vices payants ou l élé ment défi nis sant la fac tu - ra tion est le volume de don nées sto ckées et échan gées. Ainsi, une par tie du temps gagné sur l implémentation de la par tie ser veur doit être consa crée à l opti mi sation de cette der nière. 169

178 Recette n 55 Ajou ter une table pour le sto ckage Ce qu il faut savoir Les Mobile Ser vices per mettent d accé der à une base de don nées SQL. Vous pou vez soit vous connec ter à une base de don nées exis tante, soit en créer une. Ce qu il faut faire Depuis l inter face d admi nis tra tion de Windows Azure, nous allons pou voir créer une table qui sto ckera nos don nées. Créa tion d une table dans Windows Azure Par défaut, les tables créées uti lisent un schéma dyna mique, ce qui nous permetttra de gérer nos colonnes direc te ment depuis notre code. 170

179 Ce qu il ne faut pas faire Si l accès est sim pli fié, une atten tion par ti cu lière est à appor ter dans la concep tion des tables! Une mau vaise struc ture entraînera des requêtes complexes et par fois un besoin de refonte en cas d ajout de nou velles fonc - tion na li tés dans votre appli ca tion. Recette n 56 Accé der aux don nées Azure Ce qu il faut savoir Dunod Toute reproduction non autorisée est un délit. Dans le Framework Azure pour Android, un item est repré senté en mémoire par un dic tion naire dont les clés cor res pondent aux colonnes et les valeurs au contenu de ces der nières. Avant toute interaction avec la base, nous devons pré pa rer l objet de type MobileServiceClient cor res pon dant à la connexion au ser veur et donc aux don nées. Chaque table pré sente dans la base sera repré sen tée par un objet de type MobileServiceTable dans notre code et iden ti fiée par son nom. Les colonnes pré sentes dans cette table seront construites au fur et à mesure des ajouts de don nées et mises en cor ré la tion avec les dic tion naires repré sen - tant les objets conte nus dans cette même table. Cette table ne contient rien à prop re ment par ler mais cor res pond à l objet sur lequel nous allons appe ler toutes les méthodes d ajout, d effa ce ment et de recherche. L ensemble des méthodes de mani pu la tion de don nées sur les tables fonc - tionnent de manière asyn chrone à l aide de blocs, le prin cipe de base étant de : Pré pa rer la commande, Exécuter la commande sur une table, Four nir un bloc de complé tion qui sera rap pelé une fois la commande effec tuée. 171

180 Ce qu il faut faire La pre mière étape sera d ajouter la ligne sui vante dans le fichier Manifest : <uses permission android:name="android.per mission.inter NET" /> Ajou tez la ligne sui vante au début du fichier.java conte nant l acti vité de votre pro gramme de lan ce ment : import com.microsoft.windowsazure.mobileservices.*; Au sein de votre acti vité, ajou tez une variable pri vée : private MobileServiceClient mclient; Ajou tez le code sui vant à la méthode oncreate de l Activity : MobileServiceClient mclient = new MobileServiceClient( " "LVojsnXMemWycUUYJWnkCYqtnRaltk57", this ); Les para mètres applicationurl et applicationkey sont ici des variables pri vées cor res pon dant aux para mètres présents dans la console d admi nis tra tion d Azure. Note : il est for te ment recom mandé de conser ver le client dans une variable d ins tance de l Activity par exemple, afin de ne pas le recréer à chaque appel aux don nées. En revanche, il faut bien pen ser à le déconnec ter lors de la mise en veille de l appli ca tion et à le recréer lors la réac ti vation. Chaque table pré sente dans la base sera repré sen tée par un objet de type MobileServiceTable<Type> dans notre code et iden ti fiée par son nom, Type étant une classe écrite par le déve lop peur et ser vant à faire le lien entre les variables d ins tances de Type et les colonnes de la table. 172

181 Sup po sons que notre base contienne une simple liste de contacts : public class tations.serializedname("id") public String tations.serializedname("nomdefamille") public String tations.serializedname("prenom") public String tations.serializedname(" ") public String tations.serializedname("telephone") public String mtelephone; On pourra ainsi accé der à la table de la manière sui vante : MobileServiceTable<Contact> mcontactstable = mclient. gettable("mes Contacts", Contact.class); Dunod Toute reproduction non autorisée est un délit. L ensemble des méthodes de mani pu la tion de don nées sur les tables fonc tionne de manière asyn chrone à l aide de callback, le prin cipe de base étant de : Pré pa rer la commande, Exécuter la commande sur une table, Four nir une classe conte nant une méthode de callback qui sera rap pelée une fois la commande effec tuée. La pre mière chose à faire est d ajou ter des élé ments dans la table. Sup po sons que l on sou haite faire un car net d adresses simple, conte nant Prenom, Nom, Numero de telephone, . La table s appel lera «contacts». Notre fonc tion pourra être de la forme sui vante : 173

182 /** * addcontacttotable:firstname:lastname:phonenumber: * fonc tion qui per met d ajou ter un nou veau contact dans la table table table dans laquelle ajou ter le contact fn prenom ln nom de famille pn numero de telephone */ public void addcontacttotable(string table, String fn, String ln, String pn, String ) MobileServiceTable<Contact> mcontactstable = mclient. gettable("mes Contacts", Contact.class); Contact element = new Contact(); element.mprenom = fn; element.mnomdefamille = ln; element.mtelephone = pn; element.m = ; mcontactstable.in sert(element, new public void oncompleted(contact arg0, Excep tion arg1, ServiceFilterResponse arg2) if(arg1!= null) arg1.printstacktrace(); ); Cette fonc tion pourrait être appe lée comme suit : addcontacttotable("mes Contacts", "Nico", "Zino", " ", "[email protected]"); Il est par ailleurs pos sible de visua li ser le contenu de la table direc te ment depuis la page d admi nis tra tion : 174

183 Page d administration de Windows Azure La recherche de don nées s appuie sur un sys tème de query propre à la classe MobileServiceQuery de la manière sui vante : Dunod Toute reproduction non autorisée est un délit. /** * launchqueryforlastname * fonc tion qui lance une recherche dans la base pour trou ver le contact correspondant au nom de famille cette methode rap pel lera la methode processcontacts(list) tn le nom de la table conte nant les contacts ln le nom de famille a recher cher */ public void launchqueryforlastname(string tn, String ln) MobileServiceTable<Contact> mcontactstable = mclient. gettable(tn, Contact.class); MobileServiceQuery<TableQueryCallback<Contact>> q = mcontactstable.where().field("nomdefamille").eq(ln); q.execute(new public void oncompleted(list<contact> result, int count, Exception exc, 175

184 ServiceFilterResponse resp) if(exc!= null) exc.printstacktrace(); else processcontacts(result); ); Ce qu il ne faut pas faire Atten tion, les fonc tions d effa ce ment et de mise à jour se basent sur l id de l objet. Cet id doit donc néces sai re ment être sau ve gardé en RAM pour iden - ti fier l objet. Pour effa cer un objet, nous pour rons faire comme suit : /** * fonc tion qui efface un element base sur son id tn nom de la table id id de l objet à effa cer */ public void deletecontact(string tn, int id) MobileServiceTable<Contact> mcontactstable = mclient. gettable(tn, Contact.class); mcontactstable.delete(id, new public void oncompleted(excep tion exc, ServiceFilterResponse res) if(exc!= null) exc.printstacktrace(); ); 176

185 Par exemple pour effa cer l id 2 : deletecontact("mes Contacts", 2); Concer nant la mise à jour, la méca nique est simi laire : /** * fonc tion qui per met de mettre a jour un element en base tn c */ public void updatecontactintable(string tn, Contact c) MobileServiceTable<Contact> mcontactstable = mclient. gettable(tn, Contact.class); mcontactstable.update(c, new public void oncompleted(contact uc, Excep tion exc, ServiceFilterResponse res) if(exc!= null) exc.printstacktrace(); ); Atten tion : l objet de type Contact conte nant les infor ma tions mises à jour doit avoir le même id que l objet qu il rem place. 177

186

187 Sto ckage de fichiers dans le Cloud Chapitre 15 Recette N 57 Connexion à Dropbox depuis une appli ca tion Ce qu il faut savoir Dropbox four nit une API dis po nible à l adresse sui vante : La pre mière étape sera de créer depuis le site Dropbox un couple de clés de la forme APPKEY/APPSECRET qui sera lié à l appli ca tion. Note : En phase de déve lop pe ment, dropbox auto rise 5 testeurs qui peuvent être upgradés à 100, et ce sans sur coût mais cela n est pas auto ma tique, il faut en faire la demande. Ensuite, l appli ca tion peut pas ser en «Pro duc tion Status», ce qui sup pose un ensemble de règles de confor mité à res pec ter. Ces règles sont dis po nibles sur le site de Dropbox direc te ment à l adresse sui vante : Deux modes d accès existent : App Folder : Per met de mani pu ler un ensemble de fichiers pré sents dans un réper toire atta ché à l appli ca tion. Ce réper toire sera acces sible à la racine de Dropbox/Apps/Nom_De_l APPLI CATION, Full Dropbox : Donne accès à l ensemble des élé ments pré sents dans le compte de l uti li sa teur. Au lan ce ment de l appli ca tion, lors de l authen ti fi cation Dropbox, le SDK pré - sen tera un dia logue per met tant de s authen ti fier et don nant des infor ma tions sur le mode choisi. 179

188 Ecran d accueil de DropBox Ce qu il faut faire Avant toute chose il nous fau dra auto ri ser cer tains compor te ments dans notre appli ca tion au tra vers de l inser tion des élé ments sui vants dans notre Manifest : <activity android:name="com.dropbox.client2.android.authactivity" android:launchmode="singletask" android:configchanges="orien ta tion keyboard"> <intent- filter> <! Remplacer CHANGER ci dessous par la clé de l appli cation --> <data android:scheme="db CHANGER" /> <action android:name="android.intent.action.view" /> <category android:name="android.intent.category. BROWSABLE"/> <category android:name="android.intent.category.default" /> </intent- filter> </activity> 180

189 Pour ouvrir une ses sion uti li sa teur il faut tout d abord pré pa rer les variables d ins tance de la classe : final static private String ACCESS_KEY_NAME = "ACCESS_KEY"; final static private String ACCESS_SECRET_NAME = "ACCESS_ SECRET"; // Ces constantes seront uti li sées par le sys tème de // préférences final static private String ACCOUNT_PREFS_NAME = "AppPrefs"; final static private String ACCESS_KEY_NAME = "APPKEY"; final static private String ACCESS_SECRET_NAME = "APPSECRET"; De plus, le mode App Folder ou Full Dropbox est défini lors de la créa tion de l APPKEY depuis le site. Il nous faut ensuite reprendre ces para mètres et les décla rer dans notre appli ca tion : final static private AccessType ACCESS_TYPE = AccessType.APP_ FOLDER; //Sup po sons que l on sou haite être en accès Full Dropbox : //final static private AccessType //ACCESS_TYPE = AccessType.DROPBOX; Au lan ce ment de l appli ca tion, lors de l authen ti fi cation Dropbox, le SDK pré - sen tera un dia logue per met tant de s authen ti fier et don nant des infor ma tions sur le mode choisi. Dunod Toute reproduction non autorisée est un délit. DropboxAPI<AndroidAuthSession> mapi; AndroidAuthSession ses sion = buildsession(); mapi = new DropboxAPI<AndroidAuthSession>(session); mapi.getsession().startauthentication(this); La fonc tion buildsession, uti li sée ci- dessus, per met de récu pé rer les clés si l uti li sa teur s est déjà authen ti fié sur Dropbox ou de pré sen ter une invite de connexion dans le cas contraire. La fonc tion est struc tu rée ainsi et est complé tée par une série de fonc tions per met tant de sto cker et de récu pé rer les tokens asso ciés à la ses sion : private AndroidAuthSession buildsession() AppKeyPair appkeypair = new AppKeyPair(APP_KEY, APP_SECRET); AndroidAuthSession ses sion; 181

190 String[] prefvalues = keysfrompreferences(); if (prefvalues == null) // l uti li sa teur ne s est jamais authen ti fié ses sion = new AndroidAuthSession(appKeyPair, ACCESS_ TYPE); else // le token est déjà dans les pré fé rences AccessTokenPair token = new AccessTokenPair(prefValues[0], prefvalues[1]); ses sion = new AndroidAuthSession(appKeyPair, ACCESS_TYPE, token); return ses sion; /** * keysfrompreferences * fonc tion qui récu père les valeurs pas sées par l ouver ture de session * dans Dropbox un tableau de 2 chaines clé/secret */ private String[] keysfrompreferences() SharedPreferences prefs = getsharedpreferences(account_ PREFS_NAME, 0); String key = prefs.getstring(access_key_name, null); String secret = prefs.getstring(access_secret_name, null); if (key!= null && secret!= null) String[] ret = new String[2]; ret[0] = key; ret[1] = secret; return ret; else return null; Lors du pre mier lan ce ment de l appli ca tion, nous allons donc tom ber dans le cas où getkeysfrompreferences nous ren verra null, ce qui affi - chera une Activity per met tant à l uti li sa teur de s authen ti fier et d auto ri - ser l appli ca tion à accé der à ses don nées per son nelles. Une fois cette Activity ter mi née, le sys tème nous rap pel lera sur la méthode onresume dans laquelle nous allons pou voir sto cker les tokens. 182

191 @Override protected void onresume() super.onresume(); AndroidAuthSession ses sion = mapi.getsession(); if (ses sion.authenticationsuccessful()) try // L authen ti fi cation s est bien ter mi née ses sion.finishauthentication(); // On stocke les clés pour ne pas ré afficher le // dia logue TokenPair tokens = ses sion.getaccesstokenpair(); savekeys(tokens.key, tokens.secret); catch (IllegalStateException e) Enfin, la fonc tion savekey per met de sto cker le token dans les pré fé rences : Dunod Toute reproduction non autorisée est un délit. /** * fonc tion qui stocke dans les pré fé rences les tokens per met tant de se ré authen ti fier * sans dia logue key la clé publique secret la clé secrète */ private void savekeys(string key, String secret) // Comme dans le cha pitre 1 SharedPreferences prefs = getsharedpreferences(account_ PREFS_NAME, 0); Editor edit = prefs.edit(); edit.putstring(access_key_name, key); edit.putstring(access_secret_name, secret); edit.commit(); Sup po sons que l on sou haite récu pé rer un fichier présent dans un réper toire de Dropbox, nous pou vons le faire en uti li sant la fonc tion sui vante : 183

192 /** * fonc tion qui per met de sto cker un fichier depuis dropbox dans un répertoire local atten tion au sto ckage (INTERNAL ou EXTERNAL) et aux droits d accès filename le nom du fichier côté Dropbox des ti nation le che min du fichier côté Android */ public void getdropboxfile(string filename, String des ti nation) File outputfile = null; FileOutputStream fos = null; try outputfile = new File(des ti nation); fos = new FileOutputStream(outputFile); mapi.getfile(filename, null, fos, null); catch (FileNotFoundException e) e.printstacktrace(); catch (DropboxException e) e.printstacktrace(); La méthode uti li sée pour envoyer des fichiers est très proche de celle vue pré cé dem ment pour les récu pé rer. Sup po sons que l on sou haite envoyer un fichier dans un réper toire de Dropbox, nous pou vons le faire en uti li sant la fonc tion sui vante : /** * fonc tion qui per met de sto cker un fichier depuis un réper toire local dans dropbox atten tion au sto ckage (INTERNAL ou EXTERNAL) et aux droits d accès filename le nom du fichier côté Android des ti nation le che min du fichier côté Dropbox */ 184

193 public void putdropboxfile(string filename, String des ti nation) File inputfile = null; FileInputStream fis = null; try inputfile = new File(des ti nation); long filelength = inputfile.length(); fis = new FileInputStream(inputFile); mapi.putfile(des ti nation, fis, filelength, null, null); catch (FileNotFoundException e) e.printstacktrace(); catch (DropboxException e) e.printstacktrace(); Ce qu il ne faut pas faire Atten tion, le fait que l on ait des méthodes delegate indique que l ensemble de ces trai te ments sont faits en asyn chrone. Il faut donc bien prendre en compte les modi fi ca tions seule ment à récep tion de la vali da tion ser veur. Recette N 58 Uti li ser Google Drive dans vos appli ca tions Ce qu il faut savoir L accès à Google Drive n est pas à prop re ment par ler un accès à un espace de sto ckage agnos tique: les élé ments pré sents dans l espace «disque» sont des conte neurs qui pos sèdent des méta- données per met tant à cer taines appli - ca tions de les lire. 185

194 Vis- à-vis d Android, la par ti cu la rité de Google Drive est que le sys tème de clef pour l accès aux fonc tion na li tés est séparé de la clef per met tant d accé - der aux autres ser vices de la pla te forme (maps, etc.) : il faut uti li ser un client oauth2 spé ci fique. Dans la console de déve lop pe ment du pro jet, il faut donc commen cer par acti ver les deux élé ments Google Drive, puis créer un client ID spé ci fique au cer ti fi cat qui sera uti lisé. Création d un client OAuth2 dans la console de développement Alors seule ment, l appli ca tion Android aura accès aux don nées sto ckées dans l espace. Côté pro jet, il faut inclure le Google Drive SDK, le Google Play Developer SDK, et la librai rie. Ce qu il faut faire Une fois tous les élé ments mis en place, on peut uti li ser le ges tion naire de comptes Google inté gré au sys tème pour accé der au Drive, classe qui repré - sente les opé ra tions pos sibles côté Java: 186

195 private static Drive ser vice; private GoogleAccountCredential credential; // À la créa tion de la vue, on récu père le compte pré cé dem ment // uti lisé s il protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); SharedPreferences settings = getsharedpreferences(prefs_name, 0); String accountname = settings. getstring("gdriveaccount", null); credential = GoogleAccountCredential. usingoauth2(this, DriveScopes.DRIVE); if(displayname == null) startactivityforresult(credential. newchooseaccountintent(), REQUEST_ACCOUNT_PICKER); else credential. setselectedaccountname(accountname); service = getdriveservice(credential); //... Dunod Toute reproduction non autorisée est un délit. // Une fois le compte protected void onactivityresult(final int requestcode, final int resultcode, final Intent data) switch (requestcode) case REQUEST_ACCOUNT_PICKER: if (resultcode == RESULT_OK && data!= null && data.getextras()!= null) String accountname = data. getstringextra(accountmanager.key_account_name); if (accountname!= null) credential. setselectedaccountname(accountname); ser vice = getdriveservice(credential); SharedPreferences settings = getsharedpreferences(prefs_name, 0); 187

196 Editor e = settings.edit(); accountname); e.putstring("gdriveaccount ", e.commit(); break; case REQUEST_AUTHORIZATION: if (resultcode == Activity.RESULT_OK) // refaire l operation apres authen ti fi cation, par ex : savefiletodrive(); else startactivityforresult(credential. newchooseaccountintent(), REQUEST_ACCOUNT_PICKER); break; // Creation de l objet Drive representant le ser vice private Drive getdriveservice(googleaccountcredential credential) return new Drive.Builder(AndroidHttp. newcompatibletransport(), new GsonFactory(), credential).setapplicationname("gdrivetest") // impor tant! le nom doit cor res pondre a celui dans la console!.build(); Ce qu il ne faut pas faire La mise en place des auto ri sa tions néces saire est multipartite et peut appa - raître complexe. Il faut avant tout comprendre que tous ces élé ments sont néces saires pour accé der au Google Drive d un uti li sa teur, et qu ils doivent cor res pondre à tous les niveaux : Le nom de package de l appli ca tion, Le SHA1 de la clef uti li sée pour signer l appli ca tion, Le «Product Name», nom uti lisé par Google Drive pour iden ti fier l appli ca tion. 188

197 Si l un de ces élé ments manque à l appel, ou est dif fé rent d un côté ou de l autre, le ser vice ne fonc tion nera pas et don nera très peu d infor ma tion sur la rai son de l échec. Par ailleurs, dans de nom breux cas pour les quels la confi den tia lité des don - nées est un para mètre impor tant pour le client, atten tion à ne pas oublier d aver tir ce der nier des condi tions d uti li sation des ser vices Google. En effet, les ser veurs de sto ckage uti li sés par Google, comme par d autres socié tés pro po sant de l espace en ligne, sont situés sur le ter ri toire amé ri cain. Ceci peut contre ve nir aux lois que se doivent res pec ter cer tains uti li sa teurs dans le contexte de leur acti vité pro fes sion nelle. Recette N 59 Récu pé rer une copie d un fichier sur Google Drive Ce qu il faut savoir L inter face de Google Drive per met aux appli ca tions de gérer les fichiers depuis l API. L inter face Web per met de voir les fichiers et il est pos sible d obte nir une copie du fichier afin de pou voir effec tuer des opé ra tions des sus. Dunod Toute reproduction non autorisée est un délit. Ce qu il faut faire Sup po sons que l on sou haite récu pé rer la liste des fichiers pré sents dans le réper toire de l uti li sa teur, nous allons effec tuer une requête de la manière sui vante : private FileList cachedlist = null; private java.util.date cachedate = null; private File openorcreatefilewithname(string n) throws IOException FileList existingfiles = null; 189

198 if(cachedlist == null cachedate == null Math. abs(cachedate.gettime() - (new java.util.date()).gettime()) > 5 * 60000) // 5 min existingfiles = ser vice.files().list(). execute(); cachedlist = existingfiles; cachedate = new java.util.date(); else existingfiles = cachedlist; boolean exists = false; for(file ef : existingfiles.getitems()) if(ef.gettitle().contentequals(n)) exists = true; break; execute(); if(!exists) File body = new File(); body.settitle(n); body.setmimetype("plain/text"); File f = ser vice.files().in sert(body). execute(); existingfiles = ser vice.files().list(). cachedlist = existingfiles; cachedate = new java.util.date(); File file = null; for(file ef : existingfiles.getitems()) if(ef.gettitle().contentequals(n)) file = ef; break; return file; 190

199 Dunod Toute reproduction non autorisée est un délit. private void readfilefromdrive() Thread t = new Thread(new public void run() try File file = openorcreatefilewithname("dunod"); if(file!= null) String durl = file.getdownloadurl(); final String contents = readcontentsoffile(file); if(contents!= null) runonuithread(new public void run() ((EditText)findViewById(R.id.textView)). settext(contents); ); catch(exception e) final String msg = e.getlocalizedmessage(); runonuithread(new public void run() ((EditText)findViewById(R.id.textView)). settext("erreur:\n"+msg); ); ); t.start(); Ce qu il ne faut pas faire N oubliez pas que les fichiers sont par ta gés entre les uti li sa teurs. En effet le par tage est l une des fonc tion na li tés les plus uti li sées de Google Drive. Lors de l ouver ture d un fichier, véri fiez les rôles pour adap ter l inter face, en ne pro po sant par exemple que la consul ta tion dans cer tains cas. 191

200 Par ailleurs, les opé ra tions réseau étant longues et coû teuses, il est recom - mandé de gar der un cache de la liste des fichiers (pendant 5 minutes par exemple comme dans l'exemple précédent). Recette N 60 Uploader un fichier sur Google Drive Ce qu il faut savoir Google Drive per met d envoyer des fichiers et d en créer de nou veaux. Dans le cas de l envoi d un nou veau fichier, il fau dra consi dé rer cela comme une créa tion. Dans le cas où l on modi fie le for mat d un fichier, il est recom mandé de créer un nou veau fichier plu tôt que d écra ser l ancienne ver sion. Ce qu il faut faire Pour uploader un fichier la pro cé dure sera simi laire à celle uti li sée pour récu - pé rer un fichier : // fileuri contient l adresse d un fichier conte nant les données à envoyer private void savefiletodrive() Thread t = new Thread(new public void run() try // Atten tion au java.io.file et Drive.File! java.io.file filecontent = new java.io.file(fileuri.getpath()); FileContent mediacontent = new FileContent("plain/text", filecontent); 192

201 // méta données. File body = openorcreatefilewithname("dunod"); File file = getdriveservice(credential).files().update(body.getid(), body, mediacontent).execute(); if (file!= null) catch (UserRecoverableAuthIOException e) startactivityforresult(e. getintent(), REQUEST_AUTHORIZATION); catch (IOException e) e.printstacktrace(); ); t.start(); Ce qu il ne faut pas faire Dans le cas où l on main tient une ver sion locale du fichier, atten tion à prendre en compte les dif fé rentes ver sions du fichier, et ce sur tout pour évi ter des modi fi ca tions effec tuées 193

202

203 Annexes Implémentation de Web Ser Vices La plu part des appli ca tions ont besoin d accé der à des don nées à dis tance. Cela sup pose donc des archi tec tures ser veurs per met tant de four nir ces don - nées. Nous avons vu comment une appli ca tion mobile pou vait dis cu ter en tant que client avec un Web Ser vice, notam ment à travers l uti li sation de JSON. Dans cette annexe, nous nous intéresserons à l archi tec ture côté ser veur et aux dif fé rentes pos si bi li tés de mise en œuvre per met tant de four nir des don nées à nos appli ca tions. De nom breux élé ments sont à prendre en compte que ce soit en termes de sécu rité ou de dis po ni bi lité, et ils ne seront pas direc te ment abor dés ici. Les lan gages/frameworks dis po nibles pour mon ter des Web Ser vices sont nom breux et variés que ce soit du Microsoft avec IIS et C#, Oracle et Java/ JBoss, Tomcat ou encore Ruby On Rails, Apache/PHP, etc. 1 Comprendre le méca nisme des Web Ser vices Le but d un ser vice web est de per mettre un échange de don nées entre des envi ron ne ments hété ro gènes. Il est ainsi pos sible de faire commu ni quer des plateformes dif fé rentes et d échan ger des don nées avec d autres péri phériques, et ce quelles que soient les tech no logies employées de part et d autre. HTTP comme sup port des plateformes applicatives Du fait de l uni ver sa lité du pro to cole http, sup porté par tous les SDK, sur toutes les plateformes et capable de pas ser faci le ment la plu part des firewalls et autres solu tions de sécu rité ; les plateformes web se sont natu - rel le ment impo sées comme sys tème d échange de don nées. Mettre en œuvre un web service revient donc à publier un ensemble de fonc - tion na li tés direc te ment acces sibles par des appli ca tions à dis tance via un ser veur HTTP. 195

204 Dif fé rents for mats sont uti li sés pour la mise en œuvre de ser vices Web. 2 Les ser vices de type REST Les ser vices de type REST (REpresentational State Trans fer) exposent les fonc tion - na li tés sous forme d URI acces sibles direc te ment au tra vers du pro to cole HTTP. Exemple d implémentation de REST : supposons que nous sou hai tions publier un web ser vice sur le site pour récu pé rer le cata logue d ouvrages. Nous pour rions donc avoir : Une URL de type pour accé der à la liste des ouvrages. Une URL de type pour accé der aux pro prié tés d un ouvrage donné. Etc. Le client pour rait ainsi inter agir avec ses URI au moyen des méthodes HTTP telles que GET, PUT, etc. En retour, le ser veur nous ren ver rait des fichiers texte struc tu rés selon des conven tions variables. Voici différents exemples de retours : Retour en XML : <students> <count>1</count> <student> <birthdate> t12:03:26.590z</birthdate> <firstname>jack</firstname> <idbooster>59253</idbooster> <lastname>harkness</lastname> </student> </students> Retour en JSON : "count":"1", "student":[ "birthdate":" t12:03:26.590z", 196

205 , ] "firstname":"jack", "idbooster":"59253", "lastname":"harkness" Retour au for mat properties : btnyes = Oui btnno = Non btncancel = Annuler btnnew = Nouveau msgwelcome = Bienvenue dans notre application pour la France. Ces retours seront, à récep tion, inter pré tés par le client. 3 L approche WSDL / SOAP Dunod Toute reproduction non autorisée est un délit. Les ser vices de type SOAP (Simple Object Access Proto col) et WSDL (Web Service Description Language) uti lisent des pro to coles nor ma li sés pour la commu - ni ca tion. Ils ren forcent les concepts de REST en ajou tant des méca nismes de trans ferts de don nées inté grant les notions de qua lité de ser vice et de sécu - rité, ainsi que la publi ca tion de l archi tec ture des commandes, ce qui per met de faci li ter les inter connexions. Voici un exemple d échange SOAP construit sur XML. Sup po sons que l on sou haite obte nir le tarif d un pro duit via un Web Ser vice, la requête serait de la forme : POST /Prices HTTP/1.1 Host: Content- Type: appli ca tion/soap+xml; charset=utf-8 Content Length: nnn <?xml version="1.0"?> <soap:envelope xmlns:soap=" soap:encodingstyle=" 197

206 <soap:body xmlns:m=" <m:getprice> <m:stockname>iphone 5</m:StockName> </m:getprice> </soap:body> </soap:envelope> La réponse faite par le Web Ser vice pourrait ainsi être de la forme : HTTP/ OK Content- Type: appli ca tion/soap+xml; charset=utf-8 Content Length: nnn <?xml version="1.0"?> <soap:envelope xmlns:soap=" soap:encodingstyle=" <soap:body xmlns:m=" <m:getpriceresponse> <m:price>480</m:price> </m:getpriceresponse> </soap:body> </soap:envelope> Implé men ter un client SOAP revient donc à se confor mer à la norme repré sen - tée par le WSDL et ses XSD (XML Standalone Definition) asso ciés coté ser veur. 4 Exemple simple d implémentation : le système de bookmarking La grande majo rité des hébergeurs pré sents sur la toile, y compris les four - nis seurs d accès à Internet, dis posent d une pla te forme d héber ge ment capable de faire tour ner des pages PHP, ados sées géné ra le ment à une base MySQL. Nous allons donc prendre ces deux choix tech no lo giques par défaut pour pré sen ter un exemple de Web Ser vice simple de bookmarking. Ima gi nons une appli ca tion mobile per met tant de sau ver et de récu pé rer des liens HTTP pour réfé rence ulté rieure. Nous aurons donc besoin : 198

207 D un moyen d iden ti fier l uti li sa teur (nous lais se rons de côté la par tie authen ti fi cation et sup po se rons que l e- mail seul suf fit) ; D une liste de liens asso ciés à cet uti li sa teur et compo sés : D une date, D un titre, D une adresse URL. Le schéma de la base est donc simple (et pour rait pro ba ble ment être amé - lioré, mais nous lais se rons cela de côté pour le moment) : CREATE TABLE users (id INT AUTO_INCREMENT, VARCHAR(256)); CREATE TABLE links (userid INT, pubdate DATE DEFAULT NOW(), titre VARCHAR(128), url VARCHAR(1024)); Dunod Toute reproduction non autorisée est un délit. Nous avons besoin pour notre ser vice des fonc tions sui vantes : Créer un uti li sa teur (dont la liste est vide), Récu pé rer la liste des liens d un uti li sa teur, Ajou ter un élé ment dans la liste d un uti li sa teur, Effa cer un élé ment dans la liste d un uti li sa teur (iden ti fié par son URL, ce qui est pro ba ble ment le plus déter mi nant). Pour des rai sons de sim pli fi ca tion, nous allons donc créer un fichier PHP par méthode, bien que celle- ci puisse être un para mètre d un script unique, et que d autres lan gages pour raient fonc tion ner dif fé rem ment : ws_adduser.php, ws_getuserlist.php, ws_addurl.php, ws_delurl.php. Créer un uti li sa teur ws_adduser.php : prend en para mètre un nom dans la variable «user», retourne un JSON conte nant le résul tat de l opé ra tion. 199

208 <?php header( Content Type: application/json ); // Connexion $link = mysql_connect("serveursql", "admin", "password") or die(json_encode(array("error" => "la base n est pas accessible"))); mysql_select_db("basesql") or die(json_encode(array("error" => "la base n est pas accessible"))); $username = $_POST[ user ]; if(strlen($username) == 0) die(json_encode(array("error" => "vous devez avoir un user valide comme para mètre"))); // véri fier que l uti li sa teur n existe pas déjà $result = mysql_query("select * FROM users WHERE like \"".$username."\""); or die(json_encode(array("error" => "la base n est pas accessible"))); if(mysql_num_rows($result) > 0) die(json_encode(array("error" => "l uti lisateur existe"))); $result = mysql_query("in SERT INTO users VALUES ( = \"".$username."\")"); $retour = json_encode(array("résul tat" => mysql_affected_ rows($result)));?> echo $retour; En retour, nous aurons donc soit «error», avec une des crip tion de l erreur, soit «résul tat» avec comme valeur 0 si l on n a pas réussi à insé rer l uti li sa - teur, et 1 dans le cas contraire. 200

209 Lis ter les uti li sa teurs ws_getuserlist.php : prend comme para mètre le nom d uti li sa teur dont on veut récu pé rer la liste de liens et retourne un objet JSON ou bien une erreur. <?php header( Content Type: application/json ); // Connexion $link = mysql_connect("serveursql", "admin", "password") or die(json_encode(array("error" => "la base n est pas accessible"))); mysql_select_db("basesql") or die(json_encode(array("error" => "la base n est pas accessible"))); $username = $_POST[ user ]; if(strlen($username) == 0) die(json_encode(array("error" => "vous devez avoir un user valide comme para mètre"))); // Véri fier que l uti li sa teur n existe pas déjà $result = mysql_query("select * FROM users WHERE like[cd] \"".$username."\""); or die(json_encode(array("error" => "la base n est pas accessible"))); Dunod Toute reproduction non autorisée est un délit. if(mysql_num_rows($result) == 0) die(json_encode(array("error" => "l uti lisateur n existe pas"))); // On récupère l id $row = mysql_fetch_assoc($result); $userid = $row["id"]; $result = mysql_query("select * FROM links WHERE userid = ".$userid); $links = array(); 201

210 while ($row = mysql_fetch_object($result)) array_push($links, array("date" => $row->pubdate, "titre" => $row->titre, "url" => $row->url));?> $retour = json_encode(array("resultat" => $links)); echo $retour; En retour, on aura donc soit «error», avec une des crip tion de l erreur, soit «resultat» avec comme contenu la liste des triplets date, titre, url cor res - pon dant à la liste de liens de l uti li sa teur. Ajou ter une URL ws_addurl.php : prend comme para mètre le nom d uti li sa teur à qui appar - tient le lien, le titre et l url du lien, et retourne un objet JSON ou une erreur. <?php header( Content Type: application/json ); // Connexion $link = mysql_connect("serveursql", "admin", "password") or die(json_encode(array("error" => "la base n est pas accessible"))); mysql_select_db("basesql") or die(json_encode(array("error" => "la base n est pas accessible"))); $username = $_POST[ user ]; $titre = $_POST[ titre ]; $url = $_POST[ url ]; if(strlen($username) == 0 strlen($titre) == 0 strlen($url)) die(json_encode(array("error" => "vous devez avoir user, titre, et url, comme parametres"))); // Véri fier que l uti li sa teur n existe pas déjà 202

211 $result = mysql_query("select * FROM users WHERE like[cd] \"".$username."\""); or die(json_encode(array("error" => "la base n est pas accessible"))); if(mysql_num_rows($result) == 0) die(json_encode(array("error" => "l uti lisateur n existe pas"))); // On récupère l id $row = mysql_fetch_assoc($result); $userid = $row["id"]; $result = mysql_query("in SERT INTO links VALUES (userid = ".$userid.", titre = \"".$titre."\", url = \"".$url."\")"); $retour = json_encode(array("resultat" => mysql_affected_ rows($result)));?> echo $retour; En retour, nous aurons donc soit «error», avec une des crip tion de l erreur, soit «resultat» avec comme valeur 0 si on n a pas réussi à insé rer le lien, et 1 dans le cas contraire. Dunod Toute reproduction non autorisée est un délit. Sup pri mer une URL ws_delurl.php : prend comme para mètre l uti li sa teur, et l url à effa cer, et retourne un objet json ou une erreur. <?php header( Content Type: application/json ); // Connexion $link = mysql_connect("serveursql", "admin", "password") or die(json_encode(array("error" => "la base n est pas accessible"))); mysql_select_db("basesql") or die(json_encode(array("error" => "la base n est pas accessible"))); 203

212 $username = $_POST[ user ]; $url = $_POST[ url ]; if(strlen($username) == 0 strlen($url)) die(json_encode(array("error" => "vous devez avoir user, titre, et url, comme parametres"))); // Véri fier que l uti li sa teur n existe pas déjà $result = mysql_query("select * FROM users WHERE like[cd] \"".$username."\""); or die(json_encode(array("error" => "la base n est pas accessible"))); if(mysql_num_rows($result) == 0) die(json_encode(array("error" => "l uti lisateur n existe pas"))); // On récupère l id $row = mysql_fetch_assoc($result); $userid = $row["id"]; $result = mysql_query("delete FROM links WHERE userid = ".$userid." AND url LIKE \"".$url."\")"); $retour = json_encode(array("resultat" => mysql_affected_ rows($result)));?> echo $retour; En retour, on aura donc soit «error», avec une des crip tion de l erreur, soit «resultat» avec comme valeur 0 si on n a pas réussi à effa cer le lien, et 1 dans le cas contraire. 5 Exemple d échanges client/ser veur Voici un exemple de séquence mon trant le contenu des échanges entre le client et le ser veur : Envoi du client : 204

213 Retour du ser veur : resultat: 1 Envoi du client : chez.moi Retour du ser veur : resultat: date: "22/04/ :04", titre: "dunod", url: " date: "23/04/ :20", titre: "dunod - book", url: " Envoi du client : moi&titre=test&url=http%3a%2f%2ftest.net Retour du ser veur : Dunod Toute reproduction non autorisée est un délit. resultat: 1 Envoi du client : moi&url=http%3a%2f%2ftest.net Retour du ser veur : Ser veur : resultat: 1 205

214 Index A AccelerometerReader 40 accéléromètre 39 Activities 16 Activity 18 AdMob 101 agendas 73 alarme 83 Amazon S3 148 App Folder 179 AWS (Amazon Web Services) 145 B bookmarking 198 Buckets 146, 148 Buffered*Stream 8 Bundles 34 C CalendarContract 80 calendriers 73 callback 124 CameraUpdate 50 capteur 39 carnet d adresses 85 classecontentprovider 12 content provider 10 ContentResolver 10 coordonnées géographiques 48 D DatabaseHelper 11 données paramétrées 116 Dropbox 179 E Embedded timelines 142 External 4 Extras 26 EXTRA_STREAM 76 EXTRA_TEXT 76 F fenêtres 15 File*Stream 8 flash 62 FragmentPagerAdapter 24 Fragments 16, 23 Full Dropbox 179 G géolocalisation 47 GET 116 Google 92 Google Cloud Messaging 91 Google Drive 185 Google Maps 54 GSM/CDMA 78 gyroscope 39 H HTTP 195 I IaaS 146 ImageView 61 Intent 21 intention 20 Intents 58 J JNI (Java Native Interface) 64 JSON 118 JSONObject 118 L layouts 16 Listener 41 LocalBroadcastManager 87 Locale 31 localisation 29 localisation des images 35 LocationListener 48 LocationManager 48 luxmètre 39 M magnétomètre 39 mail 73 MapFragment 49 MarkerOptions 54 markers 56 Méthode de Pythagore 51 Méthode d Haversine 52 MobileServiceQuery 175 MODE_APPEND 7 MODE_PRIVATE 7 MODE_WORLD_READABLE 7 MODE_WORLD_WRITABLE 7 N Navigation Transversale 22 notifications 87 O OAuth 131, 140 ObjectInputStream 9 ObjectOutputStream 9 onglets 22 onsensorchanged 42 P PaaS 146 POST 117 préférences 6 protocole RTSP 128 Q QR Code 72 R REST (REpresentational State Transfer) 196 runonuithread 121 S SaaS 146 sélection de la langue 29 senddatamessage 79 SEND_SMS 78 SensorManager 41 SimpleDB 157 SMS 73 SmsManager 78 SOAP (Simple Object Access Protocol) 197 socket 120 stockage 4 Streams 110 T timelines 142 V vidéo 123, 127 VideoView 127 ViewPager 23 W Web Service 145, 195 WebService 109 Windows Azure 165 wrapper 64 WSDL (Web Service Description Language) 197 Y YouTube 128 YouTubeBaseActivity 129 Z Zbar

Cookbook Développement Android 4. 60 recettes de pros

Cookbook Développement Android 4. 60 recettes de pros Cookbook Développement Android 4 60 recettes de pros Dans la même collection : Cookbook référencement Google, 80 recettes de pros N. Ghouti-Terki, 216 pages, Dunod, 2013. Cookbook développement ios7, 60

Plus en détail

Cloud. Personnel. Tout sur le. Travaillez, stockez, jouez et échangez dans le nuage

Cloud. Personnel. Tout sur le. Travaillez, stockez, jouez et échangez dans le nuage Cloud Tout sur le Personnel Travaillez, stockez, jouez et échangez dans le nuage Couverture : Rachid Maraï Dunod, Paris, 2013 ISBN 978-2-100-59009-4 Sommaire Avant- propos...vii 1. Qu est- ce que le Cloud?...1

Plus en détail

SharePoint 2013. 40 recettes de pros

SharePoint 2013. 40 recettes de pros SharePoint 2013 40 recettes de pros Dans la même collection : Cookbook référencement Google, 80 recettes de pros N. Ghouti-Terki, 216 pages, Dunod, 2013. Cookbook développement ios7, 60 recettes de pros

Plus en détail

Cor rigé. 1) Réalisez un diagnostic interne de l entre prise. La Grande Récré Cas 6. Matrice SWOT

Cor rigé. 1) Réalisez un diagnostic interne de l entre prise. La Grande Récré Cas 6. Matrice SWOT La Grande Récré Cas 6 Cor rigé 1) Réalisez un diagnostic interne de l entre prise. Forces Matrice SWOT Fai blesses Posi tion ne ment : La Grande Récré a mis en place un réseau de conseillers dans les maga

Plus en détail

Sophie Calli es François Laurent

Sophie Calli es François Laurent Sophie Calli es François Laurent Dunod, Paris, 2013 ISBN 978-2-10-060007-6 Pré face Le mar ke ting digi tal et le CRM, une vraie oppor tunité pour les TPE/PME Pour une petite ou moyenne entre prise, il

Plus en détail

Études de cas d entreprises avec corrigés détaillés

Études de cas d entreprises avec corrigés détaillés MANAGEMENT SUP MARKETING - COMMUNICATION Études de cas d entreprises avec corrigés détaillés Claire Garcia Jean-Louis Martinez Dunod, Paris, 2013 ISBN 978-2-10-058816-9 Sommaire Avant-propos V Cas 1 MPO

Plus en détail

Responsable marketing

Responsable marketing l a b o î t e à o u t i l s du Responsable marketing Nathalie VAN LAETHEM Yvelise LEBON Béatrice Durand-MÉGRET Les QR codes et liens hypertexte permettant d accéder aux sites Internet proposés dans cet

Plus en détail

Précis. opérationnelle. de recherche. Méthodes et exercices d application

Précis. opérationnelle. de recherche. Méthodes et exercices d application Précis de recherche opérationnelle Méthodes et exercices d application Robert Faure était professeur de la chaire de recherche opérationnelle au CNAM Bernard Lemaire est professeur émérite de la chaire

Plus en détail

TOUTELAFONCTION Consulting

TOUTELAFONCTION Consulting TOUTEL AFONCTION Consulting TOUTEL AFONCTION Consulting Yves Labat Jean- Marc Schoettl III Crédit pictogrammes : Sharpnose Fotolia.com Dunod, Paris, 2013 ISBN 978-2-10-058243-3 Table des matières Préface

Plus en détail

Guide pratique des réseaux sociaux

Guide pratique des réseaux sociaux Guide pratique des réseaux sociaux Guide pratique des réseaux sociaux Twitter, Facebook des outils pour communiquer Marc Fanelli-Isla 2 e édition Dunod, Paris, 2012 ISBN 978-2-10-057858-0 Table des matières

Plus en détail

Sous la direction de Lucile Salesses. Management. Marketing de la. Mode

Sous la direction de Lucile Salesses. Management. Marketing de la. Mode Sous la direction de Lucile Salesses Management et Marketing de la Mode À Alexandre Maquette de couverture : Chloé Lerebours http://graphi-chlo.blogspot.com Dunod, Paris, 2013 ISBN 978-2-10-059120-6 P

Plus en détail

DCG 12. Anglais appliqué aux affaires

DCG 12. Anglais appliqué aux affaires DCG 12 Anglais appliqué aux affaires en 17 fiches Françoise Cazenave Professeur en BTS et DCG avec la collaboration de Paul Larreya Collection «Express Expertise comptable» DCG J.-F. Bocquillon, M. Mariage,

Plus en détail

La Révolution Big Data

La Révolution Big Data Jean-Charles Cointot Yves EYChenne La Révolution Big Data Les données au cœur de la transformation de l entreprise Le pictogramme qui figure ci-contre mérite Le pictogramme une explication. qui figure

Plus en détail

MANAGEMENT SUP. Coordonné par François Ewald Patrick Thourot

MANAGEMENT SUP. Coordonné par François Ewald Patrick Thourot MANAGEMENT SUP Coordonné par François Ewald Patrick Thourot Dunod, Paris, 2013 ISBN 978-2-10-059056-8 Les auteurs Avant-propos Préface Introduction Le sec teur assurantiel fran çais La réglementation de

Plus en détail

Projet Android (LI260) Cours 2

Projet Android (LI260) Cours 2 Projet Android (LI260) Cours 2 Nicolas Baskiotis Université Pierre et Marie Curie (UPMC) Laboratoire d Informatique de Paris 6 (LIP6) S2-2013/2014 Plan Les ressources Debug Communication entre activités

Plus en détail

arnaud de baynast Jacques lendrevie 8 e édition citor Publicité online & ofƒline TV Presse Internet Mobiles Tablettes Site compagnon publicitor.

arnaud de baynast Jacques lendrevie 8 e édition citor Publicité online & ofƒline TV Presse Internet Mobiles Tablettes Site compagnon publicitor. arnaud de baynast Jacques lendrevie publi citor Publicité online & ofƒline TV Presse Internet Mobiles Tablettes Site compagnon 8 e édition publicitor.fr Les liens hypertextes permettant d accéder aux sites

Plus en détail

Dunod, Paris, 2014 ISBN 978-2-10-070583-2

Dunod, Paris, 2014 ISBN 978-2-10-070583-2 Les liens hypertextes permettant d accéder aux sites internet proposés dans cet ouvrage n engagent pas la responsabilité de DUNOD EDITEUR, notamment quant au contenu de ces sites, à leur éventuel dysfonctionnement

Plus en détail

Outils, langage et approche Android Une introduction. Nicolas Stouls nicolas.stouls@insa lyon.fr

Outils, langage et approche Android Une introduction. Nicolas Stouls nicolas.stouls@insa lyon.fr Outils, langage et approche Android Une introduction Nicolas Stouls nicolas.stouls@insa lyon.fr Webographie La bible contenant «tout» : http://developer.android.com/index.html Les supports cette intervention

Plus en détail

Câblage des prises... 122. Projets de câblage... 128. Plans de circuits... 138. TECHNIQUES ÉLÉMENTAIRES DE RÉNOVATION Revêtements de sol...

Câblage des prises... 122. Projets de câblage... 128. Plans de circuits... 138. TECHNIQUES ÉLÉMENTAIRES DE RÉNOVATION Revêtements de sol... Tables des matières Le guide complet pour rénover sa maison Introduction.............. 7 PRINCIPES GÉNÉRAUX DE LA RÉNOVATION Apprendre à connaître sa maison.... 10 Codes du bâtiment et permis de construction...................

Plus en détail

LES MANIPULATEURS SONT PARMI NOUS

LES MANIPULATEURS SONT PARMI NOUS Thérapeute comportementaliste et cognitiviste, ISABELLE NAZARE-AGA exerce en cabinet et dirige des stages d affirmation et d estime de soi, de recherche des valeurs personnelles, de communication et de

Plus en détail

Stockage de données sous Android

Stockage de données sous Android Stockage de données sous Android Master 2 informatique 2012-2013 Michel Chilowicz (sous licence CC By-NC-SA) Données temporaires d'une activité Une activité peut être détruite

Plus en détail

Concepts clés de muséo lo gie

Concepts clés de muséo lo gie Concepts clés de muséo lo gie Concepts clés de muséo lo gie Sous la direc tion d André Desvallées et François Mairesse Avec le sou tien du Musée Royal de Mariemont www.musee-mariemont.be Et le soutien

Plus en détail

Tutoriel Infuse Learning. Créer des quizzes multimédias sur ordinateur ou tablette

Tutoriel Infuse Learning. Créer des quizzes multimédias sur ordinateur ou tablette Tutoriel Infuse Learning Créer des quizzes multimédias sur ordinateur ou tablette 1- Présentation Infuselearning.com est un service web (en ligne) gratuit qui permet aux enseignants de créer des exercices

Plus en détail

CES GENS QUI ONT PEUR

CES GENS QUI ONT PEUR Elaine N. Aron CES GENS QUI ONT PEUR D AVOIR PEUR Mieux comprendre l hypersensibilité Table des matières Introduction...7 Êtes-vous hyper sen si ble? Ques tion naire...17 1. Qu est-ce qu un hyper sen

Plus en détail

office national de sécurité sociale

office national de sécurité sociale office national de sécurité sociale Emploi salarié (O.N.S.S.) du quatrième trimestre 2009 office national de sécurité sociale Institution publique de sécurité sociale Emploi salarié (O.N.S.S.) du quatrième

Plus en détail

Vers une cui si ne améliorée. Une étu de sur les cui si nes et les fo yers dans le ca dre du pro jet UNSO fo yers amé lio rés au Bur ki na Faso

Vers une cui si ne améliorée. Une étu de sur les cui si nes et les fo yers dans le ca dre du pro jet UNSO fo yers amé lio rés au Bur ki na Faso Vers une cui si ne améliorée Une étu de sur les cui si nes et les fo yers dans le ca dre du pro jet UNSO fo yers amé lio rés au Bur ki na Faso Vers une cui sine améliorée Memorandum 1 Pu bli ca tion of

Plus en détail

Café Lowendal et autres nou velles. et autres nou velles

Café Lowendal et autres nou velles. et autres nou velles TATIANA DE ROSNAY Café Lowendal et autres nou velles et autres nou velles LE LIVRE DE POCHE 1 «On ne peut rien écrire dans l indif fé rence.» Simone de Beauvoir ( 1908-1986) Les Mandarins Cela fait cinq

Plus en détail

Les fondamentaux du développement d applications Java

Les fondamentaux du développement d applications Java Android 5 Les fondamentaux du développement d applications Java Nazim BENBOURAHLA Table des matières 1 Les éléments à télécharger sont disponibles à l'adresse suivante : http://www.editions-eni.fr Saisissez

Plus en détail

L Amour est tout près

L Amour est tout près Karine Le Marchand Alix Girod de l Ain L Amour est tout près Célibataires, les clés pour être heureux à deux Philippe Rey 1 L infir mière CE QUE LES GENS QUI LA CONNAISSENT DISENT D ELLE Y a pas comme

Plus en détail

TP SIN Programmation sur androïde Support : eclipse

TP SIN Programmation sur androïde Support : eclipse TP SIN Programmation sur androïde Support : eclipse Support : Smartphone sur androïde Pré requis (l élève doit savoir): Savoir utiliser un ordinateur Savoir utiliser un Smartphone Programme Objectif terminale

Plus en détail

au quotidien 100 fiches Finance contrôle

au quotidien 100 fiches Finance contrôle & au quotidien 100 fiches Finance contrôle Sous la direction de Laurent Cappelletti et Christian Hoarau & Finance contrôle au quotidien 100 fiches Préface de Gilbert Font Avant-propos de René Ricol Larry

Plus en détail

La boîte à outils du Mercator

La boîte à outils du Mercator La boîte à outils du Mercator Nous avons, pour cette édition du Mercator, sélectionné 25 outils marketing. Ce sont autant de concepts ou de méthodes pour aider les praticiens du marketing à analyser un

Plus en détail

Warren PAULUS. Android SDK et Android x86

Warren PAULUS. Android SDK et Android x86 Android SDK et Android x86 2010/2011 Voici un petit tutoriel pour installer Android de façon à ce qu il soit compatible avec NetBeans et Eclipse, ainsi que l utilisation d Android x86. Ce tutoriel a été

Plus en détail

1.3 Gestion d'une application

1.3 Gestion d'une application 1.3 Gestion d'une application 1. Un premier projet... Il est temps maintenant d'écrire la véritable première application Android avec l'inévitable affichage du mot bonjour, ce qui évidemment pour un développement

Plus en détail

Bulletin d information et de liaison sur la police de type communautaire. N 31 avril2010. Volet 1 : Santé mentale

Bulletin d information et de liaison sur la police de type communautaire. N 31 avril2010. Volet 1 : Santé mentale Bulletin d information et de liaison sur la police de type communautaire N 31 avril2010 Volet 1 : Santé mentale T O u R d h O R I z O N INTER SEC TION Bulletin d infor ma tion et de liai sonsur la poli

Plus en détail

suraient sur la douce tran quillité de sa vie. Il aimait ce bonheur simple : sa femme occupée à la cuisine et les rires complices de ses enfants qu

suraient sur la douce tran quillité de sa vie. Il aimait ce bonheur simple : sa femme occupée à la cuisine et les rires complices de ses enfants qu 22 février, 0 h 02 Antonio Rodriguez a regardé le jour nal de la 3 puis il a éteint la télé vi sion et est res té de longues minutes immobile dans l obscurité du salon, en attendant d être cer tain que

Plus en détail

www.elektor.fr/android SOMMAIRE

www.elektor.fr/android SOMMAIRE www.elektor.fr/android Android Apprendre à programmer des applis Environnement de développement Eclipse Programmation orientée objet en JAVA Auteur : Stephan Schwark Éditeur : Elektor ISBN : 978-2-86661-187-3

Plus en détail

Si la vie vous intéresse

Si la vie vous intéresse Si la ie ous intéresse paroles: J Pauze musique: J Pauze / M A Lépine ã 160 c c öguiõt aõcous fr ÛÛ ÛÛÛÛÛ ÛÛÛ ÛÛ ÛÛÛÛÛ ÛÛÛ öõbõasse G 3fr fr fr Û Û ÛÛÛ Û Û Û ( ) 3 ~~ ÿ % % J'ais dans ouer un la monde

Plus en détail

Programmation des applications mobiles avec Android. 1 Inspiré du cours de Olivier Le Goaer

Programmation des applications mobiles avec Android. 1 Inspiré du cours de Olivier Le Goaer Programmation des applications mobiles avec Android 1 Inspiré du cours de Olivier Le Goaer 2 OS mobile : outils de développement D après le cours de Olivier Le Goaer 3 Plateforme de développement MobileApp

Plus en détail

Bases de données et fournisseurs de contenu

Bases de données et fournisseurs de contenu 8 Bases de données et fournisseurs de contenu Au sommaire de ce chapitre : Créer des bases de données et utiliser SQLite Utiliser les fournisseurs de contenu, les curseurs et les content values pour stocker,

Plus en détail

Marketing Efficiency Cloud : All-in-One, End-to-End

Marketing Efficiency Cloud : All-in-One, End-to-End Marketing Resource Management avec Marketing Efficiency Cloud de BrandMaker Davantage de transparence Le marketing repose sur des process. BrandMaker Marketing Efficiency Cloud contrôle ces process et

Plus en détail

Guide pratique : Je maitrise mon image sur les médias sociaux!

Guide pratique : Je maitrise mon image sur les médias sociaux! Guide pratique : Je maitrise mon image sur les médias sociaux! Ce guide, dédié aux étudiants de l université de Bourgogne a pour objec f de donner des conseils et des bonnes pra ques pour u liser au mieux

Plus en détail

Android 4 Les fondamentaux du développement d'applications Java

Android 4 Les fondamentaux du développement d'applications Java La plateforme Android 1. Présentation 13 2. Historique 14 3. Google Play 15 3.1 Création d'un compte développeur 16 3.2 Publication d'une application 16 3.3 Suivi et mise à jour d'une application 18 Environnement

Plus en détail

PAUL AUSTER. Seul dans le noir ROMAN TRA DUIT DE L ANGLAIS (ÉTATS- UNIS) PAR CHRISTINE LE BŒUF BABEL

PAUL AUSTER. Seul dans le noir ROMAN TRA DUIT DE L ANGLAIS (ÉTATS- UNIS) PAR CHRISTINE LE BŒUF BABEL PAUL AUSTER Seul dans le noir ROMAN TRA DUIT DE L ANGLAIS (ÉTATS- UNIS) PAR CHRISTINE LE BŒUF BABEL Seul dans le noir, je tourne et retourne le monde dans ma tête tout en m effor çant de venir à bout d

Plus en détail

BIRT (Business Intelligence and Reporting Tools)

BIRT (Business Intelligence and Reporting Tools) BIRT (Business Intelligence and Reporting Tools) Introduction Cette publication a pour objectif de présenter l outil de reporting BIRT, dans le cadre de l unité de valeur «Data Warehouse et Outils Décisionnels»

Plus en détail

Ceci est un Chromebook, ton ordinateur!

Ceci est un Chromebook, ton ordinateur! Ceci est un Chromebook, ton ordinateur! CHROMEBOOK - Dans le royaume des ordinateurs personnels, il n'y a pas beaucoup de choix. Pour schématiser, soit vous avez un PC, soit vous avez un Mac. Et ce depuis

Plus en détail

TP2 : Client d une BDD SqlServer

TP2 : Client d une BDD SqlServer TP2 : Client d une BDD SqlServer Objectifs : utiliser la barre de menu, utiliser les préférences d application (settings) ou (options), gérer la persistance des données, utiliser la bibliothèque jtds:jdbc

Plus en détail

Windows Azure. Principales fonctions

Windows Azure. Principales fonctions Calipia usage re serve aux e tablissements de pendant du Ministe re de l Enseignement Supe rieur et de la Recherche Windows Azure Principales fonctions Alors qu environ 70% du budget informatique est dédié

Plus en détail

TD/TP 1 Introduction au SDK d Android

TD/TP 1 Introduction au SDK d Android TD/TP 1 Introduction au SDK d Android Romain Raveaux 1 Introduction Android est un système d'exploitation pour téléphone portable de nouvelle génération développé par Google. Celui-ci met à disposition

Plus en détail

Google Drive, le cloud de Google

Google Drive, le cloud de Google Google met à disposition des utilisateurs ayant un compte Google un espace de 15 Go. Il est possible d'en obtenir plus en payant. // Google Drive sur le web Se connecter au site Google Drive A partir de

Plus en détail

TP au menu «UI ANDROID»

TP au menu «UI ANDROID» TP au menu «UI ANDROID» Pré-requis & Installation ( du couvert) soit installer en natif sur vos postes (!!! ATTENTION!!! FromScratch 1,1 Go à télécharger ) JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html

Plus en détail

Plate-forme de tests des fichiers XML virements SEPA et prélèvements SEPA. Guide d'utilisation

Plate-forme de tests des fichiers XML virements SEPA et prélèvements SEPA. Guide d'utilisation Plate-forme de tests des fichiers XML virements SEPA et prélèvements SEPA Guide d'utilisation 8 novembre 2013 2/14 Table des matières 1 Introduction... 3 2 Accès au service... 3 3 Aperçu du service...

Plus en détail

BizTalk Server 2013. Principales fonctions

BizTalk Server 2013. Principales fonctions Calipia usage re serve aux e tablissements de pendant du Ministe re de l Enseignement Supe rieur et de la Recherche BizTalk Server 2013 Principales fonctions BizTalk Server, disponible en version 2013

Plus en détail

Aud c. Audi connect. Audi-connect-brochure-clients_FR-NL.indd 1

Aud c. Audi connect. Audi-connect-brochure-clients_FR-NL.indd 1 i Aud. t c e n c n Audi connect Audi-connect-brochure-clients_FR-NL.indd 1 9/06/15 15:39 Contenu 2 01 08 09 10 12 22 24 Introduction Mise en route des services Audi connect Enregistrement du véhicule Connexion

Plus en détail

Boot Camp Guide d installation et de configuration

Boot Camp Guide d installation et de configuration Boot Camp Guide d installation et de configuration Table des matières 3 Introduction 4 Configuration requise 5 Vue d ensemble de l installation 5 Étape 1 : Rechercher les mises à jour 5 Étape 2 : Préparer

Plus en détail

N 1 2 1 L a R e v u e F r a n c o p h o n e d u M a n a g e m e n t d e P r o j e t 2 è m e t r i m e s t r e 2 0 1 3

N 1 2 1 L a R e v u e F r a n c o p h o n e d u M a n a g e m e n t d e P r o j e t 2 è m e t r i m e s t r e 2 0 1 3 Du côté de la Recherche > Managemen t de projet : p1 L intégration des systèmes de management Qualité -Sécurité- Environnement : résultats d une étude empirique au Maroc Le co ntex te d es p roj et s a

Plus en détail

www.diazoservice.fr Procédure pour passer une commande de travaux d impression depuis le site Ce document est la propriété de Diazo Service Poitiers.

www.diazoservice.fr Procédure pour passer une commande de travaux d impression depuis le site Ce document est la propriété de Diazo Service Poitiers. Atelier d'impression Numérique Tel : 0 549 889 503 75 rue de la Vincenderie 86000 Poi ers Courriel : [email protected] Du lundi au vendredi de 09H00 à 12H30 et 13H30 à 18H00 Procédure pour passer une

Plus en détail

Gérer, stocker et partager vos photos grâce à Picasa. Janvier 2015

Gérer, stocker et partager vos photos grâce à Picasa. Janvier 2015 Gérer, stocker et partager vos photos grâce à Picasa Janvier 2015 Sommaire 1 - Découverte de Picasa 2 - Gestion des dossiers et des photos 3 - Trier, filtrer et rechercher 4 - Retoucher une image 5 - Création

Plus en détail

L'important C'est la rose

L'important C'est la rose L'important 'est la rose Gilbert ecaud rr: M. de Leon opista: Felix Vela 200 Xiulit c / m F m m 7 9. /. m...... J 1 F m.... m7 ro - se. rois - ro - se. rois - ro - se. rois - ro - se. rois - oi qui oi

Plus en détail

Formation Informatique. Utiliser les périphériques informatiques

Formation Informatique. Utiliser les périphériques informatiques Formation Informatique Utiliser les périphériques informatiques PLAN : Chapitre 1 : Utiliser son imprimante p 3 Chapitre 2 : Utiliser son scanner p 12 Chapitre 3 : Utiliser un appareil photo p 20 Chapitre

Plus en détail

Saisissez le login et le mot de passe (attention aux minuscules et majuscules) qui vous ont

Saisissez le login et le mot de passe (attention aux minuscules et majuscules) qui vous ont I Open Boutique Sommaire : I Open Boutique... 1 Onglet «Saisie des Produits»... 3 Création d'une nouvelle fiche boutique :... 3 Création d'une nouvelle fiche lieux de retraits :... 10 Création d'une nouvelle

Plus en détail

Guide de démarrage rapide. (pour la version 5.0.)

Guide de démarrage rapide. (pour la version 5.0.) Guide de démarrage rapide (pour la version 5.0.) 2 Table des matières Introduction Réglages de l application MyTalk Mobile 1. MODIFICATION 2. DEMARRER 3. AFFICHER 4. SYNTHETISEUR VOCAL 5. NOMBRE DE MOTS

Plus en détail

Développement Logiciel

Développement Logiciel Développement Logiciel Éxamen session 1-2012-2013 (Vendedi 25 mai, 9h-11h) Seuls les documents liés directement au cours sont autorisés (comme dit sur le site) : sujets de TD, notes de cours, notes personnelles

Plus en détail

Infolettre #6: SkyDrive

Infolettre #6: SkyDrive Infolettre #6: SkyDrive Table des matières AVANTAGES DE SKYDRIVE 2 DÉSAVANTAGES DE SKYDRIVE 2 INSCRIPTION AU SERVICE 2 MODIFIER VOTRE PROFIL 4 AJOUTER UN DOSSIER 5 AJOUTER DES FICHIERS DANS LE DOSSIER

Plus en détail

Tutoriel code::blocks

Tutoriel code::blocks Tutoriel code::blocks E. Lunéville 2006 Le logiciel code::blocks fait partie des logiciels de type EDI (Environnement de Développement Intégré, IDE en anglais) pour le langage C++. Il est multiplateforme

Plus en détail

INSTALLATION ET PRISE EN MAIN

INSTALLATION ET PRISE EN MAIN Business Phone CTI Client Pro INSTALLATION ET PRISE EN MAIN Vous trouverez dans ce document, la démarche d installation de Business Phone CTI Client Pro et les différentes possibilités qu offre ce logiciel.

Plus en détail

TUTORIEL CartoDB www.cellie.fr 11/03/15

TUTORIEL CartoDB www.cellie.fr 11/03/15 TUTORIEL CartoDB www.cellie.fr 11/03/15 1 INTRODUCTION Issue de la technologie du cloud, CartoBD est une application créée par la société Vizzuality. Elle permet de réaliser des cartographies à partir

Plus en détail

Guide utilisateur des services WASATIS (Manuel Version 1.1)

Guide utilisateur des services WASATIS (Manuel Version 1.1) Guide utilisateur des services WASATIS (Manuel Version 1.1) Bienvenue dans le monde de la vidéotranquillité de Wasatis, nous vous remercions de votre confiance. Préambule Wasatis est aujourd hui la société

Plus en détail

Compression Compression par dictionnaires

Compression Compression par dictionnaires Compression Compression par dictionnaires E. Jeandel Emmanuel.Jeandel at lif.univ-mrs.fr E. Jeandel, Lif CompressionCompression par dictionnaires 1/25 Compression par dictionnaire Principe : Avoir une

Plus en détail

Programme informatique et multimédia De janvier à avril 2015

Programme informatique et multimédia De janvier à avril 2015 L O.I.P.A est une associa on de loi 1901, qui propose des ac vités de loisirs aux retraités Isséens ainsi qu un service de bénévolat à domicile. L un de ses objec fs est de sensibiliser et d ini er le

Plus en détail

Alfstore workflow framework Spécification technique

Alfstore workflow framework Spécification technique Alfstore workflow framework Spécification technique Version 0.91 (2012-08-03) www.alfstore.com Email: [email protected] Alfstore workflow framework 2012-10-28 1/28 Historique des versions Version Date

Plus en détail

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

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

Plus en détail

DE L APPRENTI MOTOCYCLISTE

DE L APPRENTI MOTOCYCLISTE DE L APPRENTI MOTOCYCLISTE TABLE DES MATIÈRES 1. DEVENIR ACCOMPAGNATEUR 4 Expérience requise...4 Quel est votre rôle?...6 Pour rafraîchir vos connaissances...7 3. EXERCICES D APPRENTISSAGE 12 Avant de

Plus en détail

Avec sauvegardez sans y penser, partagez et bougez, vos données vous suivent! Retrouvez tous vos services du cloud pro en cliquant ici.

Avec sauvegardez sans y penser, partagez et bougez, vos données vous suivent! Retrouvez tous vos services du cloud pro en cliquant ici. Avec sauvegardez sans y penser, partagez et bougez, vos données vous suivent! Retrouvez tous vos services du cloud pro en cliquant ici. SUGARSYNC VOUS ACCOMPAGNE À TOUT MOMENT DANS LA GESTION DE VOS DONNÉES

Plus en détail

Créca. Ajout aux livrets d informatique. Hiver 2014

Créca. Ajout aux livrets d informatique. Hiver 2014 Créca Ajout aux livrets d informatique Hiver 2014 Table des matières 1. La mobilité 2. L Internet 3. Les appareils 4. Les logiciels et les applications 5. Le stockage des informations 1. Mobilité Le maître

Plus en détail

SI 410 F. Notice d'installation. 8AA12710 - B0-01/04/2003 - F - vers. F SBT 5585490001. 8AA12710 - B0-01/04/2003 - F - vers. F

SI 410 F. Notice d'installation. 8AA12710 - B0-01/04/2003 - F - vers. F SBT 5585490001. 8AA12710 - B0-01/04/2003 - F - vers. F s SI 410 F Notice d'installation SBT 5585490001 1 d'usine Code utilisateur 1 4 7 2 5 8 Code installateur 2 5 8 3 6 9 2 Sommaire Description du produit...4 Configuration du système...4-6 Matériels...7 Installation...7-8

Plus en détail

Mode d emploi de la clef USB de l I.P.I. Philosophie de la clef USB

Mode d emploi de la clef USB de l I.P.I. Philosophie de la clef USB Mode d emploi de la clef USB de l I.P.I. Ce mode d emploi est destiné aux étudiant(e)s qui suivent l enseignement de la Phytothérapie Clinique prodigué par l I.P.I. (Institut de Phytothérapie International)

Plus en détail

The Grid 2: Manuel d utilisation

The Grid 2: Manuel d utilisation The Grid 2: Manuel d utilisation Bienvenue dans The Grid 2 Merci d avoir choisi The Grid 2! Ce guide va vous apprendre tout ce que vous devez savoir à propos de The Grid 2. Il vous guidera pas à pas pour

Plus en détail

INSTALLATION DE LA CLÉ 3G+ UTILISATION VOTRE COMPTE CLIENT. Clé 3G+ Elle vous permet de connecter votre ordinateur aux réseaux haut débit mobile.

INSTALLATION DE LA CLÉ 3G+ UTILISATION VOTRE COMPTE CLIENT. Clé 3G+ Elle vous permet de connecter votre ordinateur aux réseaux haut débit mobile. contenu du pack sommaire Clé G+ Elle vous permet de connecter votre ordinateur aux réseaux haut débit mobile. Guide de votre clé G+ INSTALLATION DE LA CLÉ G+ spécifications système p. 4 branchement de

Plus en détail

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Serveur d'archivage 2007 Installation et utilisation de la BD exist Type du document Procédure d'installation Auteur(s) Eric Bouladier Date de création 26/02/20007 Domaine de diffusion tous Validé par Equipe Versions Date Auteur(s) Modifications V1.00 26/02/2007 Eric Bouladier

Plus en détail

www.cogitar.com Formations Microsoft Office

www.cogitar.com Formations Microsoft Office www.cogitar.com Formations Microsoft Office Et si vous déléguiez la maîtrise d ouvrage de votre projet informatique? L idée consiste à confier à un prestataire e x t e r n e non pas toute la réalisation

Plus en détail

Créer une base de données vidéo sans programmation (avec Drupal)

Créer une base de données vidéo sans programmation (avec Drupal) Créer une base de données vidéo sans programmation (avec Drupal) 10.10.2013 Nicolas Bugnon ([email protected]) Centre de documentation Alliance Sud www.alliancesud.ch Résultat de l atelier

Plus en détail

Tutoriel Android - TP de prise en main

Tutoriel Android - TP de prise en main Tutoriel Android - TP de prise en main To cite this version:. Tutoriel Android - TP de prise en main. École d ingénieur. France. 2014, pp.51. HAL Id: cel-01082588 https://hal.archives-ouvertes.fr/cel-01082588v2

Plus en détail

Guide utilisation Manuel 1 Dernière mise à jour: 2015/04/20 Trendoo

Guide utilisation Manuel 1 Dernière mise à jour: 2015/04/20 Trendoo Guide utilisation Manuel 1 Dernière mise à jour: 2015/04/20 Trendoo Table des matières DÉCOUVREZ TRENDOO... 2 SECTION SMS... 4 ENVOI SMS... 5 Sélectionner les destinataires... 7 Envoi de SMS paramétriques

Plus en détail

OCLOUD BACKUP GUIDE DE REFERENCE POUR ANDROID

OCLOUD BACKUP GUIDE DE REFERENCE POUR ANDROID OCLOUD BACKUP GUIDE DE REFERENCE POUR ANDROID http://ocloud.pripla.com/ Copyright 2014 Private Planet Ltd. Certaines applications ne sont pas disponibles dans tous les pays. La disponibilité des applications

Plus en détail

Sauvegarde et protection des documents

Sauvegarde et protection des documents Sauvegarde et protection des documents 16 avril 2013 p 1 Sauvegarde et protection des documents Sauvegarder un document consiste à en conserver une copie, pour le mettre à l abri ou pour y revenir ultérieurement.

Plus en détail

Suivant les windows, le signal pour indiquer l imprimante par défaut est un petit rond noir ou vers avec un V à l intérieur.

Suivant les windows, le signal pour indiquer l imprimante par défaut est un petit rond noir ou vers avec un V à l intérieur. La gestion des Imprimantes sous Facile_Caisse : Vous pouvez utiliser plusieurs sortes d imprimante avec le logiciel Facile_Caisse. Si vous possédez une imprimante classique au format A4, vous n aurez aucun

Plus en détail

Programmer en JAVA. par Tama ([email protected]( [email protected])

Programmer en JAVA. par Tama (tama@via.ecp.fr( tama@via.ecp.fr) 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

Plus en détail

Directives sur les relations avec les gouvernements de fait

Directives sur les relations avec les gouvernements de fait Directives sur les relations avec les gouvernements de fait Lors de sa 100ième session (septembre 2010), le Conseil d'administration, conformément à l'article 52 des Principes et critères en matière de

Plus en détail

AWS avancé. Surveiller votre utilisation d EC2

AWS avancé. Surveiller votre utilisation d EC2 10 AWS avancé Dans ce chapitre, nous bâtirons sur les bases que nous avons apprises jusqu ici. Nous étudierons des sujets plus avancés tels que la surveillance de votre utilisation d AWS, l utilisation

Plus en détail

Plateforme PAYZEN. Définition de Web-services

Plateforme PAYZEN. Définition de Web-services Plateforme PAYZEN Définition de Web-services Ordre de paiement Version 1.1 Rédaction, Vérification, Approbation Rédaction Vérification Approbation Nom Date/Visa Nom Date/Visa Nom Date/Visa Lyra-Network

Plus en détail

Table des matières Introduction... 1 1. Démarrage... 8 2. Les composants graphiques... 26

Table des matières Introduction... 1 1. Démarrage... 8 2. Les composants graphiques... 26 Table des matières À propos de l'auteur... x Préface... xi Avant-propos... xiv 1. Public visé et prérequis... xiv 2. Sources des exemples... xv 3. Accès aux vidéos... xv 4. URL raccourcies... xv 5. Remerciements...

Plus en détail

cbox VOS FICHIERS DEVIENNENT MOBILES! POUR ORDINATEURS DE BUREAU ET PORTABLES WINDOWS ÉDITION PROFESSIONNELLE MANUEL D UTILISATION

cbox VOS FICHIERS DEVIENNENT MOBILES! POUR ORDINATEURS DE BUREAU ET PORTABLES WINDOWS ÉDITION PROFESSIONNELLE MANUEL D UTILISATION cbox VOS FICHIERS DEVIENNENT MOBILES! POUR ORDINATEURS DE BUREAU ET PORTABLES WINDOWS ÉDITION PROFESSIONNELLE MANUEL D UTILISATION Introduction L application cbox peut-être installée facilement sur votre

Plus en détail

Le logiciel de création de site internet IZISPOT est un outil très puissant et qui est assez simple après quelques temps d utilisation.

Le logiciel de création de site internet IZISPOT est un outil très puissant et qui est assez simple après quelques temps d utilisation. 1 Le logiciel de création de site internet IZISPOT est un outil très puissant et qui est assez simple après quelques temps d utilisation. Voici un mode opératoire qui vous guidera dans l utilisation de

Plus en détail

Programmation mobile avec Android

Programmation mobile avec Android Programmation mobile avec Android Pierre Nerzic - [email protected] février-mars 2015 Abstract Il s agit des transparents du cours mis sous une forme plus facilement imprimable et lisible.

Plus en détail

Manipulation 4 : Application de «Change».

Manipulation 4 : Application de «Change». Manipulation 4 : Application de «Change». Première partie : Cette manipulation a pour but d utiliser un service Web afin d obtenir les taux de change appliqués entre les différentes monnaies référencées

Plus en détail

Securitoo Mobile guide d installation

Securitoo Mobile guide d installation Securitoo Mobile guide d installation v12.11 Toutes les marques commerciales citées dans ce document sont la propriété exclusive de leurs détenteurs respectifs. Copyright 2012 NordNet S.A. objectif Le

Plus en détail

1. Base de données SQLite

1. Base de données SQLite Dans ce TP, nous allons voir comment créer et utiliser une base de données SQL locale pour stocker les informations. La semaine prochaine, ça sera avec un WebService. On repart de l application AvosAvis

Plus en détail

Synchroniser ses photos

Synchroniser ses photos Synchroniser Avec l'arrivée des smartphones et tablettes équipés de fonctions «appareils photos», nous réalisons de plus en plus de photos avec ceux-ci. Soucis, la mémoire de ces outils n'est pas aussi

Plus en détail