Sometimes I write things, sometimes I don't.

To content | To menu | To search

Tag - Android

Entries feed - Comments feed

Friday 18 November 2011

Chaînes de caractères dynamiques

mobile.png Tout bon programmeur Android a pour habitude de lister toutes les chaînes de caractères (ou presque) dans le fichier res/values/strings.xml. A priori, seules les chaînes de caractères statiques ne peuvent être mises dans ce fichier. Mais, il existe des méthodes pour rendre ces chaînes un petit peu plus dynamique qu'elles n'y paraissent. Voyons tout ça.

1. Les formes plurielles

Les formes plurielles varient plus ou moins d'un langage à un autre. Par exemple, en français, on peut vouloir écrire :

  • Je ne possède pas de stylo.
  • Je possède un stylo.
  • Je possède des stylos.

L'API Android met à disposition plusieurs distinctions de formes plurielles grâce à 6 mot clés.

  1. zero, pour la quantité 0 ;
  2. one, pour la quantité 1 ;
  3. two, pour la quantité 2 ;
  4. few, pour représenter une petite quantité ;
  5. many, pour représenter une moyenne quantité ;
  6. other, pour représenter une quantité supérieure à une autre suivant la langue.

En français, on aura tendance à n'utiliser que zero, one et other.
Ainsi pour former les chaînes précédemment citées on mettra dans notre fichier res/values/strings.xml le code suivant :

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <plurals name="nombreDeStylos">
    <item quantity="zero">Je ne possède pas de stylo.</item>
    <item quantity="one">Je possède un stylo.</item>
    <item quantity="other">Je possède des stylos.</item>
  </plurals>
</resources>

Dans le code Java, on récupérera la bonne forme de cette manière.

final List<Stylo> stylos = getStylos();
final int count = stylos.size();
final String text = this.getResources().getQuantityString(R.plurals.nombreDeStylos, count, count);

2. Formatage des chaînes

Il peut être également utile d'afficher des nombres dans les chaînes de caractères comme par exemple : "Bonjour X, vous avez Y nouveaux messages !". Cela se fait de manière relativement simple grâce à la méthode String.format(String, Object...) de Java. Cette méthode est également invoquée automatiquement lors de l'utilisation de Context.getString(int, Object...). La chaîne de caractères à formater doit contenir quelques marques de formatage comme %1$s pour dire qu'il faut remplacer cette marque par le premier argument et que celui-ci est une chaîne de caractère ou encore %2$d pour dire qu'il faut mettre ici le second argument qui est un entier.
Ainsi dans le fichier res/values/strings.xml on écrira :

<string name="welcome_message">Bonjour %1$s, vous avez %2$d nouveaux messages !</string>

Et on utilisera le code Java suivant :

final String username = "toto";
final int mailCount = 10;
final String text = String.format(this.getResources().getString(R.string.welcome_message), username, mailCount);

On pourra aussi utiliser celui-ci :

final String username = "toto";
final int mailCount = 10;
final String text = this.getResources().getString(R.string.welcome_message, username, mailCount);

3. Conclusion

Comme on peut le voir Android met à disposition plusieurs méthodes pour manipuler les chaînes de caractères et les rendre aussi flexibles que possible tout en simplifiant un maximum le travail des traducteurs par exemple. Il ne reste plus qu'à exploiter ces possibilités pour créer un code simple et efficace.

Thursday 6 January 2011

Et quand l'activité a besoin d'un objet ?

mobile.pngJe ne me souviens pas avoir parlé de programmation Android par ici. ce billet est donc l’occasion de commencer l’exploration du merveilleux OS mobile que nous fournit gracieusement Google. J’ai un smartphone qui carbure avec Android depuis bientôt 2 ans et je ne m’étais intéressé que vaguement à la programmation d’applications dessus. Dans mon parcours universitaire, j’ai eu l’occasion d’aborder ce sujet et mon projet tuteuré consiste principalement à faire une application pour Android. Trêve de blabla, passons à l’action.

Je ne vais pas refaire un cours sur Android, nombre de tutoriaux et d’exemples sont disponibles sur la toile. Dans le cadre de mon projet, j’avais donc un souci pour passer de l’information d’une activité à une autre. En effet, seuls les types primitifs et quelques autres trucs peuvent être passés d’une activité à une autre. Malheureusement, pas moyen de faire voyager un objet “simple” sans modification. Il faut qu’il implémente soit Serializable (connu par tous les bons programmeurs Java) soit Parcelable (propre à Android), “pour les surprendre on peut aussi faire les deux” (private joke).

Dans le cas présent, nous allons voir comment faire en implémentant l’interface Parcelable car cela demande un peu plus de code et de compréhension. Considérons un objet Message, sa classe (de base) s’écrirait très simplement.

