Cas EDF : Développement Android - Concepts avancés Partie 3



Documents pareils
Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

Programmer en JAVA. par Tama

TP SIN Programmation sur androïde Support : eclipse

Tutorial pour une application simple

Projet Viticulture - TP 3 : bases de données distantes BTS Services informatiques aux organisations

Tutoriel Android - TP de prise en main

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Les fondamentaux du développement d applications Java

1.3 Gestion d'une application

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmation par les Objets en Java

Education Delivery Intelligent Tool

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

TP2 : Client d une BDD SqlServer

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Créer un modèle Impress

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Généralités sur le Langage Java et éléments syntaxiques.

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

Installation et prise en main

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

TP1 : Initiation à Java et Eclipse

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Premiers Pas en Programmation Objet : les Classes et les Objets

2 Grad Info Soir Langage C++ Juin Projet BANQUE

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Cédric Gendre Inra, ESR Toulouse

Formation : WEbMaster

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

REALISER UN SITE INTERNET AVEC IZISPOT SOMMAIRE

Programmation en Java IUT GEII (MC-II1) 1

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Création de maquette web

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Edutab. gestion centralisée de tablettes Android

.NET - Classe de Log

Connexion à une base de données. Connexion à une base de données. Connexion à une base de données Développement d'une application

Plan du cours. Historique du langage Nouveautés de Java 7

as Architecture des Systèmes d Information

Ladibug TM 2.0 Logiciel de présentation visuel d'image Manuel de l utilisateur - Français

Héritage presque multiple en Java (1/2)

Initiation à JAVA et à la programmation objet.

LANGAGUE JAVA. Public Développeurs souhaitant étendre leur panel de langages de programmation

Création d un service web avec NetBeans 5.5 et SJAS 9

SPECIFICATIONS TECHNIQUES : Gestion des Médicaments et des commandes de médicaments

PHPWEBSITE -Tutoriel image

INITIATION AU LANGAGE JAVA

Initiation à linfographie

Tutoriel Android. Pour démarrer la programmation d'applications Android

Utiliser le logiciel Photofiltre Sommaire

PROJET TRIBOX-2012-A

RESPONSIVE WEB DESIGN

Swyx Skin Editor - Guide de l'utilisateur. SwyxIt Skin Editor L éditeur de création des habillages individuels

Dossier. Développer en Java sur téléphone mobile. Benjamin Damécourt UFR SITEC Master 2 EESC 11 janvier 2012

Manuel d utilisation NETexcom

Projet Android (LI260) Cours 2

Corrigé des exercices sur les références

MANUEL D UTILISATION ORBITVU EDITOR V.3

Table des matières. 1 À propos de ce manuel Icônes utilisées dans ce manuel Public visé Commentaires...

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Cours 1: Java et les objets

TP au menu «UI ANDROID»

Un ordonnanceur stupide

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Chapitre 2. Classes et objets

Magento. Magento. Réussir son site e-commerce. Réussir son site e-commerce BLANCHARD. Préface de Sébastien L e p e r s

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Java 7 Les fondamentaux du langage Java

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

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

Application web de gestion de comptes en banques

Formation VBA 3 Interagir

Soon_AdvancedCache. Module Magento SOON. Rédacteur. Relecture & validation technique. Historique des révisions

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

MODULES 3D TAG CLOUD. Par GENIUS AOM

Bases Java - Eclipse / Netbeans

MANUEL TBI - INTERWRITE

I. Introduction aux fonctions : les fonctions standards

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

1. Installation d'un serveur d'application JBoss:

La programmation orientée objet et le langage C++

Cette console est compatible avec le logiciel isuper. Nous vous conseillons de consacrer quelques minutes à la lecture de ce guide d'utilisation.

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Développement d'applications Web HTML5 L'art et la manière avec Visual Studio 2015 et TFS

Classer et partager ses photographies numériques

MEMENTO D'UTILISATION Du T.N.I. SmartBoard (Version )

De Java à Android version 0.1

Dans l idéal, ceci devrait être fait en amont pour chaque image envoyée sur l espace de stockage de votre site internet.

Documentation utilisateur. [EIP] TransLSF

Tutoriel Inscription et utilisation basique d'un blog hébergé chez Blogger.com

Configuration de SQL server 2005 pour la réplication

Usage des photos pour Internet et pour la presse

MEDIAplus elearning. version 6.6

LOGICIEL KIPICAM : Manuel d installation et d utilisation

Seafile, pour simplifier l'accès à ses fichiers, les partager et les synchroniser

Transcription:

