<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sur la route d&#039;Oxiane</title>
	<atom:link href="http://blog.oxiane.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.oxiane.com</link>
	<description>digressions diverses</description>
	<lastBuildDate>Mon, 13 Feb 2012 13:23:36 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Olivier Lombard Champion LMS LMP2 2011 sur la Signatech Nissan n°23 pour le WEC 2012</title>
		<link>http://blog.oxiane.com/2012/02/13/olivier-lombard-champion-lms-lmp2-2011-sur-la-signatech-nissan-n23-pour-le-wec-2012/</link>
		<comments>http://blog.oxiane.com/2012/02/13/olivier-lombard-champion-lms-lmp2-2011-sur-la-signatech-nissan-n23-pour-le-wec-2012/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 13:18:47 +0000</pubDate>
		<dc:creator>Jean-Louis Rousselin</dc:creator>
				<category><![CDATA[Autres]]></category>

		<guid isPermaLink="false">http://blog.oxiane.com/?p=2952</guid>
		<description><![CDATA[Pilote dont je vous ai parlé déjà à de nombreuses reprises ici ou ici, Olivier Lombard est vraiment un des plus prometteurs ! Il signe ce jour avec l&#8217;écurie Nissan Signatech et on lui souhaite tout le succès que son talent mérite. Olivier Lombard: &#171;&#160;Mon titre de Champion LMS LMP2 2011 a été une bonne [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.oxiane.com/2012/02/13/olivier-lombard-champion-lms-lmp2-2011-sur-la-signatech-nissan-n23-pour-le-wec-2012/olivier-4/" rel="attachment wp-att-2954"><img class="alignleft size-large wp-image-2954" src="http://blog.oxiane.com/wp-content/uploads/2012/02/olivier1-1024x102.jpg" alt="" width="1024" height="102" /></a></p>
<p>Pilote dont je vous ai parlé déjà à de nombreuses reprises <a href="blog.oxiane.com/2011/12/12/sponsoring-sportif-oxiane/" target="_blank">ici</a> ou <a href="blog.oxiane.com/2011/09/06/site-officiel-olivier-lombard-com/" target="_blank">ici</a>, Olivier Lombard est vraiment un des plus prometteurs !</p>
<p>Il signe ce jour avec l&#8217;écurie <a href="signature-team.com/signatech-nissan.php" target="_blank">Nissan Signatech</a> et on lui souhaite tout le succès que son talent mérite.</p>
<p><strong>Olivier Lombard</strong>: &laquo;&nbsp;Mon titre de Champion LMS LMP2 2011 a été une bonne carte de visite pour être intégré dans l&#8217;équipe officielle SIGNATECH-NISSAN, elle aussi championne LMP2 2011 mais en Intercontinental le Mans Cup. Mon objectif est de continuer à apprendre notamment aux cotés de Franck, pour les circuits je ne connais pas. Mais l&#8217;équipe a une grosse expérience et je sens une énorme motivation de la part de tous les acteurs.&nbsp;&raquo;</p>
<p><a href="http://www.olivierlombard.com" target="_blank">Son site web</a> a été mis à jour en conséquence par les équipes d&#8217;<a href="http://www.oxiane.com" target="_blank">OXiane</a>.</p>
<p>PS: Savez vous pourquoi toutes les voitures Nissan engagées portent le n°23 ?</p>
<p>23 en japonais veut dire Nissan, Merci à Jean (Lombard, le papa de notre champion, ndlr) pour cette info !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oxiane.com/2012/02/13/olivier-lombard-champion-lms-lmp2-2011-sur-la-signatech-nissan-n23-pour-le-wec-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS &amp; Core Data</title>
		<link>http://blog.oxiane.com/2012/02/08/ios-core-data/</link>
		<comments>http://blog.oxiane.com/2012/02/08/ios-core-data/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 17:19:13 +0000</pubDate>
		<dc:creator>Manuel François</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Core Data]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://blog.oxiane.com/?p=2816</guid>
		<description><![CDATA[Nous allons encore poursuivre avec notre application développée lors de mes 2 derniers billets ici et là afin d&#8217;ajouter un bouton &#171;&#160;clickCoreData&#160;&#187; qui fera un segue vers un UITableViewController peuplé à partir de Core Data. Qu&#8217;est ce que Core Data ? &#171;&#160;C&#8217;est une bibliothèque permettant de gérer le cycle de vie des objets et les [...]]]></description>
			<content:encoded><![CDATA[<p>Nous allons encore poursuivre avec notre application développée lors de mes 2 derniers billets <a href="http://blog.oxiane.com/2012/01/10/ios-modal-partial-curl-sqlite/" title="ici">ici</a> et <a title="ici" href="http://blog.oxiane.com/2011/12/29/ios-modal-partial-curl/">là</a> afin d&#8217;ajouter un bouton &laquo;&nbsp;clickCoreData&nbsp;&raquo; qui fera un segue vers un <code>UITableViewController</code> peuplé à partir de Core Data.</p>
<p>Qu&#8217;est ce que Core Data ?</p>
<p>&laquo;&nbsp;C&#8217;est une bibliothèque permettant de gérer le cycle de vie des objets et les graphes d&#8217;objets de manière automatique et générale incluant également la persistance&nbsp;&raquo; &#8211; traduction partielle de la <a href="https://developer.apple.com/library/mac/#documentation/cocoa/conceptual/coredata/cdProgrammingGuide.html#//apple_ref/doc/uid/TP30001200-SW1" title="page">page</a> du site d&#8217;Apple.</p>
<p>En gros, pour moi c&#8217;est un peu comme une base de données orientée objet, on pourrait faire la parallèle avec Hibernate côté Java sauf que ce n&#8217;est pas un framework de persistance d&#8217;objet même s&#8217;il peut persister les graphes d&#8217;objets (relations et états).</p>
<p>Ici, nous allons créer le mapping entre la base de donnée et les objets puis les requêtes permettant de récupérer/modifier/&#8230; nos objets et enfin accéder aux &laquo;&nbsp;colonnes de notre table&nbsp;&raquo; grâce aux propriétés de ces objets.<!--more--></p>
<h2>Retour sur le delegate</h2>
<p>Mais avant tout ça, il faut quand même que nous revenions sur la délégation.</p>
<p>En effet, nous avons utilisé 2 fois ce pattern afin de permettre la transmission d&#8217;une donnée au contrôleur parent et la disparition de la vue courante faîte par le contrôleur parent.</p>
<p>Seulement dans notre <code>PageTrickViewController</code>, nous avons deux propriétés correspondant aux deux types de contrôleurs affichables et si nous voulons ajouter 3, 4 ou 15 autres contrôleurs nous allons devoir ajouter 3,4 ou 15 autres propriétés.</p>
<p>Il faut donc appliquer le pattern jusqu&#8217;au bout pour résoudre cela et ne plus avoir qu&#8217; 1 propriété.<br />
Pour y arriver, il suffit que les délégants soit conforme au même protocole que <code>PageTrickViewController</code> !</p>
<p>Ainsi, on peut remplacer les propriétés par une seule dans le <code>PageTrickViewController</code>:</p>
<p>On n&#8217;oublie pas de synthétiser :</p>
<p>Bien sûr, il va falloir modifier <code>prepareForSegue</code> et <code>dismissWithData</code>:</p>
<h2>Passons à Core Data !</h2>
<p>Comment l&#8217;utilise t-on ?</p>
<p>Eh bien c&#8217;est assez simple, nous allons créer nos entités grâce à Xcode puis y accéder avec un <code>NSManagedObjectContext</code>, l&#8217;objet central autour duquel tourne toute l&#8217;activité de Core Data.</p>
<p><strong>1. Importation du framework :</strong></p>
<p>Comme expliquer dans mon <a href="http://blog.oxiane.com/2012/01/10/ios-modal-partial-curl-sqlite/" title="ici">précédent billet</a>, faîtes les étapes permettant d&#8217;ajouter<br />
un framework à votre projet.<br />
Ici nous devons importer : <code>CoreData.framework</code></p>
<p><strong>2. Création visuelle de la base de données :</strong></p>
<p>Tout en vidéo :</p>
<p><video width="640" height="460" controls="controls"><source src="http://blog.oxiane.com/wp-content/uploads/2012/02/CoreData1.mov" type="video/mp4" /><source src="http://blog.oxiane.com/wp-content/uploads/2012/02/CoreData1.ogg" type="video/ogg" /></p>
<p>Et oui alors, c&#8217;est quoi <code>@dynamic</code> ?<br />
Pour tout vous dire c&#8217;est un peu comme <code>@synthesize</code> sauf que l&#8217;on dit au compilateur : &laquo;&nbsp;ne t&#8217;inquiète pas, je te filerai les implémentations des accesseurs à l&#8217;exécution ou directement&nbsp;&raquo;.</p>
<p>Mais comme tout est bien fait dans iOS (enfin presque), Core Data génère lui-même les accesseurs pour nous à l&#8217;exécution&#8230; si c&#8217;est pas sympa tout ça !</p>
<p>On peut donc employer la notation pointée sur nos entités les yeux fermés mais avant cela précisons un peu plus comment fonctionne Core Data.</p>
<p>En fait, il y a 2 façons d&#8217;utiliser ce framework :<br />
 &#8211; soit on crée un projet en cochant la case &laquo;&nbsp;use Core Data&nbsp;&raquo; (ce qu&#8217;on n&#8217;a pas fait au début&#8230; flûte !)<br />
 &#8211; soit on utilise <code>UIManageDocument</code> et on récupère son <code>NSManagedObjectContext</code></p>
<p>On opte donc pour la 2ème solution, d&#8217;ailleurs elle est très pratique car c&#8217;est une porte ouverte sur iCloud mais je n&#8217;en dis pas plus pour l&#8217;instant à ce sujet. (suspens !)</p>
<p>Il faut voir <code>UIManageDocument</code> comme un conteneur pour notre base de données.</p>
<p>Afin de faciliter le codage, j&#8217;ai utilisé une classe mise à disposition <a href="http://www.stanford.edu/class/cs193p/cgi-bin/drupal/system/files/sample_code/CoreDataTableViewController_1.zip" title="ici">ici</a> par Paul Hegarty de l&#8217;Université de Stanford.<br />
Rassurez-vous le zip de mon projet est disponible en bas de page.</p>
<p>Cette classe facilite la gestion d&#8217;un <code>UITableViewController</code> dont les cellules sont peuplées en fonction de nos entités car pour les remplir nous avons besoin d&#8217;un <code>NSFetchedResultController</code> capable de répondre au protocole <code>UITableViewDataSource</code>.</p>
<p>Par exemple, une des méthodes importante de <code>NSFetchedResultController</code> est :</p>
<p>qui irait très bien dans :</p>
<p>Une fois cette classe importer dans notre projet, il ne nous reste plus qu&#8217;à la sous-classer en créeant notre classe <code>CoreDataTablePageCurlController</code> :</p>
<p>Interface :</p>
<p>Implémentation :</p>
<p>J&#8217;ai fait quelques brefs commentaires dans le code afin de montrer les différentes étapes mais détaillons un peu&#8230;<br />
Comme notre base de données est vide au début, on récupère une description de l&#8217;entité qui nous intéresse (ici &laquo;&nbsp;Objet&nbsp;&raquo;) :</p>
<p>puis on instancie l&#8217;objet tout en l&#8217;ajoutant au contexte :</p>
<p>ensuite on définit c&#8217;est champs grâce à la notation pointée, en effet rappelez-vous ce que j&#8217;ai dit tout à l&#8217;heure : @dynamic indique au compilateur que l&#8217;implémentation des accesseurs lui sera fournit plus tard à l&#8217;exécution et justement Core Data l&#8217;a fait pour nous !</p>
<p>enfin, il ne reste plus qu&#8217;à sauver le contexte et créer la base de données :</p>
<p>Ah mais on oublierait pas de parler de requête par hasard ? Les objets ne vont pas arriver tous seuls comme par magie !<br />
Bah non, c&#8217;est sûr.<br />
Si on regarde dans le <em>block</em> passé en argument de ce message, on tombe sur l&#8217;envoi du message <code>setupFetchedResultsController</code>.<br />
Dans la méthode <code>setupFetchedResultsController</code>, on fait toutce qu&#8217;il faut :</p>
<p>création de la requête pour l&#8217;entité <em>Objet</em><br />
[/objc]<br />
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Objet"];<br />
[/objc]</p>
<p>on trie les objets selon leur attribut <em>num</em></p>
<p>on ne définit pas de prédicat car on désire récupérer tous les objets, en revanche on n&#8217;oublie pas d&#8217;instancier notre <code>NSFetchedResultsController</code></p>
<p>pour plus de détails sur les requêtes voir la <a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/NSFetchRequest.html" title="doc">doc</a>.</p>
<p>Une fois terminé, ajoutez dans votre storyboard :<br />
 &#8211; un bouton &laquo;&nbsp;clickCoreData&nbsp;&raquo;<br />
 &#8211; un <code>UITableViewController</code>, dont le type sera évidemment <code>CoreDataTablePageCurlController</code><br />
 &#8211; un segue de ce bouton vers le <code>UITableViewController</code> avec comme transition &laquo;&nbsp;Cover vertical&nbsp;&raquo; (pour changer, en plus c&#8217;est joli ça fait un effet rebond avec le offset)</p>
<p>Oups, nous allions oublier de mettre à jour notre méthode <code>prepareForSegue</code> dans <code>PageTrickViewController</code> :</p>
<p>Le mal est réparé !</p>
<p>Et voici la petite vidéo et le <a href="http://blog.oxiane.com/wp-content/uploads/2012/02/PageTrick.zip">projet zippé</a> en bonus :</p>
<p><video width="640" height="460" controls="controls"><source src="http://blog.oxiane.com/wp-content/uploads/2012/02/CoreData2.mov" type="video/mp4" /><source src="http://blog.oxiane.com/wp-content/uploads/2012/02/CoreData2.ogg" type="video/ogg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oxiane.com/2012/02/08/ios-core-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://blog.oxiane.com/wp-content/uploads/2012/02/CoreData1.mov" length="5242213" type="video/quicktime" />
<enclosure url="http://blog.oxiane.com/wp-content/uploads/2012/02/CoreData1.ogg" length="6280337" type="audio/ogg" />
<enclosure url="http://blog.oxiane.com/wp-content/uploads/2012/02/CoreData2.mov" length="753519" type="video/quicktime" />
<enclosure url="http://blog.oxiane.com/wp-content/uploads/2012/02/CoreData2.ogg" length="763299" type="audio/ogg" />
		</item>
		<item>
		<title>Subversion dans les nuages</title>
		<link>http://blog.oxiane.com/2012/01/26/subversion-dans-les-nuages/</link>
		<comments>http://blog.oxiane.com/2012/01/26/subversion-dans-les-nuages/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 12:56:45 +0000</pubDate>
		<dc:creator>Guillaume Rams</dc:creator>
				<category><![CDATA[Perspectives]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[CloudBees]]></category>
		<category><![CDATA[Outils]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://blog.oxiane.com/?p=2630</guid>
		<description><![CDATA[De passage au siège Oxiane, petite discussion avec Jeff. Il voudrait rendre le référentiel subversion d&#8217;un projet accessible de l&#8217;extérieur mais impossible de trouver ne serait-ce qu&#8217;une demi-heure pour configurer tout le monde sur le réseau. Jeff, tu as cinq minutes ? Sers-toi un café, je te monte un subversion accessible y compris depuis Krypton. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-2679" title="cloudox" src="http://blog.oxiane.com/wp-content/uploads/2012/01/cloudox.png" alt="" width="95" height="95" />De passage au siège Oxiane, petite discussion avec Jeff. Il voudrait rendre le référentiel subversion d&#8217;un projet accessible de l&#8217;extérieur mais impossible de trouver ne serait-ce qu&#8217;une demi-heure pour configurer tout le monde sur le réseau.</p>
<p>Jeff, tu as cinq minutes ? Sers-toi un café, je te monte un subversion accessible y compris depuis Krypton.</p>
<p><span style="color: #f0f5f7;"><br />
.<br />
</span></p>
<p><span style="text-decoration: underline;"><em>t0</em></span> </p>
<p>Je me connecte sur le site de <a href="http://www.cloudbees.com/">cloudbees</a>.</p>
<p><a href="http://blog.oxiane.com/wp-content/uploads/2012/01/01_cloudbees.png" rel="lightbox[2630]"><img class="alignnone size-full wp-image-2632" title="01_cloudbees" src="http://blog.oxiane.com/wp-content/uploads/2012/01/01_cloudbees.png" alt="" width="100%" height="100%" /></a></p>
<p>Je commence par ajouter un nouvel utilisateur à mon compte pour ton développeur (<em>Account &gt; Manage Users &gt; Add a user</em>).<br />
<!--more--><br />
Il semble que la personne ne reçoive pas de mail quand elle est inscrite par un tiers (?!?). L&#8217;astuce est d&#8217;aller sur la page &laquo;&nbsp;<a href="https://grandcentral.cloudbees.com/account/forgot_password">Forgot your Password?</a>&nbsp;&raquo; et d&#8217;entrer l&#8217;e-mail du nouvel inscrit. Comme ça cloudbees va lui envoyer un lien permettant de saisir un mot de passe et se loguer pour la première fois.</p>
<p><span style="text-decoration: underline;"><em>t + 2 min</em></span></p>
<p>Je crée un nouveau référentiel Subversion pour mon projet. Un clic sur <em>Create new code Repository</em>.</p>
<p><a href="http://blog.oxiane.com/wp-content/uploads/2012/01/04_SVNRepository.png" rel="lightbox[2630]"><img class="alignnone size-full wp-image-2673" title="04_SVNRepository" src="http://blog.oxiane.com/wp-content/uploads/2012/01/04_SVNRepository.png" alt="" width="702" height="356" /></a></p>
<p><span style="text-decoration: underline;"><em>t + 2 min 30</em></span></p>
<p>Le référentiel n&#8217;attend plus que son premier commit.</p>
<p><a href="http://blog.oxiane.com/wp-content/uploads/2012/01/05_SVNReadyToGo.png" rel="lightbox[2630]"><img class="alignnone size-full wp-image-2674" title="05_SVNReadyToGo" src="http://blog.oxiane.com/wp-content/uploads/2012/01/05_SVNReadyToGo.png" alt="" width="529" height="189" /></a></p>
<p>Et comme il me reste encore la moitié des cinq minutes allouées, on va lancer l&#8217;importation de ton repository subversion existant. On suit la doc :</p>
<p><a href="http://blog.oxiane.com/wp-content/uploads/2012/01/06_revpropchange.png" rel="lightbox[2630]"><img class="alignnone size-full wp-image-2675" title="06_revpropchange" src="http://blog.oxiane.com/wp-content/uploads/2012/01/06_revpropchange.png" alt="" width="299" height="40" /></a></p>
<pre>svnsync init https://svn-oxiane.forge.cloudbees.com/LeProjetDeJeff/ <em>URL_du_repo_source</em>
svnsync sync https://svn-oxiane.forge.cloudbees.com/LeProjetDeJeff/</pre>
<p>Et c&#8217;est parti mon kiki !</p>
<p><span style="text-decoration: underline;"><em>t + 3 min</em></span></p>
<p>La discussion se poursuit pendant que les révisions défilent sur l&#8217;écran. On aborde le sujet de l&#8217;intégration continue du projet en question chez cloudbees &#8230;<br />
la suite au prochain épisode.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oxiane.com/2012/01/26/subversion-dans-les-nuages/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Soirée PAUG de Janvier 2012 : IceScream Sandwich &amp; ASOP</title>
		<link>http://blog.oxiane.com/2012/01/24/soiree-paug-de-janvier-2012-icescream-sandwich-asop/</link>
		<comments>http://blog.oxiane.com/2012/01/24/soiree-paug-de-janvier-2012-icescream-sandwich-asop/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 21:51:49 +0000</pubDate>
		<dc:creator>Yakhya Dabo</dc:creator>
				<category><![CDATA[Perspectives]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[communauté]]></category>

		<guid isPermaLink="false">http://blog.oxiane.com/?p=2642</guid>
		<description><![CDATA[Ice Scream Sandwich est le nom de code de la toute dernière version de Android, la version 4. C&#8217;est l’un des deux thèmes de la première conférence PAUG de la nouvelle année qui s’est déroulée dans les locaux de l&#8217;ECE de Paris. . La deuxième partie de la soirée était consacrée aux problématiques de la [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.oxiane.com/wp-content/uploads/2012/01/ice-scream.jpg" rel="lightbox[2642]"><img class="alignleft size-medium wp-image-2645" title="ice-scream" src="http://blog.oxiane.com/wp-content/uploads/2012/01/ice-scream-300x219.jpg" alt="" width="130" height="95" /></a>Ice Scream Sandwich est le nom de code de la toute dernière version de Android, la version 4. C&#8217;est l’un des deux thèmes de la première conférence PAUG de la nouvelle année qui s’est déroulée dans les locaux de l&#8217;ECE de Paris. . La deuxième partie de la soirée était consacrée aux problématiques de la compilation des sources de Android à travers un retour d&#8217;expérience sur le projet ASOP (Android Open Source Project).</p>
<h2></h2>
<h2>Ice Scream Sandwich</h2>
<p>Dans la nouvelle version de Android on notera en premier lieu, du point de vue utilisateur, l&#8217;amélioration du Look&#8217;n Feel et les fonctionnalités du « Multitasking ». La bonne nouvelle pour les développeurs est l&#8217;unification de la plateforme qui permet de développer une seule application pour tous les terminaux Android. Pour marquer le coup avec le succès des réseaux sociaux, de nouvelles API &#8211; Social API &#8211; sont ajoutées pour faciliter le partage des ressources sur Facebook, Google ou tweeter ou l&#8217;accès au profil utilisateur. Dans l&#8217;API Contacts, tout comme dans l’API Calendar, une nouvelle table et des permissions supplémentaires sont apparues. L&#8217;intégration du NFC pour la communication directe entre terminaux et les récentes couches de l’ <a href="http://developer.android.com/reference/android/view/accessibility/package-summary.html">« Accessibility Features »</a> (la possibilité de faire une description vocale des éléments de l&#8217;écran) vont élargir le champ d’utilisation de la plateforme.</p>
<p>Les habitués de Swing, qui ont très tôt croisé le fer avec le TableLayout, apprécieront l’arrivée du Layout passe partout qu’est le GridLayout pour combler les limites du <a href="http://android-developers.blogspot.com/2011/11/new-layout-widgets-space-and-gridlayout.html">LinearLayout </a>(défaut d&#8217;alignement).</p>
<p style="text-align: center;"><a href="http://blog.oxiane.com/wp-content/uploads/2012/01/linearlayout.png" rel="lightbox[2642]"><img class="aligncenter size-medium wp-image-2766" title="linearlayout" src="http://blog.oxiane.com/wp-content/uploads/2012/01/linearlayout-300x187.png" alt="" width="300" height="187" /></a><a href="http://blog.oxiane.com/wp-content/uploads/2012/01/gridlayout1.png" rel="lightbox[2642]"><img class="aligncenter size-medium wp-image-2768" title="gridlayout1" src="http://blog.oxiane.com/wp-content/uploads/2012/01/gridlayout1-300x187.png" alt="" width="300" height="187" /></a></p>
<h2>(Android Open Source Project)</h2>
<p><a href="http://twitter.com/madCdan">Daniel Fages</a> est expert en construction de ROM Android, c’est lui qui a présenté le deuxième thème de la soirée, ASOP. D’abord pourquoi compiler Android ? Pour l&#8217;adapter à un usage spécifique, pour trouver d’éventuelles failles de sécurité, ou par simple curiosité. Le matériel nécessaire n’est pas à la portée de tout le monde, 16 Go RAM pour une durée de compilation de 30 minutes. Très peu de développeurs poussent leur audace aussi loin. En plus de la difficulté de maitriser la programmation système avec C/C++ il y a l’obstacle de la nature de la licence Apache et l&#8217;absence de communication de Google sur les orientations futures de son OS mobile.</p>
<p>Pour revivre la soirée avec beaucoup plus de détails <a href="http://www.paug.fr/2012/01/slides-et-video-android-4-aosp-par-leo.html">les slides et les vidéos</a> sont disponibles en ligne.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oxiane.com/2012/01/24/soiree-paug-de-janvier-2012-icescream-sandwich-asop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La combinaison de LoaderManager et MediaStore.Audio sous Android</title>
		<link>http://blog.oxiane.com/2012/01/23/la-combinaison-de-loadermanager-et-mediastore-audio-sous-android/</link>
		<comments>http://blog.oxiane.com/2012/01/23/la-combinaison-de-loadermanager-et-mediastore-audio-sous-android/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 16:25:57 +0000</pubDate>
		<dc:creator>shocq</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[asynctask]]></category>
		<category><![CDATA[contentprovider]]></category>
		<category><![CDATA[loader]]></category>
		<category><![CDATA[mediastore]]></category>

		<guid isPermaLink="false">http://blog.oxiane.com/?p=2616</guid>
		<description><![CDATA[Bonjour, Je vais vous parler de deux sujets dans cet article : - comment récupérer les informations concernant la musique stockée sur un téléphone android - comment gérer un chargement en tâche de fond avec les Loader Obtenir des informations sur vos fichiers musicaux : Le framework android procède un ContentProvider qui fourni des informations [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Je vais vous parler de deux sujets dans cet article :<br />
-	comment récupérer les informations concernant la musique stockée sur un téléphone android<br />
-	comment gérer un chargement en tâche de fond avec les Loader</p>
<h2>Obtenir des informations sur vos fichiers musicaux :</h2>
<p>Le framework android procède un <strong>ContentProvider </strong>qui fourni des informations sur la musique stockée sur l’appareil. Il est donc possible de l’interroger comme n’importe quel autre <strong>ContentProvider</strong>.<br />
Vous trouverez toutes les constantes intéressantes dans les sous classes de <strong>MediaStore.Audio</strong>.<br />
<a href="http://developer.android.com/reference/android/provider/MediaStore.Audio.html ">http://developer.android.com/reference/android/provider/MediaStore.Audio.html </a></p>
<p>Ce qui vous permettra d’avoir des informations sur les playlists, les genres musicaux, les albums, les artistes, etc&#8230;</p>
<p>Par exemple pour obtenir la liste de tous les artistes correspondant à votre musique. Il suffit de faire comme ceci :</p>
<pre class="java" name="code">
public List&lt;String> getArtistsNames(Activity act) {
	ArrayList&lt;String> artists = new ArrayList&lt;String>();

	String[] proj = { MediaStore.Audio.Artists.ARTIST };
	Cursor musicCursor = act.managedQuery(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,proj, null, null, null);

	if(musicCursor.moveToFirst()) {
		do {
			String artistName = musicCursor.getString(0);
			artists.add(artistName);

			if( EtLog.isEnabled()) {
				EtLog.d(TAG,String.format("Identified Artist name is [%s]",artistName));
			}
		}
		while(musicCursor.moveToNext());
	}

	return artists;
}
</pre>
<p><!--more--></p>
<h2>Utiliser le LoaderManager pour gérer la recherche :</h2>
<p>Nous allons utiliser une méthode disponible depuis une <strong>Activity </strong>ou un <strong>Fragment </strong>pour gérer un chargement en tâche de fonds.<br />
Cette API a été ajoutée à partir du SDK 11, c’est à dire la version 3.0 (HoneyComb). Mais heureusement elle est disponible aussi sur les versions antérieures grâce au package de compatibilité dont j’ai déjà fait mention <a href="http://blog.oxiane.com/2011/12/19/utiliser-le-viewpager-pour-slider-dun-ecran-a-un-autre/" title="Utiliser le ViewPager pour slider d’un écran à un autre">dans un article précédant.</a></p>
<p>Il y a plusieurs avantages à utiliser l’ API sur les Loader :<br />
-	Elle gère les chargements des données en asynchrone<br />
-	Elle gère le rafraîchissement des données<br />
-	Elle gère automatiquement le cycle de vie de telle sorte que le Loader n’est pas détruit/reconstruit à chaque changement de configuration</p>
<p>Le dernier point ici (gestion du cycle de vie) est très intéressant, car cela nous affranchit d’une tâche assez périlleuse. Je parle de la gestion d’une tâche asynchrone dans une activité, sans que la tâche soit perturbée par le cycle de vie de l’activité. </p>
<p>La classe LoaderManager est accessible directement depuis une Activity ou un Fragment grâce à la méthode <strong>getLoaderManager()</strong>.</p>
<p>On peut remarquer dans les classes filles de Loader, qu’il existe une implémentation <strong>CursorLoader</strong>. Elle permet donc d’interroger un <strong>ContentProvider </strong>de manière asynchrone.<br />
Il est possible cependant de créer son propre Loader en héritant de <strong>AsyncTaskLoader</strong>.</p>
<p>Pour créer un Loader il faut que votre Activity implémente <strong>LoaderManager.LoaderCallbacks</strong>, vous aurez donc 3 méthodes à implémenter :</p>
<pre class="java" name="code">
public Loader&lt;C> onCreateLoader(int id, Bundle args) ;
public void onLoadFinished(Loader&lt;C> loader, C data);
public void onLoaderReset(Loader&lt;C> loader);
</pre>
<p><strong>onCreateLoader()</strong> ne sera appelé que si un nouveau Loader a besoin d’être créé. Cela n’est pas le cas lors d’un changement d’orientation puisque le LoaderManager se charge de déconnecter et reconnecter le Loader de l’Activity lors d’un changement de configuration.<br />
<strong>onCreateFinished()</strong> : permet de récupérer le résultat d’un chargement.<br />
<strong>onLoaderReset()</strong> est appelé lorsque que l’on quitte l’activité.</p>
<p>La dernière chose à laquelle il faut penser, c’est d’appeler la méthode <strong>initLoader</strong>.</p>
<pre class="java" name="code">
initLoader (int id, Bundle args, LoaderCallbacks&lt;D> callback)
</pre>
<p>Cette méthode ce charge de la création du Loader si besoin.<br />
Vous remarquerez qu’il est possible de passer un id à cette méthode. Celui-ci sert à identifier le loader, car le LoaderManager peut gérer plusieurs loader.<br />
On récupère donc cet identifiant dans la callback <strong>onCreateLoader()</strong>.</p>
<h2>Conclusion :</h2>
<p>Voici un exemple d’utilisation d’un CusorLoader qui affiche la liste des artistes du Téléphone avec le nombre de musique associé à cet artiste.</p>
<p><a href="http://blog.oxiane.com/wp-content/uploads/2012/01/mediaproviderLoader2.png" rel="lightbox[2616]"><img src="http://blog.oxiane.com/wp-content/uploads/2012/01/mediaproviderLoader2-180x300.png" alt="" title="mediaproviderLoader" width="180" height="300" class="aligncenter size-medium wp-image-2625" /></a></p>
<pre class="java" name="code">
public class CursorLoaderListFragment extends ListFragment implements LoaderManager.LoaderCallbacks&lt;Cursor>{
	// Adapter utilisé pour afficher la liste
    SimpleCursorAdapter mAdapter;

    @Override public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // On configure un texte à afficher si il n'y a pas de data
        setEmptyText("No artits music!");

        // On crée un adapter vide (le 3eme paramètre qui doit recevoir un Cursor est null)
        mAdapter = new SimpleCursorAdapter(getActivity(),
                android.R.layout.simple_list_item_2, null,
                new String []{  MediaStore.Audio.Artists.ARTIST , MediaStore.Audio.Artists.NUMBER_OF_ALBUMS},
                new int[] { android.R.id.text1, android.R.id.text2 }, 0);
        setListAdapter(mAdapter);

        // On affiche une progressbar en attendant
        setListShown(false);

        // Prépare le Loader: on se reconnect avec celui existant ou on en cré un nouveau et on le démarre
        getLoaderManager().initLoader(0, null, this);
    }

    // Ce sont sont les colonnes que l'on va recevoir
    static final String[] ARTIST_SUMMARY_PROJECTION = { MediaStore.Audio.Artists._ID, MediaStore.Audio.Artists.ARTIST , MediaStore.Audio.Artists.NUMBER_OF_ALBUMS};

    public Loader&lt;Cursor> onCreateLoader(int id, Bundle args) {
    	//Ceci est applelé lorsqu'on d'un nouveau Loader a besoin d'être créé.
    	//Cet exemple a besoin d'un seul Loader, donc nous ne nous occupons pas de l'ID.
    	//l'ID correspond à celui envoyé dans le 1er argument de la méthode getLoaderManager().initLoader(...)

        String select = null;
        return new CursorLoader(getActivity(), MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
        		ARTIST_SUMMARY_PROJECTION, select, null,
                null);
    }

    public void onLoadFinished(Loader&lt;Cursor> loader, Cursor data) {
    	//On change le Loader associé à l'adapter (Le framework s'occupe de fermer l'ancien Cursor)
        mAdapter.swapCursor(data);

        // On peut afficher la liste maintenant
        if (isResumed()) {
            setListShown(true);
        } else {
            setListShownNoAnimation(true);
        }
    }

    public void onLoaderReset(Loader&lt;Cursor> loader) {

        mAdapter.swapCursor(null);
    }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.oxiane.com/2012/01/23/la-combinaison-de-loadermanager-et-mediastore-audio-sous-android/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sauvegarder simplement en base de données avec ORMLite sous Android</title>
		<link>http://blog.oxiane.com/2012/01/19/sauvegarder-simplement-en-base-de-donnees-avec-ormlite-sous-android/</link>
		<comments>http://blog.oxiane.com/2012/01/19/sauvegarder-simplement-en-base-de-donnees-avec-ormlite-sous-android/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 17:14:39 +0000</pubDate>
		<dc:creator>shocq</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[base de données]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[ormlite]]></category>

		<guid isPermaLink="false">http://blog.oxiane.com/?p=2598</guid>
		<description><![CDATA[Bonjour, Je voudrais vous parler d’une bibliothèque très pratique pour sauvegarder des données dans la base SQLite d’un téléphone Android. Cette bibliothèque s’appelle ORMLite. Je vous ai déjà parlé d’une autre bibliothèque pratique pour faire un parsing JSON : JacksonPaser. Les deux bibliothèques peuvent s’associer parfaitement, ce qui offre un bon socle pour commencer un [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Je voudrais vous parler d’une bibliothèque très pratique pour sauvegarder des données dans la base SQLite d’un téléphone Android. Cette bibliothèque s’appelle ORMLite.</p>
<p>Je vous ai déjà parlé d’une autre bibliothèque pratique pour faire un parsing JSON : JacksonPaser.<br />
Les deux bibliothèques peuvent s’associer parfaitement, ce qui offre un bon socle pour commencer un projet Android.</p>
<p>Ormlite supporte les connections JDBC à MySQL, Postgres, H2, SQLite, Derby,<br />
HSQLDB, Microsoft SQL Server.<br />
Mais ce qui nous intéresse ici c’est qu’ORMLite supporte les appels natifs à la base de données SQLite sous Android.</p>
<p>Si vous avez déjà essayé de faire de la sauvegarde en base sous android, vous vous êtes sûrement aperçu combien c’est fastidieux.<br />
Personnellement je ne trouve pas cela très pratique. Je préfère utiliser un ORM (Object Relational Mapping) qui fait un mapping entre mes objets métier et les enregistrements en base de données.</p>
<p>Certes on peut avoir des dégradations de performances, mais au vu du confort apporté au niveau de la programmation, le choix est vite fait.</p>
<h4>Installation</h4>
<p>Il faudra télécharger 2 fichiers jar, les déposer dans un répertoire lib et les ajouter dans le CLASSPATH.<br />
Vous trouverez les 2 fichiers suivant ici <a href="http://ormlite.com/releases/">http://ormlite.com/releases/</a></p>
<p> &#8211; ormlite-android-X.XX.jar<br />
 &#8211; ormlite-core-X.XX.jar<br />
<!--more--></p>
<h1>Les Annotations</h1>
<p>Pour configurer le mapping objet on utilise des annotations.<br />
Les annotations principales sont :<br />
- @<strong>DatabaseTable</strong><br />
- <strong>@DatabaseField</strong></p>
<p>L’annotation <strong>@DatabaseTable</strong> se dépose devant la déclaration d’une classe métier, et prend en paramètre le nom de table sur laquelle on veut faire le mapping.</p>
<pre class="xml" name="code">
@DatabaseTable(tableName = "le_nom_de_ma_table")
</pre>
<p>L’annotation <strong>@DatabaseField</strong> permet de configurer le mapping entre une colonne d’une table SQL, et le membre d’une classe.<br />
@DatabaseField peut prendre plusieurs paramètres :</p>
<ul>
<li><strong>columnName=   &laquo;&nbsp;le_nom_de_ma_colonne&nbsp;&raquo;</strong> indique le nom de la colonne sur laquelle on fait le mapping</li>
<li><strong>generatedId = true/false</strong> : indique que le membre de la classe se correspond à un champ index auto-incrémenté</li>
<li><strong>canBeNull = true/false</strong> : indique si champ peut être null, et permet de générer des exceptions</li>
<li><strong>defaultValue = &laquo;&nbsp;0&#8243;</strong> : indique une valeur par défaut si le membre n’a pas été affecté avant l’enregistrement en base de l’objet.</li>
<li><strong>unique = true</strong> pour définir une colonne UNIQUE</li>
<li><strong>uniqueIndexName = &laquo;&nbsp;mon_ensemble_unique&nbsp;&raquo;</strong> permet de déclarer qu’un ensemble de membres est unique. C’est utile si on dépose l’annotation au moins sur 2 membres de la classe</li>
</ul>
<p>Voici un exemple de classe métier annoté:</p>
<pre class="java" name="code">
@DatabaseTable(tableName = "category")
public class Category extends DataEnveloppe implements Parcelable{

	public static final String   COLUMN_CATID         = "catID";

	@DatabaseField(generatedId=true)
	private int mRowid;

	@DatabaseField(columnName = COLUMN_CATID, canBeNull=false)
	private String mCatID;

	@DatabaseField(columnName = "title", canBeNull=false)
	private String mTitle;
....
}
</pre>
<h4>Implémentation de  OrmLiteSqliteOpenHelper</h4>
<p>Vous aurez besoin de créer une classe qui hérite de  OrmLiteSqliteOpenHelper.<br />
Cette classe gère la création de la base à la première exécution, et gère la migration de la base lors des mises à jour de l’application.</p>
<p>Pour faire cette gestion, des callback sont appelés automatiquement, il faut implémenter les deux méthodes suivantes:<br />
- onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource<br />
connectionSource)</p>
<p>- onUpgrade(SQLiteDatabase database, ConnectionSource<br />
connectionSource, int oldVersion, int newVersion).</p>
<p>Pour créer les tables, il suffit d’appeler une méthode utilitaire qui va créer pour nous la table associé à une classe ; à condition d’avoir mis les annotations sur cette classe.</p>
<p>Par exemple :</p>
<pre class="java" name="code">
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

	...
	@Override
	public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
		try {
			EtLog.d(TAG, "Tables created in %s", DATABASE_NAME);
			TableUtils.createTable(connectionSource, Category.class);
			TableUtils.createTable(connectionSource, MonObjetMetier.class);

		} catch (SQLException e) {
			Log.e(TAG, "Can't create database", e);
			throw new RuntimeException(e);
		}
	}
	...
</pre>
<p>Pour gérer la mise à jour voici un exemple d’implémentation. Attention dans cet exemple, on va supprimer la table et la recréer. Ce n’est pas toujours ce que l’on veut faire. Si on veut garder les données de l’application lors de la mise à jour, il faudra implémenter un algorithme de migration des données.</p>
<pre class="java" name="code">
	@Override
	public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource,
		int oldVersion, int newVersion) {
		try {
			TableUtils.dropTable(connectionSource, Category.class, true);
			onCreate(db);
		} catch (SQLException e) {
			Log.e(TAG, "Impossible to drop database", e);
			throw new RuntimeException(e);
		}
	}
</pre>
<h4>Obtenir une instance de OpenHelperManager</h4>
<p>Afin d’éviter d’ouvrir plusieurs connections simultanément à la même base, nous allons utiliser la classe <strong>OpenHelperManager </strong> qui va surveiller les utilisations du <strong>Helper</strong>.<br />
Pour avoir un accès à une instance de <strong>OpenHelperManager </strong> il faut appeler <strong>getHelper()</strong> dans vos activités.<br />
Pour avoir accès à cette méthode cela implique que vos activités doivent hériter de OrmLiteBaseActivity, OrmLiteBaseListActivity, OrmLiteBaseService, ou OrmLiteBaseTabActivity.</p>
<p>Cet héritage obligatoire peut être très contraignant. Notamment si vous utilisez une autre bibliothèque qui, elle aussi, demande à vos activités d’hériter d’une certaine classe.<br />
Pour éviter de se retrouver bloqué ainsi, je vous conseille d’utiliser une autre méthode.<br />
Il est possible de déclarer une classe comme <strong>OrmLiteSqliteOpenHelper </strong> avec la méthode statique suivante.</p>
<pre class="java" name="code">
setOpenHelperClass(Class<? extends OrmLiteSqliteOpenHelper> openHelperClass)
</pre>
<p>Il est nécessaire d’appeler cette méthode le plus tôt possible dans votre application, ainsi je recommande de le faire dans le onCreate() de votre classe Application.</p>
<p><strong>Rappel:</strong><br />
Si vous ne le savez pas, il est possible d’avoir une instance qui représente le contexte de votre application. Il faut créer une classe qui hérite de Application et déclarer cette classe dans le manifeste. Je vous conseille de créer cette classe sous la forme d’un singleton.</p>
<pre class="xml" name="code">
    <application
        android:debuggable="true"
        android:label="@string/app_name"
        android:name=".MonApplication"
        android:theme="@style/CultureBE" >
...
</application>
</pre>
<p>Pensez à créer un assesseur pour obtenir l’instance au Helper il sera fournir par un appel à <strong>OpenHelperManager.getHelper()</strong></p>
<p>Voilà ce que ça donne au niveau du code :</p>
<pre class="xml" name="code">
	private static MonApplication mInstance;
	private OrmLiteSqliteOpenHelper mOrmLiteHelper;

	@Override
	public void onCreate() {
		super.onCreate();
		mInstance = this;
        DataManager.getInstance().setApplicationContext(this);
        PreferencesManager.getInstance().setApplicationContext(this);
        FaceBookUtils.initContext(this);
        initData();
	}

	public static MonApplication getInstance() {
		return mInstance;
	}

	private void initData() {
        DataManager.getInstance().setOpenHelperClass(DatabaseHelper.class);
	}

	public OrmLiteSqliteOpenHelper getHelper() {

        if(mOrmLiteHelper == null) {
            mOrmLiteHelper = OpenHelperManager.getHelper(this);
        }
        return mOrmLiteHelper;
    }

	@Override
	public void onTerminate() {
		super.onTerminate();
		if (mOrmLiteHelper != null) {
			OpenHelperManager.releaseHelper();
		}
	}
</pre>
<h4>Sauvegarder un objet métier</h4>
<p>Ensuite pour faire un enregistrement d’une entité d’un objet métier, il suffit d’appeler la méthode save() que l’on aura implémenté comme ci-dessous dans notre classe métier :<br />
Notez que c’est la même méthode pour un update ou un create .</p>
<pre class="java" name="code">
	protected void save() throws SQLException {
		OrmLiteSqliteOpenHelper helper = getHelper();
		if (helper instanceof DatabaseHelper) {
			DatabaseHelper absHelper = (DatabaseHelper) helper;
			@SuppressWarnings("unchecked")
			Dao< MonObjetMetier, String> dao = (Dao< MonObjetMetier, String>) absHelper
					.getDao(getClass());
			dao.createOrUpdate(this);
		} else {
			Log.e("",
					"Object not created nor updated! Your Helper must inherit from AbstractDatabaseHelper.");
		}
	}
</pre>
<h4>Et pour faire un select </h4>
<p>Depuis l’objet  Dao on appelle la méthode <strong>queryBuilder()</strong> pour obtenir un <strong>QueryBuilder </strong>;<br />
Ensuite il existe plusieurs méthodes utiles pour ajouter une clause WHERE, un LIMIT ou un ORDER BY.</p>
<p>Pour construite une clause WHERE il faudra utiliser également les méthodes disponibles depuis l’objet <strong>Where </strong>comme dans l’exemple ci-dessous.</p>
<pre class="java" name="code">
public List<Category> getListCategoryFromDb() {
	List<Category> categoryListFromCache = new ArrayList<Category>();
	try {

		QueryBuilder<Category, String> queryBuilder = getDao().queryBuilder();

		@SuppressWarnings("rawtypes")
		Where where = queryBuilder.where();
		where.eq(Category.COLUMN_SUB_CAT, "1"); // Categorie de niveau 1

		PreparedQuery<Category> preparedQuery = queryBuilder.prepare();
		categoryListFromCache = getDao().query(preparedQuery);
		setList(categoryListFromCache);
	} catch (Exception e) {
		// TODO: handle exception
	}
	return categoryListFromCache;
}
</pre>
<h4>Conclusion</h4>
<p>Avec cette bibliothèque, une fois la classe <strong>OrmLiteSqliteOpenHelper </strong>implémentée, il  ne vous reste plus beaucoup de lignes de code à écrire pour faire de l’enregistrement en base de donnée.<br />
La méthode save() peut même être unifiée dans une classe parente de toutes vos classes métier(que vous avez besoin d’enregistrer en base).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oxiane.com/2012/01/19/sauvegarder-simplement-en-base-de-donnees-avec-ormlite-sous-android/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Jackson : Une librairie pratique pour parser un flux JSON sous android</title>
		<link>http://blog.oxiane.com/2012/01/19/jackson-une-librairie-pratique-pour-parser-un-flux-json-sous-android/</link>
		<comments>http://blog.oxiane.com/2012/01/19/jackson-une-librairie-pratique-pour-parser-un-flux-json-sous-android/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 08:56:06 +0000</pubDate>
		<dc:creator>shocq</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[jackson]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[objet]]></category>
		<category><![CDATA[serialiser]]></category>

		<guid isPermaLink="false">http://blog.oxiane.com/?p=2589</guid>
		<description><![CDATA[Bonjour, Je vais vous parler d’une librairie très pratique dans les projets Android, lorsque vous avez besoin d’interroger des services JSON. Cette librairie permet de transformer (on dit dé-sérialiser) le flux JSON en objet métier. On verra à la fin de cet article que l’on peut même faire l’inverse : c’est à dire transformer (dans [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Je vais vous parler d’une librairie très pratique dans les projets Android, lorsque vous avez besoin  d’interroger des services JSON.</p>
<p>Cette librairie permet de transformer (on dit dé-sérialiser) le flux JSON en objet métier.<br />
On verra à la fin de cet article que l’on peut même faire l’inverse : c’est à dire transformer (dans ce cas on dit sérialiser) un objet métier en flux JSON. </p>
<p>Cette librairie s’appelle JacksonParser. Elle peut s’utiliser sur Android mais aussi dans  projet JAVA standard.<br />
Il existe évidemment d’autres librairies mais les avantages de JacksonParser sont :<br />
  &#8211; sa vélocité<br />
  &#8211; ses possibilités de configuration<br />
  &#8211; c’est open-source</p>
<p>Un petit rappel sur ce qu’est JSON:<br />
JSON est un format d’échange de données,<br />
 &#8211; facile à écrire et à lire<br />
 &#8211; c’est un format léger<br />
 &#8211; facilement analysable par un programme</p>
<p>Je vous invite à vous rendre ici : <a href="http://jackson.codehaus.org/ ">http://jackson.codehaus.org/ </a></p>
<p>et à télécharger<br />
 &#8211; jackson-core-asl-X.X.X.jar<br />
 &#8211; jackson-mapper-asl-X.X.X.jar</p>
<p>Une fois ceci fait il faut inclure les 2 fichiers jar dans votre projet et les ajouter au CLASSPATH.</p>
<p>Ensuite je vous conseille de construire vos objets métiers en fonction de la structure du flux JSON que vous lisez.</p>
<p>Voici l’exemple d’un flux JSON</p>
<pre class="json" name="code">
{
	"typeList": "",
	"collabo": [
		{
			"nom": "Abdennadher", "prenom": "Walid"
		},
		{
			"nom": "Hocq", 	"prenom": "Sylvain"
		}

	]
}
</pre>
<p><!--more--><br />
Et voici comment j’ai créé mes objets métiers pour ce flux.</p>
<pre class="java" name="code">
public class CollaborateurList {
	private List<Collabo> listCollabo;

	public List<Collabo> getListCollabo() {
		return listCollabo;
	}

	@JsonProperty("collabo")
	public void setListCollabo(List<Collabo> listCollabo) {
		this.listCollabo = listCollabo;
}} 

public class Collabo {
	String nom;
	@JsonProperty("prenom")
String prenom;

	@JsonProperty("nom")
	public void setNom(String nom) {  this.nom = nom; }

}
</pre>
<p>Le mapping entre flux JSON et objet métier, se configure à l’aide d’annotations.<br />
Ici j’utilise uniquement l’annotation <strong>@JsonProperty</strong>.<br />
Si vous avez bien regardé l’exemple ci-dessus, vous remarquerez que l’on peut poser ces annotations sur des setters mais aussi directement sur des propriétés (voir la propriété prénom ).</p>
<p>L’avantage de passer par des setters, c’est de pouvoir faire des conversions, par exemple: convertir une chaîne de caractères en date avant d&#8217;affecter un attribut de l’objet. Le désavantage c’est que c’est un peu plus verbeux…</p>
<p>Une fois les classes métier créées et configurées, il faut créer un objet <strong>ObjectMapper</strong> comme ceci :</p>
<pre class="java" name="code">
	private static ObjectMapper sMapper = new ObjectMapper();
	static {
		sMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
	}
</pre>
<p>Ici on configure le mapper pour qu’il ignore les propriétés sur lesquelles on n’a pas configuré de mapping. Sans cela on aurait une erreur.</p>
<p>Ensuite il n’y a plus qu’à appeler la méthode <strong>readValue </strong>avec le flux en paramètre et le type d’objet attendu.</p>
<pre class="java" name="code">
String collaboJson = "";
CollaborateurList collaboList = null;
try {
	collaboJson = StreamUtils.inputStreamToString(getAssets().open("collabo.json"));
	collaboList = sMapper.readValue(collaboJson,CollaborateurList.class);
} catch (JsonParseException e) {
	e.printStackTrace();
} 
</pre>
<h1>Remarque sur le type de retour</h1>
<p>Dans notre exemple le flux commence par une structure c’est à dire une accolade  {<br />
Il faut dans ce cas spécifier le type de retour attendu :  ici CollaborateurList.class</p>
<p>Si on a un flux commençant directement par un tableau c’est à dire par un [<br />
Par exemple avec le flux suivant :</p>
<pre class="java" name="code">
[
		{
			"nom": "Abdennadher", "prenom": "Walid"
		},
		{
			"nom": "Hocq", 	"prenom": "Sylvain"
		}

]
</pre>
<p>Dans ce cas on peut utiliser la manière suivante pour faire l’appel à readValue() :</p>
<pre class="java" name="code">
List<Collabo>list = sMapper.readValue(collaboJson, new TypeReference<ArrayList<Collabo>>() { });
</pre>
<h1>Et si on veut sérialiser...</h1>
<p>Il est possible que vous souhaitiez faire le traitement inverse. Par exemple si vous avez déjà des instances d’objets métiers et que vous souhaitez les convertir en une chaîne JSON, pour par exemple les envoyer dans une requête HTTP POST.<br />
Et bien dans ce cas, il suffit d’appeler la méthode <strong>writeValueAsString</strong>.</p>
<pre class="java" name="code">
String json = sMapper.writeValueAsString(collaboList);
</pre>
<p>Dans ce cas il n’y a pas de complication, si l’objet à sérialiser est une liste d’objet métier ou une structure d’objet métier.</p>
<p>Si vous désirez utiliser des annotations sur des méthodes plutôt que sur des attributs (pour faire une transformation en amont par exemple). Il faudra, dans ce cas, déposer des annotations sur les getters.</p>
<h1>Résumé :</h1>
<p>Un petit résumé pour bien comprendre quand utiliser des getters et setters.<br />
Avant tout, cela est nécessaire uniquement si vous avez besoin de faire une transformation, par exemple convertir une chaîne de caractères en type Date.</p>
<p>Si c’est le cas, il faut bien comprendre ceci: pour <strong>sérialiser</strong>, le parser à besoin de <strong>récupérer </strong> les propriétés des objets métier, donc il utilise les getters, donc il faut annoter les getters.<br />
Et pour dé-sérialiser, le parser à besoin d’<strong>affecter</strong> les propriétés des objets métiers, donc  il utilise les <strong>setters</strong>, qu’il faut annoter.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oxiane.com/2012/01/19/jackson-une-librairie-pratique-pour-parser-un-flux-json-sous-android/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Quand l&#8217;implication n&#8217;est pas si logique</title>
		<link>http://blog.oxiane.com/2012/01/18/quand-limplication-nest-pas-si-logique/</link>
		<comments>http://blog.oxiane.com/2012/01/18/quand-limplication-nest-pas-si-logique/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 08:53:37 +0000</pubDate>
		<dc:creator>Jean-Francois Lefevre</dc:creator>
				<category><![CDATA[Opinions]]></category>
		<category><![CDATA[Communication]]></category>
		<category><![CDATA[Logique]]></category>

		<guid isPermaLink="false">http://blog.oxiane.com/?p=2584</guid>
		<description><![CDATA[Je fais généralement attention à ne pas utiliser de jargon dans mes communications, en particulier par mail, mais le jargon se cache parfois où on ne l&#8217;attend pas. J&#8217;en ai fais l&#8217;expérience hier, un moment où l&#8217;on se repasse mentalement tous ses mails des 20 dernières années. Ainsi, il m&#8217;arrive très souvent d&#8217;écrire des choses [...]]]></description>
			<content:encoded><![CDATA[<p>Je fais généralement attention à ne pas utiliser de jargon dans mes communications, en particulier par mail, mais le jargon se cache parfois où on ne l&#8217;attend pas.</p>
<p>J&#8217;en ai fais l&#8217;expérience hier, un moment où l&#8217;on se repasse mentalement tous ses mails des 20 dernières années.</p>
<p>Ainsi, il m&#8217;arrive très souvent d&#8217;écrire des choses comme :</p>
<p>&laquo;&nbsp;préparation du cours => je ne viendrai pas sur paris la semaine prochaine&nbsp;&raquo;</p>
<p>J&#8217;ai découvert hier que le symbole &laquo;&nbsp;=>&nbsp;&raquo; n&#8217;est pas nécessairement compris comme l&#8217;implication logique par tout le monde.<br />
Quand on relis ce que j&#8217;ai écris en traduisant le &laquo;&nbsp;=>&nbsp;&raquo; comme une simple version plus esthétique de la flèche &laquo;&nbsp;->&nbsp;&raquo; ou par &laquo;&nbsp;faire&nbsp;&raquo; ça devient effectivement peu logique.</p>
<p>&laquo;&nbsp;préparation du cours : faire : je ne viendrai pas sur paris la semaine prochaine&nbsp;&raquo; ça ne veut rien dire.</p>
<p>En discutant un peu, on se rend compte que certains traduisent ce symbole par &laquo;&nbsp;donc, conséquence, &#8230;&nbsp;&raquo; mais effectivement l&#8217;implication logique ça relève plutôt des études informatiques (ou peut-être en philosophie).</p>
<p>Dorénavant, je ferai bien plus attention quand j&#8217;écrirai mes mails.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oxiane.com/2012/01/18/quand-limplication-nest-pas-si-logique/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>iOS &amp; Modal Partial Curl &amp; SQLite</title>
		<link>http://blog.oxiane.com/2012/01/10/ios-modal-partial-curl-sqlite/</link>
		<comments>http://blog.oxiane.com/2012/01/10/ios-modal-partial-curl-sqlite/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 15:27:05 +0000</pubDate>
		<dc:creator>Manuel François</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://blog.oxiane.com/?p=2580</guid>
		<description><![CDATA[Pour poursuivre avec mon précédent billet (ici), j&#8217;ai eu l&#8217;envie de tester SQLite avec iOS. Qu&#8217;est-ce que SQLite ? En gros, c&#8217;est une base de données légère intégrée au programme stockée dans un fichier. Plus d&#8217;informations sur le site officiel et sur wikipedia. L&#8217;intérêt est donc d&#8217;avoir peu de données à mettre dans notre base [...]]]></description>
			<content:encoded><![CDATA[<p>Pour poursuivre avec mon précédent billet (<a title="ici" href="http://blog.oxiane.com/2011/12/29/ios-modal-partial-curl/">ici</a>), j&#8217;ai eu l&#8217;envie de tester SQLite avec iOS.</p>
<p>Qu&#8217;est-ce que SQLite ?</p>
<p>En gros, c&#8217;est une base de données légère intégrée au programme stockée dans un fichier.</p>
<p>Plus d&#8217;informations sur le <a title="site officiel" href="http://www.sqlite.org/">site officiel</a> et sur <a title="wikipedia" href="http://fr.wikipedia.org/wiki/SQLite">wikipedia</a>.</p>
<p>L&#8217;intérêt est donc d&#8217;avoir peu de données à mettre dans notre base embarquée car une app trop lourde est souvent rédhibitoire pour une installation sur iPhone.</p>
<p>Je conseillerai de ne pas dépasser les 100 ko pour rester cohérent.</p>
<p>Comment fait-on alors ?<!--more--></p>
<p>Et bien par chance, SQLite est déjà installée sous Mac !</p>
<p>Pour vérifier, tapez dans le terminal :</p>
<p><code>sqlite3 -version</code></p>
<p>Nous allons donc créer une base de données <strong>tuto.db</strong> avec une table <em>Objet</em> ayant pour champs <em>num</em> et <em>forme</em>, toujours dans le terminal :</p>
<p><code>sqlite3 tuto.db</code></p>
<p>puis</p>
<p>Si vous voulez encore vous amusez avec SQLite, tapez <code>.help</code> pour afficher les commandes sinon tapez <code>.quit</code> ou <code>.exit</code>.</p>
<p>Et voilà, nous avons un joli fichier <strong>tuto.db</strong> à l&#8217;endroit où vous avez ouvert le terminal (généralement votre répertoire personnel).</p>
<p>Ouvrez votre projet PageTrick (cf lien plus haut) et glissez/déposez-y votre fichier.<br />
Ajoutez-y également la bibliothèque <strong>libsqlite3.0.dylib</strong> :<br />
- cliquez sur votre projet dans le menu contextuel<br />
- cliquez sur <em>Targets</em> puis sur <em>Build Phases</em><br />
- cliquez sur le <strong>+</strong> du sous-menu <em>Link Binaries With Library</em><br />
- dans la barre de recherche tapez <em>libsqlite</em><br />
- déroulez les résultats vous devriez avoir <strong>libsqlite3.0.dylib</strong> (ne vous trompez pas il y en a deux, l&#8217;autre c&#8217;est <em>libsqlite3.dylib</em>)<br />
- c&#8217;est bon !</p>
<p>Génial et maintenant comment s&#8217;en sert-on ? C&#8217;est à ce moment que l&#8217;on doit faire un choix, en effet SQLite étant une bibliothèque écrite en C, il va falloir insérer des appels de fonction C dans notre joli code Objective-C&#8230; pas glop (personnellement) MAIS on peut utiliser un petit framework (2 classes) créer par <a title="Th30z" href="http://th30z.blogspot.com/">Th30z</a> et disponible sur <a title="ici" href="https://github.com/matteobertozzi/blog-code/blob/master/zips/iphone-testsqlite.zip">GitHub</a>.</p>
<p>Dézippez l&#8217;archive et glissez/déposez <em>Sqlite.h</em> et <em>Sqlite.m</em> dans votre projet.</p>
<p>Attention si vous êtes dans un projet avec ARC (Automatic Reference Counting) activé &#8211; il faut modifier un peu le Sqlite.m mais c&#8217;est trois fois rien :<br />
- supprimez tous les <em>autorelease</em>, <em>retain</em>, <em>release</em> qui traînent<br />
- remplacez la ligne 32 par : </p>
<p>Plus de détails sur ce cast <a title="ici" href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html#objects.operands.casts">sur clang.llvm.org</a>.</p>
<p>Maintenant vous pouvez utiliser l&#8217;objet <code>Sqlite</code> dans votre code.</p>
<p>Dans votre storyboard, déposer un UITableViewController et faîtes un segue depuis un bouton &laquo;&nbsp;clickSQLite&nbsp;&raquo; (le sosie du bouton &laquo;&nbsp;click&nbsp;&raquo; du PageTrickController) vers lui et n&#8217;oubliez pas de donner un identifiant au segue.</p>
<p>Voici ce que vous devriez avoir modulo les préférences esthétiques de chacun :</p>
<p><a href="http://blog.oxiane.com/wp-content/uploads/2012/01/tableCurlAndCo.png" rel="lightbox[2580]"><img style="float:none;" class="size-medium wp-image-2763" title="tableCurlAndCo" src="http://blog.oxiane.com/wp-content/uploads/2012/01/tableCurlAndCo-241x300.png" alt="" width="241" height="300" /></a></p>
<p>Créez une nouvelle classe (UIViewController class) héritant de <em>UITableViewController</em> et appelez la <em>TablePageCurlController</em> par exemple.</p>
<p>Ensuite on reprend le même principe de délégation vu dans mon billet précédent sauf que l&#8217;on va créer un fichier pour le protocole genre <em>PageCurlDelegate.h</em> :</p>
<p>on n&#8217;oublie pas de synthétiser !</p>
<p>on complète les méthodes de notre contrôleur :</p>
<p>puis dans PageTrickController, on ajoute une propriété <code>tablePage</code> de type <code>TablePageCurlController</code> et on modifie :</p>
<p>Alors heureux ?<br />
&laquo;&nbsp;Aaaargh mais nan, on ne voit pas la tableView !!!!&nbsp;&raquo;</p>
<p>Ah oui, c&#8217;est vrai la <em>tableView</em> est en partie masquée par l&#8217;animation et du coup c&#8217;est moche.<br />
Rajoutez ceci dans le <em>viewDidAppear</em> de votre <em>TablePageCurlController</em> :</p>
<p>Et voilà deux belles animations pour le prix d&#8217;une !</p>
<p><video width="640" height="480" controls="controls"><source src="http://blog.oxiane.com/wp-content/uploads/2012/01/TablePageTrick.mov" type="video/mp4" /><source src="http://blog.oxiane.com/wp-content/uploads/2012/01/TablePageTrick.ogg" type="video/ogg" /><br />
PageTrick<br />
PageTrick</video></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oxiane.com/2012/01/10/ios-modal-partial-curl-sqlite/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://blog.oxiane.com/wp-content/uploads/2012/01/TablePageTrick.mov" length="980123" type="video/quicktime" />
<enclosure url="http://blog.oxiane.com/wp-content/uploads/2012/01/TablePageTrick.ogg" length="761535" type="audio/ogg" />
		</item>
		<item>
		<title>Comment avoir un émulateur Android performant?</title>
		<link>http://blog.oxiane.com/2012/01/03/comment-avoir-un-emulateur-android-performant/</link>
		<comments>http://blog.oxiane.com/2012/01/03/comment-avoir-un-emulateur-android-performant/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 15:11:40 +0000</pubDate>
		<dc:creator>shocq</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[émulateur]]></category>
		<category><![CDATA[performances]]></category>

		<guid isPermaLink="false">http://blog.oxiane.com/?p=2483</guid>
		<description><![CDATA[Bonjour, Si vous avez déjà essayé de créer une application sans avoir de machine android physique, vous avez certainement dû éprouver quelques frustrations face à la lenteur de l’émulateur android proposé de base avec le SDK Android. Si c’est vrai pour faire du développement sur Android 2.x, ça l’est encore plus sur tablette. L’émulateur HoneyComb [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Si vous avez déjà essayé de créer une application sans avoir de machine android physique, vous avez certainement dû éprouver quelques frustrations face à la lenteur de l’émulateur android proposé de base avec le SDK Android.<br />
Si c’est vrai pour faire du développement sur Android 2.x, ça l’est encore plus sur tablette.<br />
L’émulateur HoneyComb est inutilisable, ça rame énormément même avec un corei7, et 8Go de RAM…</p>
<p>En fait le problème c’est que l’émulateur reproduit le comportement d’un processeur ARM, or les PC ont des architectures X86. Sur Apple il n’y a pas de problème car l’iPhone et l’iMac possèdent la même architecture, donc pas besoin de reproduire le comportement du processeur puisque que c’est le même. On parle dans ce cas de simulateur et non plus d’émulateur.<br />
Définition et comparaison wikipédia ici : <a href="http://fr.wikipedia.org/wiki/%C3%89mulation">http://fr.wikipedia.org/wiki/%C3%89mulation</a>.</p>
<p>Heureusement il existe un portage d’android, vers des architectures X86.  <a href="http://www.android-x86.org/"></a></p>
<p>Ainsi il est possible d’installer android directement sur un PC avec des archi X86. Sur le site ont retrouve les versions d’android 2.3, 3.0 et même 4.0 en développement.<br />
Chacune de ces versions est déclinée en plusieurs types d’archi : eeepc, AMD brazos, asus laptop, tega v2.</p>
<p>Le but pour nous, c’est d’avoir l’équivalent d’un émulateur HoneyComb, on va donc installer une de ces versions sur une machine virtuelle. On utilisera VirtualBox :<br />
<a href="https://www.virtualbox.org/wiki/Downloads">https://www.virtualbox.org/wiki/Downloads</a></p>
<p>Voilà donc comment procéder pour installer une machine virtuelle qui tourne sous android.</p>
<h3>1. Installer VirtualBox</h3>
<h3>2. Créer une machine virtuelle :</h3>
<p>On lui configurera 1Go de RAM, un disque dur (2ou 3 Go devraient suffire), une mémoire video de 8mo(c’est la valeur par défaut), et une carte réseau de type PCnet-FAST III avec un accès par pont.</p>
<h3>3. Je vous conseille, si vous pouvez, d’utiliser 2 souris</h3>
<p> (dont une dédiée à la machine virtuelle). En effet j’ai l’impression que la gestion de la souris et moins bien gérée que pour les autres systèmes…<br />
Dans l’onglet USB, ajoutez un filtre depuis un périphérique et ajoutez-lui une des 2 souris.</p>
<p><a href="http://blog.oxiane.com/wp-content/uploads/2012/01/1.jpg" rel="lightbox[2483]"><img src="http://blog.oxiane.com/wp-content/uploads/2012/01/1.jpg" alt="" title="Paramètre VirtualBox USB MOUSE" width="668" height="488" class="aligncenter size-full wp-image-2487" /></a></p>
<h3>4.	Ajouter l’iso que vous avez télécharger depuis le site Android-X86,</h3>
<p> dans le lecteur CD de la machine virtuelle.<br />
<a href="https://www.virtualbox.org/wiki/Downloads">https://www.virtualbox.org/wiki/Downloads</a><br />
Je vous conseille de prendre la version eeepc. Dans mon cas pour avoir un HoneyComb, j’ai pris la version : android-x86-3.2-RC2-eeepc.iso<br />
<a href="http://blog.oxiane.com/wp-content/uploads/2012/01/2.jpg" rel="lightbox[2483]"><img src="http://blog.oxiane.com/wp-content/uploads/2012/01/2.jpg" alt="" title="Paramètre VirtualBox ISO" width="667" height="429" class="aligncenter size-full wp-image-2490" /></a></p>
<h3>5.	Démarrer la machine,</h3>
<p> lancer l’installation et suivre les étapes.<br />
<a href="http://blog.oxiane.com/wp-content/uploads/2012/01/InstallBootSelect.png" rel="lightbox[2483]"><img src="http://blog.oxiane.com/wp-content/uploads/2012/01/InstallBootSelect.png" alt="" title="InstallBootSelect" width="640" height="480" class="aligncenter size-full wp-image-2491" /></a></p>
<p>Personnellement j’ai formaté le disque en deux partitions, comme sur la plupart des téléphones. Et j’ai créé une carte SD virtuelle comme proposé par l’outil à la dernière étape.</p>
<h3>6.	A la fin de l’installation, avant de redémarrer, pensez à éjecter l’ISO du lecteur CD.</h3>
<h3>7.	Vous remarquerez que le système démarre rapidement et qu’il est super fluide</h3>
<p>. Il est même plus fluide que sur n’importe quelle tablette !!!</p>
<h3>8.	Il faudra configurer le réseau manuellement.</h3>
<p> Pour cela faire un ALT+F1, pour afficher un terminal avec une console.<br />
Récupérer l’adresse IP de votre DNS, à l’aide de la commande
<pre class="shell"  name="code">ipconfig /all</pre>
<p> sur une commande DOS sous windows.<br />
Vérifiez que vous avez bien une interface eth0 à l’aide de la commande </p>
<pre class="shell"  name="code">
# netcfg
</pre>
<p>Si ce n’est pas le cas, alors, il y a un problème dans la configuration de la carte réseau de votre machine virtuelle.</p>
<p>Ensuite taper ces trois commandes (en remplaçant YOUR_DNS_SERVER_IP):</p>
<pre class="shell"  name="code">
# netcfg eth0 up
# dhcpcd
# setprop net.dns1 YOUR_DNS_SERVER_IP
</pre>
<p>La combinaison de touche ALT+F7 permet de retrouver l’interface graphique. Et l’accès Internet devrait fonctionner.</p>
<h2>Les limitations:</h1>
<p>On a quand même quelques contraintes avec cet émulateur.<br />
Certaines ne sont pas très gênantes : on a un clavier qwerty.<br />
D’autres le sont plus : on ne peut pas simuler la rotation de l’écran, c&#8217;est vraiment gênant surtout quand on connaît le système de destruction, re-construction d’une activity.<br />
Sans la gestion de l’orientation, on a pas de moyen facile de tester si on a bien géré le cycle de vie…<br />
Et entre autres, on ne peut pas simuler un GPS, ni des appels téléphoniques.</p>
<p>On voit bien que même avec cette solution, il est quand même préférable d&#8217;utiliser un appareil physique.</p>
<p>Et si Google nous proposait un simulateur android x86, ce ne serait pas une bonne idée ? … Si c’était le cas, ce serat sûrement mieux intégré qu’une VirtualBox, et on n’aurait pas nécessairement besoin d&#8217;une tablette par développeur pour faire des applications HoneyComb ou IceCreamSandwitch.<br />
En plus, rappelez-vous, quand on créé un device Android Virtuelle (AVD), depuis le SDK Tool, Google a prévu un champ pour choisir l’architecture. Ce champ s’appelle CPU/ABI mais on a toujours qu’un seul choix possible…<br />
On peut espérer que Google nous dira « Coming Soon ! » car Intel monte un prototype de smartphone androidX86 en partenariat avec Google…</p>
<p><a href="http://www.01net.com/editorial/551324/intel-montre-un-prototype-de-smartphone-android-x86-sous-medfield/">http://www.01net.com/editorial/551324/intel-montre-un-prototype-de-smartphone-android-x86-sous-medfield/</a></p>
<p><a href="http://www.frandroid.com/actualites-generales/88941_lg-presentera-au-ces-le-premier-smartphone-android-avec-un-processeur-intel/">http://www.frandroid.com/actualites-generales/88941_lg-presentera-au-ces-le-premier-smartphone-android-avec-un-processeur-intel/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.oxiane.com/2012/01/03/comment-avoir-un-emulateur-android-performant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