class_message.png
Pour pouvoir faire naviguer cet objet entre plusieurs activités, on va donc le faire implémenter l’interface citée précédemment. Et c’est ici qu’il faut penser à quelques ajouts bien précis. L’objet implémentant Parcelable doit contenir un champ static appelé CREATOR de type Parcelable.Creator. De plus, 2 méthodes seront à redéfinir. Notre classe message se transforme alors comme la suivante.

class_message_parcelable.png
À ce stade, tous nos objets de type Message pourront être transférés d’une activité à une autre. Pour cela, on va donc utiliser un Bundle avec la méthode putParcelable(Parcelable).

class_sender.png
À noter qu'en tant qu’identifiant de l’objet dans le bundle, j’ai mis son nom complet (package + classe) ce n’est pas un hasard. Maintenant, on peut voir comment récupérer l’objet dans l’activité qui va le réceptionner.

class_receiver.png
Voilà qui est fait. Remarquez qu’il n’y a pas besoin de “caster” l’objet de type Parcelable récupéré, je vous laisse deviner grâce à quoi. Je ne prétends pas que ma méthode soit la meilleure, ni la plus sécurisée, etc… Tout ce que je sais, c’est que pour l’instant ça marche. L’expérience venant en codant, j’en saurai davantage sur l’efficacité de cette technique plus tard. Toutes améliorations et/ou remarques sont les bienvenues.

Monday 4 October 2010

Contrôler VLC avec son Android

astuce.pngDepuis que je suis rentré en Licence j’ai un nouvel appartement ("on s’en fiche" vous me direz, mais faut une introduction non ?) et j’ai surtout un nouveau canapé que j’apprécie beaucoup. Mon PC n’en est pas très loin, mais comme certains le savent j’aime en faire le moins possible. C’est donc suite à cette situation que j’ai rêvé d’une application pour contrôler VLC (et regarder des vidéos) à distance.

Étant l’heureux possesseur d’un HTC Hero depuis un peu plus d’un an, je me suis dit qu’il devait y avoir probablement quelques développeurs aussi fainéants que moi. Du coup, ils le sont un peu moins vue qu’ils ont pris le temps de coder leurs propres applications. Ainsi, je me suis lancé en quête d’une télécommande de VLC dans l’Android Market et j’ai découvert VLC Remote.

market-vlc-remote.png
Aussitôt, je l’ai installé. Cette application fonctionne grâce au serveur HTTP intégré dans VLC. Par défaut, il n’est pas actif mais on peut l’activer soit en quelques clics, soit en lançant la ligne de commande qui va bien.

vlc-httpd-graphique.png
Les deux clics ci-dessus sont plus ou moins l’équivalent de la ligne de commande suivante :
~$ vlc --extraintf=http --fullscreen --http-album-art --qt-start-minimized

Maintenant que le serveur HTTP de VLC est lancé, VLC Remote sera capable de le détecter. Il faut bien entendu que le mobile Android soit sur le même réseau que le PC contenant VLC. C’est possible entre autre par le Wi-Fi (qui est mis à disposition sur à peu près tous les smartphones et les boîtiers ADSL). Par exemple, avec ma Freebox, j’ai un réseau de classe C assez classique (faut que je songe à le changer peut-être) auquel mes 2 PCs ainsi que mon Hero sont connectés.

vlc-remote-settings.png
Sur la capture d’écran précédente, on constate donc que VLC est lancé sur le PC d’adresse IP 192.168.0.12 et que l’interface HTTP utilise le port 8080. On sélectionne donc cette machine dans l’interface pour contrôler VLC. On peut ensuite sélectionner un fichier à lire en utilisant le bouton en haut à droite. Une fois le fichier sélectionné, on peut mettre en pause, stopper, reprendre, avancer, reculer la lecture, gérer la playlist et gérer le mode plein écran.

vlc-remote-filechooser.png    vlc-remote-running.png

Voilà un outil bien pratique pour transformer son Android en télécommande pour VLC. Maintenant, vous pourrez rester sur votre fauteuil tout en regardant ce que vous voulez. Encore une technique pour bouger un peu moins.

Monday 30 November 2009

Essai de la coque Mizu Shell pour HTC Hero