Cas EDF : Développement Android - Concepts avancés Partie 3 Cette publication comporte cinq parties dont l ordre est dicté par la logique du développement. Les parties 2 et 3 sont facultatives. Partie 1 : Gestion des clients Partie 2 : Géolocalisation de l'agent et géocodage du client sélectionné Ø Partie 3 : Signature Client Partie 4 : Communication avec le serveur Partie 5 : Identification, import et export des données. Description du thème Propriétés Description Intitulé long Formation concernée Matière SLAM 4 Présentation Notions Transversalité Pré-requis Outils Mots-clés Durée Auteur Cas EDF : Développement Androïd - Concepts avancés - Partie 3 : Signature Client BTS Services Informatiques aux Organisations Développement permettant d'aborder des concepts de la programmation Android d'une application embarquée, communiquant avec un serveur. Il aborde les notions : Ø d'affichage de liste / d'adapter, Ø de GEOLOCALISATION / GEOCODER, Ø de graphisme (canvas) et d'encodage JPG, Ø d'échange avec un serveur WEB (THREAD / JSON / GSON), Ø d'utilisation d'un SGBDO DB4o. Savoirs D4.1 - Conception et réalisation d une solution applicative D4.2 - Maintenance d une solution applicative Savoir-faire Programmer un composant logiciel Exploiter une bibliothèque de composants Adapter un composant logiciel Valider et documenter un composant logiciel Programmer au sein d un framework SLAM5 Version v 1.0 Date de publication Juin 2014 Développement d'une application Android sous un environnement Eclipse. (Exemple : Cas AMAP Jean-Philippe PUJOL) Eclipse, DB4o, OME, Gson, Google play services, Apache, Mysql Application mobile, Android, SGBDO, DB4o, Géolocalisation, Géocodage, Thread, json, Gson, MVC, canvas, encodage JPG 24 heures (8,4,4,4,4) (Temps divisé par 2 si utilisation du squelette application) Pierre François ROMEUF avec la relecture et les judicieux conseils de l'équipe CERTA http://www.reseaucerta.org CERTA - juin 2014 v1.0 Page 1/9

Contexte Application embarquée sur une solution technique d accès (STA) sous Android, permettant à un agent EDF d'effectuer sa tournée journalière de relevés des compteurs EDF. Les principales fonctionnalités sont : Ø Identification de l'agent sur le device avec contrôle sur un serveur web, Ø Import des clients depuis un serveur web, Ø Affichage des clients, Ø Saisie des informations clients, Ø Aide au déplacement via géolocalisation de la position de l'agent EDF et géocodage de l'adresse client, Ø Enregistrement de la signature client validant les informations saisies, Ø Export des données sur le serveur web. Le SGBD embarqué est un SGBDO DB4o. Le serveur distant est un serveur de type LAMP installé sur la ferme de serveurs ou via un hébergement gratuit (ex : http://www.hostinger.fr/) Cette application peut être dérivée pour de multiples besoins : ceux des livreurs, des commerciaux, des visiteurs, des contrôleurs... Le code fourni en annexe nécessite de votre part une compréhension. Il représente normalement votre travail de programmeur, de fouille sur internet, avec tests, compréhension et modifications du code. Il vous est fourni afin que ce développement ne représente qu'un travail raisonnable et pour vous présenter les différentes facettes du développement sur Android. Conseils : consultez notamment developer.android.com, le tutoriel du zéro (http://uploads.siteduzero.com/pdf/554364-creez-des-applications-pour-android.pdf), etc. http://www.reseaucerta.org CERTA - juin 2014 v1.0 Page 2/9

Signature du client Activity CaptureSignature & AfficheSignature Exemple d écran CaptureSignature : Exemple d écran AfficheSignature : http://www.reseaucerta.org CERTA - juin 2014 v1.0 Page 3/9

Ø Créez deux nouvelles Activity CaptureSignature et AfficheSignature. Ø Associez l'activity CaptureSignature au clic du bouton 'Signature' de l'activity ModificationClient Appel de la méthode de vérification des données saisies dans l'activity ModificationClient Si le résultat de la vérification est valide, sauvegarde des données du client Si le résultat de la vérification est valide, appel de l'activity CaptureSignature en lui passant l'identifiant du client. Ø Associez l'activity AfficheSignature au clic du bouton 'Vue Signature' de l'activity ModificationClient Vérifiez que le client possède une signature enregistrée à partir de la longueur de signature_base64 qui doit être supérieure à 0. Si le résultat de la vérification est valide, appel de l'activity AfficheSignature en lui passant l'identifiant du client. Vue d'ensemble de l'api Canvas L'API Canvas permet de créer des effets graphiques complexes. Vous dessinez sur une surface bitmap (image matricielle définie par un tableau de point). Le bitmap contient les données réelles de pixels de l'image, alors que la classe Canvas fournit une interface de haut niveau pour dessiner des formes, les lignes, le texte, etc. La classe Bitmap fournit une interface de plus bas niveau, c est-à-dire de l'image, vous permettant de manipuler directement les pixels. La classe Canvas fournit les méthodes de dessin pour dessiner sur un bitmap et la classe Paint spécifie comment vous dessinez sur le bitmap. Un objet de type Canvas contient le bitmap sur lequel vous dessinez. Il fournit également des méthodes pour les opérations de dessin, par exemple, drawargb() pour dessiner en couleur, drawbitmap( ) pour dessiner une image bitmap, drawtext() pour dessiner un texte, drawroundrect( ) pour dessiner un rectangle avec des coins arrondis et bien plus encore (redimensionner, faire pivoter, transformer l'image, sauvegarde et restauration des états de dessin). Imaginez-le comme un morceau de papier sur lequel pouvez dessiner. Pour dessiner sur l'objet Canvas vous utilisez un objet de type Paint. La classe Paint permet de préciser les effets de couleur, la police et certains effets pour l'opération de dessin. Imaginez-le comme le pinceau physique que vous tenez dans votre main lors de la peinture sur une toile. Vous pouvez avoir plusieurs brosses différentes qui ont toutes des propriétés différentes, et que vous utilisez chacun dans un but différent. La classe Path permet de décrire un conteneur virtuel d'actions graphiques à l'intérieur de votre Canvas. La classe centrale pour réaliser une interface graphique sous Android est la classe "View". La classe View réagit aux événements tactiles et nous permettra de récupérer les points du dessin. Nous allons donc réagir aux ontouchevent() et récupérer la position du doigt via get(x) et get(y). Les événements : http://www.reseaucerta.org CERTA - juin 2014 v1.0 Page 4/9

MotionEvent.ACTION_DOWN Le doigt touche l'écran (démarre le dessin) MotionEvent.ACTION_MOVE Le doigt bouge MotionEvent.ACTION_UP Le doigt ne touche plus l'écran MotionEvent.ACTION_CANCEL L'événement est supprimé, une autre application a pris le contrôle. Si l'application ne nécessite pas une quantité importante de transformations ou de vitesse de défilement d'écran (frame-rate) spécifique, il est plus pratique de créer une View personnalisée qui va directement nous proposer un Canvas pour dessiner avec l'appel de View.onDraw( ). De plus, nous utiliserons les méthodes permettant de sauvegarder un bitmap en chaine de caractères, le bitmap étant transformé ici selon le protocole JPEG en un tableau de bits, encodé par la suite dans une chaine de caractères en base 64 qui nous permettra de sauvegarder la signature et de la réafficher. http://www.reseaucerta.org CERTA - juin 2014 v1.0 Page 5/9

Activity CaptureSignature Layout Nous utiliserons un Layout réduit pour diminuer la taille de la sauvegarde du JPEG, exemple : Un LinearLayout largeur 600 hauteur 500 contenant Code Ø un LinearLayout pour les boutons (largeur match_parent) contenant 3 boutons (height 50dp width match_parent) Ø un LinearLayout (height et width match_parent) que l'on remplira avec la View permettant de signer à la main. Ø Déclarez une variable linearlayout de type LinearLayout et l'associer au dernier LinearLayout de notre Layout. Ø Déclarez une variable client de type Client et la charger via appel des méthodes de Modele. Ø Dans le oncreate Récupérez via l'objet Bundle l'identifiant du client Générez 2 chaines de caractères, lig1 et lig2, telles qu'elles sont décrites sur la copie d écran ("Client :...","Compteur :...") Déclarer les 3 Buttons, les affecter aux boutons du LinearLayout. Rendre le bouton save inaccessible Générer les setonclicklistener des 3 boutons La classe View représente le bloc de construction de base pour les composants de l'interface utilisateur et donc nécessaire pour gérer une zone de dessin. Une vue occupe une zone rectangulaire à l'écran et propose les méthodes pour le dessin et la gestion des événements. Nous allons donc ici, à l'intérieur de notre Activity, déclarer une classe héritant de View surchargeant les méthodes nous permettant de réagir aux événements du doigt et nous permettant de dessiner (cf. code annexe class Signature). Ø Déclarez une variable signature de type Signature Ø Modifiez le constructeur de Signature Ajoutez 2 paramètres chaines de caractères permettant de passer lig1,lig2 et de les initialiser Affectez la couleur du background. Exemple this.setbackgroundcolor(color.white); Définissez les propriétés de notre pinceau paint. Exemple : paint.setantialias(true); // empêche le scintillement gourmand en cpu et mémoire paint.setcolor(color.black); paint.setstrokewidth(5f); //taille de la grosseur du trait en pixel paint.settextsize(20);// taille du texte pur afficher les lignes Ø Ajoutez à la classe Signature une méthode permettant de sauver le dessin (cf. annexe) Ø Ajoutez à la classe Signature une méthode permettant de réinitialiser le dessin path.reset();invalidate(); http://www.reseaucerta.org CERTA - juin 2014 v1.0 Page 6/9

Ø Modifiez la méthode ondraw de Signature en ajoutant le code permettant de dessiner les lignes et l'ensemble des points du path paint.setstyle(paint.style.fill); canvas.drawtext(lig1, 20, 30, paint); canvas.drawtext(lig2, 20, 60, paint); paint.setstyle(paint.style.stroke); canvas.drawpath(path, paint); Ø Modifiez la méthode ontouchevent de Signature en ajoutant le fait que le bouton save devient accessible Ø Dans le oncreate de CaptureSignature Instanciez signature(variable de type Signature) en appelant le constructeur de Signature signature = new Signature(this, null,lig1,lig2); Ajouter à linearlayout (le linearlayout de notre xml) signature linearlayout.addview(signature, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); Sur le clic du bouton clear, appelez la méthode de Signature permettant de réinitialiser le dessin et rendez le bouton save inaccessible. Sur le clic du bouton save, appelez la méthode de Signature permettant de sauvegarder le dessin en String, puis modifiez la variable signature_base64 de l'objet client, sauvegardez l'objet client et appelez finish() Sur le clic de cancel appelez finish(). Activity AfficheSignature Layout Idem que CaptureSignature sauf pour les boutons. Code La grande différence consiste dans le code de la classe Signature. En effet, cette dernière ne sert qu'à afficher la signature sauvegardée dans la variable signature_base64 du client dont l'identifiant est passé en paramètre. La méthode ontouchevent de dessinsignature ne sert donc à rien. Seules les variables bitmap et canvas sont utiles. Le constructeur de Signature ne fait rien et n'a pas besoin des chaines de caractères. La méthode ondraw de Signature ne sert qu'a dessiner le Canvas via canvas.drawbitmap(bitmap, 0, 0, null); Dans l'activity AfficheSignature il suffit donc d'appeler, à partir d'une variable de type Signature, la méthode dessine (cf. annexe) de Signature qui, à partir de la chaine de caractères signature_base64 de l'objet client, va régénérer l'image via un bitmap qui sera redessiné. http://www.reseaucerta.org CERTA - juin 2014 v1.0 Page 7/9

ANNEXE : Exemple de code Gestion graphique de la signature Classe héritant de View public class Signature extends View { // variables nécessaire au dessin private Paint paint = new Paint(); private Path path = new Path();();// collection de l'ensemble des points sauvegardés lors des mouvements du doigt private Canvas canvas; private Bitmap bitmap; public Signature(Context context, AttributeSet attrs) { super(context, attrs); //gestion du dessin @Override protected void ondraw(canvas canvas) { super.ondraw(canvas); // gestion des événements du doigt @Override public boolean ontouchevent(motionevent event) { float eventx = event.getx(); float eventy = event.gety(); switch (event.getaction()) { case MotionEvent.ACTION_DOWN: path.moveto(eventx, eventy); return true; case MotionEvent.ACTION_MOVE: path.lineto(eventx, eventy); break; case MotionEvent.ACTION_UP: // nothing to do break; default: return false; invalidate(); return true; Sauvegarde d'un Canvas en un String, image encodée en jpeg base64 public String save() { String vretour; if (bitmap == null) { bitmap = Bitmap.createBitmap(this.getWidth(), this.getheight(), Bitmap.Config.RGB_565); try { canvas = new Canvas(bitmap); this.draw(canvas); ByteArrayOutputStream ByteStream = new ByteArrayOutputStream(); bitmap.compress(bitmap.compressformat.jpeg, 100, ByteStream); byte[] b = ByteStream.toByteArray(); vretour = Base64.encodeToString(b, Base64.DEFAULT); catch (Exception e) { http://www.reseaucerta.org CERTA - juin 2014 v1.0 Page 8/9

Toast.makeText(getApplicationContext(), "Erreur Sauvegarde", Toast.LENGTH_LONG).show(); vretour = null; return vretour; Transformation d'un String en image jpeg et dessin dans un Canvas public void dessine(string encodedstring) { try { byte[] encodebyte = Base64.decode(encodedString, Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray(encodeByte, 0, encodebyte.length); bitmap = bitmap.copy(bitmap.getconfig(), true); catch (Exception e) { Toast.makeText(getApplicationContext(), "error dessine", Toast.LENGTH_LONG).show(); canvas = new Canvas(bitmap); this.draw(canvas); http://www.reseaucerta.org CERTA - juin 2014 v1.0 Page 9/9