Aujourd'hui est un jour de test. Les housses ou coques pour protéger le HTC Hero il n'y en a pas des tonnes (contrairement à l'iPhone). On peut l'expliquer en partie grâce au design du smartphone qui peu banal (mais tellement sympathique). Pourtant, on a grand besoin de protections pour mettre notre Hero à l'abri des chocs et d'autres choses. C'est dans ce but que Proporta propose son produit Mizu Shell.

Cette coque faite en silicone permet de protéger son HTC contre les chocs et les éraflures mais seulement sur les côtés et l'arrière de téléphone. En effet, l'avant reste libre afin que l'on puisse continuer à manier l'engin.

L'avantage de cette protection est d'épouser parfaitement la forme du Hero. Une fois celui-ci rangé dedans, il ne bouge plus et profite de son nid douillet. On peut observer un motif sur le dos de la coque qui me fait penser à celui que l'on peut trouver sur l'arrière du HTC Diamond (premier du nom).

   

On peut également remarquer que toutes les prises qui sont sur le HTC Hero sont libres. On peut donc, malgré le fait d'utiliser la coque, continuer à brancher le câble USB, ou encore ses écouteurs sur la prise jack et même prendre des photos.
   
   

La coque Mizu Shell n'étant tout de même pas très épaisse, il faut quand même continuer à manipuler le smartphone avec attention, un gros choc ne sera pas vraiment atténué. Petite chose qui me chagrine, je trouve (mais cela n'est que mon avis) que le design tant apprécié du Hero souffre un peu lorsque l'on utilise cette protection. J'aurais préféré quelque chose de plus esthétique.


La Mizu Shell reste quand même un bon produit qui ne manquera pas à son devoir, c'est-à-dire protéger le Hero des attaques extérieures. Chose qui peut être très pratique si on considère la fragilité de nos petites bêtes qui sont à la fois pratiques et coûteuses.

Friday 23 October 2009

Un Hero m'a sauvé

Je l'attendais avec impatience ces derniers jours et il est enfin arrivé. J'en avais marre de mon HTC Diamond, enfin... j'en avais surtout marre de Windows Mobile 6 et de sa lenteur. J'aurais pu me tourner vers Windows Mobile 6.5 mais non quitte à changer de téléphone pour son système d'exploitation autant un prendre un bon. C'est donc pour ça que j'ai choisi le HTC Hero.

Pourquoi j'ai choisi ce téléphone ? Cette question pourrait appeler beaucoup de réponses avec des tas d'arguments. Moi, je l'ai choisi parce qu'il me plait c'est tout. Son design, son système d'exploitation et son interface sont très réussis.


Il est très simple d'utilisation et offre beaucoup de fonctionnalités (GPS, appareil photo 5 mégapixels, lecteur de carte micro SD dont une de 2 Go accompagne le téléphone, 3G+, et j'en passe). Le HTC Hero est le premier téléphone (de chez HTC donc) à avoir proposé l'interface Sense. C'est une surcouche un peu comme le TouchFlo3D sur Windows Mobile mais en beaucoup plus personnalisable. Grâce au 6 extensions de l'écran d'accueil (oui un peu comme le changement de bureau virtuel sous Ubuntu), on peut placer tout un tas de widgets qui peuvent aussi bien afficher la météo, donner accès aux contacts favoris, que modifier des paramètres du téléphone.

Je ne suis pas encore un fan des autres Facebook, Twitter, etc, mais le HTC Hero possède les logiciels qui vont biens pour exploiter les réseaux sociaux les plus populaires. Étant un grand utilisateur du stylet, j'ai été, au début, assez déstabilisé par son absence sur le Hero mais finalement, l'écran tactile est beaucoup mieux gérer et surtout beaucoup plus précis que sur le Diamond. Les fautes de frappe sont rares malgré le "tout au doigt". La coque du téléphone permet de bien le tenir en main et l'empêche de glisser.

Bref, un bon téléphone qui ne manquera pas de m'être utile. La rapidité de Android comparé à celle de Windows Mobile me surprend déjà agréablement. Je pense donc que le meilleur reste à venir.

Sunday 22 February 2009

Des applications mobiles

Le système d'exploitation pour mobile de Google ,nommé Android, va débarquer en France sous peu. SFR m'a récemment fait remplir un questionnaire en ligne pour savoir s'il pouvait me classer dans la catégorie des acheteurs potentiels du G1 de chez HTC. Malheureusement pour eux, ou heureusement peut-être (à plus long terme), mon oeil se dirige d'avantage vers le prochain Diamond. Même si mon PDA actuel tourne encore sous Windows Mobile, certains essaient d'inverser la tendance. C'est en partant de ça que j'ai fait quelques recherches et que je suis tombé sur un tutoriel qui m'a beaucoup intrigué et ne présage que de bonnes choses (pour moi). En le lisant, on comprend tout de suite que le SDK de Android est basé sur le langage Java. Et on sait combien je l'aime celui-ci. Si ça vous tente, n'hésitez pas à lire ce bref article, il est très simple à comprendre. Des notions de Java ne sont pas spécialement nécessaires, on peut aussi apprendre sur le tas. Pour ma part, je me tiens prêt à coder pour une utilisation future (je l'espère).