<?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>mrm-sama ga miteru v3.0 &#187; android</title>
	<atom:link href="http://www.perry.es/tag/android/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.perry.es</link>
	<description>The sky was the color of television tuned to a dead channel.</description>
	<lastBuildDate>Thu, 09 Feb 2012 22:04:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Configurar el Swype en roms MIUI</title>
		<link>http://www.perry.es/2011/06/09/configurar-el-swype-en-roms-miui/</link>
		<comments>http://www.perry.es/2011/06/09/configurar-el-swype-en-roms-miui/#comments</comments>
		<pubDate>Thu, 09 Jun 2011 09:02:22 +0000</pubDate>
		<dc:creator>mrm</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[miui]]></category>
		<category><![CDATA[swype]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.perry.es/?p=13319</guid>
		<description><![CDATA[Como muchos otros, disfruto de una ROM MIUI para mi Desire HD, concretamente la hecha por los geniales cocineros de MIUI.es. Pero la conjunción con el mejor teclado para Android, el Swype, es bastante puta. Resulta que para licenciar tu copia de Swype se necesita poder desactivar el teclado, y eso MIUI no lo permite. [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-13320" href="http://www.perry.es/2011/06/09/configurar-el-swype-en-roms-miui/banner_dhd1/"><img class="alignleft size-medium wp-image-13320" title="Desire HD con ROM MIUI de MIUI.es" src="http://www.perry.es/extra/uploads/2011/06/Banner_DHD1-e1307606985524.png" alt="" width="189" height="169" /></a>Como muchos otros, disfruto de una ROM <strong>MIUI</strong> para mi Desire HD, concretamente la hecha por los geniales cocineros de <a href="http://miui.es">MIUI.es</a>. Pero la conjunción con el mejor teclado para Android, el <a href="http://www.perry.es/tag/swype/">Swype</a>, es bastante puta.</p>
<p>Resulta que para licenciar tu copia de Swype se necesita poder desactivar el teclado, y eso <strong>MIUI no lo permite</strong>. Se supone que tendríamos que tener una checkbox para hacerlo pero no la hay.</p>
<p><a rel="attachment wp-att-13347" href="http://www.perry.es/2011/06/09/configurar-el-swype-en-roms-miui/what-is-swype/"><img class="alignright size-thumbnail wp-image-13347" title="what-is-swype" src="http://www.perry.es/extra/uploads/2011/06/what-is-swype-e1307607658359-150x150.jpg" alt="" width="150" height="150" /></a>Pero no desesperéis, sí hay una manera. Necesitaremos dos cosas:</p>
<ol>
<li>El instalador de un Swype nuestro, que podéis conseguir gratuitamente en <a href="http://beta.swype.com/">la página de la beta</a>.</li>
<li>La aplicación <a href="https://market.android.com/details?id=com.keramidas.TitaniumBackup&amp;feature=search_result">Titanium Backup</a>.</li>
</ol>
<p>Una vez tengamos ambas cosas, tenemos que seguir unos pocos pasos al pie de la letra (funcionando a día de 9 de Junio del 2011):</p>
<ol>
<li>Si tenemos instalado el Swype con anterioridad, <strong>desinstalarlo</strong>. También desinstalar el Swype Installer.</li>
<li>Bajar el instalador del Swype.</li>
<li>Llegar a cuando se te activa el botón de <strong>Generate License</strong>.</li>
<li>Cuando dice que seleccionemos otro teclado, <strong>seleccionamos uno cualquiera que no sea Swype</strong>.</li>
<li>Llegaremos al punto que dice que desactivemos el Swype, cosa que es lo que no podemos hacer. Aquí <strong>dejamos apretada la tecla HOME hasta que salga la lista de tareas</strong> ejecutándose en ese momento.</li>
<li>Pasamos al Titanium Backup. Allí buscamos en la segunda pestaña de <strong>Copiar/Restaurar</strong>, buscamos el Swype, clickeamos sobre su nombre, y se nos abrirá una ventana modal. En ella, seleccionamos <strong>Copiar</strong>. Una vez realizada la copia, nos dirá que se tiene que cerrar la aplicación. Después seleccionamos <strong>Desinstalar</strong>, en el propio Titanium Backup.</li>
<li>Dejando apretada la tecla <strong>HOME</strong>, <strong>volvemos al instalador</strong> de Swype.</li>
<li>Nos dirá que tiene que <strong>volver a bajar el Swype</strong> (debe ser la misma versión que antes). Lo hacemos. Llegaremos de nuevo al paso 6, pero esta vez <strong>nos saltamos el paso de Copiar, y vamos directamente a Desinstalar</strong>.</li>
<li>Dejando apretada la tecla <strong>HOME</strong>, <strong>volvemos al instalador</strong> de Swype.</li>
<li>Nos pedirá el instalador nuestro login, aceptamos, y <strong>bajamos de nuevo el Swype</strong> (el mismo que todas las anteriores veces).</li>
<li>Esta vez <strong>NO INSTALAMOS LA APLICACIÓN</strong>. Cuando nos salga la notificación de instalar, apretamos la tecla <strong>HOME</strong> y <strong>vamos al Titanium Backup</strong>.</li>
<li><strong>Buscamos el Swype</strong>, que nos saldrá como desinstalado pero con 1 copia de seguridad -la que hicimos antes-, lo seleccionamos y le damos a <strong>Restaurar</strong>.</li>
<li>Dejamos pulsada la tecla <strong>HOME</strong>, volvemos al <strong>instalador del Swype</strong>, <strong>cancelamos la instalación</strong> y presionamos la tecla de Atrás hasta <strong>salir completamente del instalador</strong>, ignorando totalmente cuando ponga &#8220;Generating License&#8230;&#8221;.</li>
<li>Vamos a cualquier aplicación con una cajita de texto, hasta que salga el selector de métodos de entrada. Seleccionamos cualquier teclado que <strong>no sea</strong> el Swype.</li>
<li>Repetimos este paso, y <strong>seleccionamos el Swype</strong> esta vez.</li>
<li>PROFIT.</li>
</ol>
<p>Es un rollazo que te cagas, pero funciona. Espero que os sea útil <img src='http://www.perry.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.perry.es/2011/06/09/configurar-el-swype-en-roms-miui/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Implementar soporte a Emoji en aplicaciones Android</title>
		<link>http://www.perry.es/2011/05/31/implementar-soporte-a-emoji-en-aplicaciones-android/</link>
		<comments>http://www.perry.es/2011/05/31/implementar-soporte-a-emoji-en-aplicaciones-android/#comments</comments>
		<pubDate>Tue, 31 May 2011 11:00:14 +0000</pubDate>
		<dc:creator>mrm</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[emoji]]></category>
		<category><![CDATA[snippets]]></category>

		<guid isPermaLink="false">http://www.perry.es/?p=9996</guid>
		<description><![CDATA[Creo que voy a comenzar explicando primero qué es esto de Emoji a los que no lo sepan, y dar un poco de antecedentes al respecto. Originario de los keitai japoneses, los caracteres emoji vendrían a ser una variante muy arraigada de lo que conocemos por emoticonos. Vaya, sólo hay que fijarse en que los propios [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-9997" title="mobile_gmail_emoji" src="http://www.perry.es/extra/uploads/2011/05/mobile_gmail_emoji.png" alt="" width="252" height="296" />Creo que voy a comenzar explicando primero qué es esto de Emoji a los que no lo sepan, y dar un poco de antecedentes al respecto.</p>
<p>Originario de los keitai japoneses, los caracteres <strong>emoji</strong> vendrían a ser una variante muy arraigada de lo que conocemos por emoticonos. Vaya, sólo hay que fijarse en que los propios emoji han conseguido tener una serie de caracteres propios en el espacio unicode.</p>
<p>Si bien en un principio <a href="http://surf-style.us/manual3.htm">había varias variantes</a> según el fabricante de móviles/operador japos, ahora está bastante estandarizado, al haberse metido por medio nada menos que gigantes como Apple o Google, y la revisión 6 de Unicode los aúna a todos.</p>
<p>Para ver una curiosa comparativa entre Emoji y la conocida Dingbats, podéis echar un vistazo a <a href="http://www.unicode.org/faq/emoji_dingbats.html#4">este artículo</a>.</p>
<p>Pero vamos al lío. Los emoji se han popularizado en occidente por ser una manera de mostrar emoticonos en iOS (iPhone/iPad) de forma fácil, aprovechándose de las características de internacionalización del móvil, y proporcionando un interfaz común a todas las aplicaciones para ello. Por cuestiones de trabajo (&#8230;and again) he tenido que tomar decisiones al respecto de implementar un soporte a emoticonos, y me he decidido por utilizar lo más estándar que hay al respecto, que es emoji. Pero su utilización en Android de la misma manera que en iPhone no es válida, así que me ha tocado ponerme el traje de trabajo y programar una clase que me permita intercalar el texto con las imágenes.</p>
<p>Para empezar, hace falta el pack de imágenes que deberemos meter en <strong>/res/drawable-mdpi/</strong> de nuestro proyecto. Os lo pongo para descargar aquí.<br />
<a href="http://www.perry.es/descargas/Pack+de+im%C3%A1genes+Emoji">Pack de imágenes Emoji</a> 1.0 - 328 hits</p>
<p>Para mapear las imágenes a caracteres utilizo una clase estática que he llamado <strong>EmoticonUtils.java</strong>, y cuyo código os voy a poner aquí. Es sencilla, lo que pasa es que es un poco coñazo porque es meter muchos datos a pelo, ya que la solución elegante (usando reflection) es inviable por lentísima (y ya sabemos que a mayor gasto de CPU en un móvil, mucho mayor consumo de batería).</p>
<p><pre>
package com.mrm.emoji;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map.Entry;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ImageSpan;
import com.mrm.emoji.R;
public class EmoticonUtils {
	public enum Tipo { Smiley, Place, Nature, Event, Symbol };
	private final static HashMap&lt;String, Integer&gt; emoticons = new HashMap&lt;String, Integer&gt;();
	private final static HashMap&lt;String, String[]&gt; categories = new HashMap&lt;String, String[]&gt;();
	 // Vectores de caracteres unicode en formato hex (necesitan conversi&oacute;n)
	private final static int[] smileys = new int[] { 0xe415, 0xe056, 0xe057, 0xe414, 0xe405, 0xe106, 0xe418, 0xe417, 0xe40d, 0xe40a, 0xe404, 0xe105, 0xe409, 0xe40e, 0xe402,
		0xe108, 0xe403, 0xe058, 0xe407, 0xe401, 0xe40f, 0xe40b, 0xe406, 0xe413, 0xe411, 0xe412, 0xe410, 0xe107, 0xe059, 0xe416, 0xe408, 0xe40c, 0xe11a,
		0xe10c, 0xe32c, 0xe32a, 0xe32d, 0xe328, 0xe32b, 0xe022, 0xe023, 0xe327, 0xe329, 0xe32e, 0xe335, 0xe334, 0xe337, 0xe336, 0xe13c, 0xe330, 0xe331,
		0xe326, 0xe03e, 0xe11d, 0xe05a, 0xe00e, 0xe421, 0xe420, 0xe00d, 0xe010, 0xe011, 0xe41e, 0xe012, 0xe422, 0xe22e, 0xe22f, 0xe231, 0xe230, 0xe427,
		0xe41d, 0xe00f, 0xe41f, 0xe14c, 0xe201, 0xe115, 0xe428, 0xe51f, 0xe429, 0xe424, 0xe423, 0xe253, 0xe426, 0xe111, 0xe425, 0xe31e, 0xe31f, 0xe31d,
		0xe001, 0xe002, 0xe005, 0xe004, 0xe51a, 0xe519, 0xe518, 0xe515, 0xe516, 0xe517, 0xe51b, 0xe152, 0xe04e, 0xe51c, 0xe51e, 0xe11c, 0xe536, 0xe003,
		0xe41c, 0xe41b, 0xe419, 0xe41a, 0xe32f, 0xe10d };
	private final static int[] places = new int[] { 0xe036, 0xe157, 0xe038, 0xe153, 0xe155, 0xe14d, 0xe156, 0xe501, 0xe158, 0xe43d, 0xe037, 0xe504, 0xe44a, 0xe146, 0xe50a, 0xe505,
		0xe506, 0xe122, 0xe508, 0xe509, 0xe03b, 0xe04d, 0xe449, 0xe44b, 0xe51d, 0xe44c, 0xe124, 0xe121, 0xe433, 0xe202, 0xe135, 0xe01c, 0xe01d, 0xe010,
		0xe136, 0xe42e, 0xe01b, 0xe15a, 0xe159, 0xe432, 0xe430, 0xe431, 0xe42f, 0xe01e, 0xe039, 0xe435, 0xe01f, 0xe125, 0xe03a, 0xe14e, 0xe252, 0xe137,
		0xe209, 0xe154, 0xe133, 0xe150, 0xe320, 0xe123, 0xe132, 0xe143, 0xe50b, 0xe514, 0xe513, 0xe50c, 0xe50d, 0xe511, 0xe50f, 0xe512, 0xe510, 0xe50e };
	private final static int[] nature = new int[] { 0xe04a, 0xe04b, 0xe049, 0xe048, 0xe04c, 0xe13d, 0xe443, 0xe43e, 0xe04f, 0xe052, 0xe053, 0xe524, 0xe52c, 0xe52a, 0xe531, 0xe050,
		0xe527, 0xe051, 0xe10b, 0xe52b, 0xe52f, 0xe109, 0xe528, 0xe01a, 0xe134, 0xe530, 0xe529, 0xe526, 0xe52d, 0xe521, 0xe523, 0xe52e, 0xe055, 0xe525,
		0xe10a, 0xe522, 0xe019, 0xe054, 0xe520, 0xe306, 0xe030, 0xe304, 0xe110, 0xe032, 0xe305, 0xe303, 0xe118, 0xe447, 0xe119, 0xe307, 0xe308, 0xe444,
		0xe441, 0xe436 };
	private final static int[] events = new int[] { 0xe437, 0xe438, 0xe43a, 0xe439, 0xe43b, 0xe117, 0xe440, 0xe442, 0xe446, 0xe445, 0xe11b, 0xe448, 0xe033, 0xe112, 0xe325, 0xe312,
		0xe310, 0xe126, 0xe127, 0xe008, 0xe03d, 0xe00c, 0xe12a, 0xe00a, 0xe00b, 0xe009, 0xe316, 0xe129, 0xe141, 0xe142, 0xe317, 0xe128, 0xe14b, 0xe211,
		0xe114, 0xe145, 0xe144, 0xe03f, 0xe313, 0xe116, 0xe10f };
	private final static int[] symbols = new int[] { 0xe21c, 0xe21d, 0xe21e, 0xe21f, 0xe220, 0xe221, 0xe222, 0xe223, 0xe224, 0xe225, 0xe210, 0xe232, 0xe233, 0xe235, 0xe234, 0xe236,
		0xe237, 0xe238, 0xe239, 0xe23b, 0xe23a, 0xe23d, 0xe23c, 0xe24d, 0xe212, 0xe24c, 0xe213, 0xe214, 0xe507, 0xe203, 0xe20b, 0xe22a, 0xe22b, 0xe226,
		0xe227, 0xe22c, 0xe22d, 0xe215, 0xe216, 0xe217, 0xe218, 0xe228, 0xe151, 0xe138, 0xe139, 0xe13a, 0xe208, 0xe14f, 0xe20a, 0xe434, 0xe309, 0xe315,
		0xe30d, 0xe207, 0xe229, 0xe206, 0xe205, 0xe204, 0xe12e, 0xe250, 0xe251, 0xe14a, 0xe149, 0xe104, 0xe103, 0xe101, 0xe102, 0xe13f, 0xe140, 0xe11f,
		0xe12f, 0xe031, 0xe30e, 0xe311, 0xe113, 0xe30f, 0xe13b, 0xe42b, 0xe42a, 0xe018, 0xe016, 0xe015, 0xe014, 0xe42c, 0xe42d, 0xe017, 0xe013, 0xe20e,
		0xe20c, 0xe20f, 0xe20d, 0xe131, 0xe12b, 0xe130, 0xe12d, 0xe324, 0xe301, 0xe148, 0xe502, 0xe03c, 0xe30a, 0xe042, 0xe040, 0xe041, 0xe12c, 0xe007,
		0xe31a, 0xe31b, 0xe13e, 0xe13b, 0xe006, 0xe302, 0xe319, 0xe321, 0xe322, 0xe314, 0xe503, 0xe10e, 0xe318, 0xe43c, 0xe11e, 0xe323, 0xe31c, 0xe034, 0xe035,
		0xe045, 0xe338, 0xe047, 0xe30c, 0xe044, 0xe30b, 0xe043, 0xe120, 0xe33b, 0xe33f, 0xe341, 0xe34c, 0xe344, 0xe342, 0xe33d, 0xe33e, 0xe340, 0xe34d,
		0xe339, 0xe147, 0xe343, 0xe33c, 0xe33a, 0xe43f, 0xe34b, 0xe046, 0xe345, 0xe346, 0xe348, 0xe347, 0xe34a, 0xe349, 0xe23f, 0xe240, 0xe241, 0xe242,
		0xe243, 0xe244, 0xe245, 0xe246, 0xe247, 0xe248, 0xe249, 0xe24a, 0xe24b, 0xe23e, 0xe532, 0xe533, 0xe534, 0xe535, 0xe21a, 0xe219, 0xe21b, 0xe02f,
		0xe024, 0xe025, 0xe026, 0xe027, 0xe028, 0xe029, 0xe02a, 0xe02b, 0xe02c, 0xe02d, 0xe02e, 0xe332, 0xe333, 0xe24e, 0xe24f, 0xe537 };
	/**
	 * Inicializaci&oacute;n est&aacute;tica de los emoji
	 */
	static {
		// a&ntilde;adimos uno a uno los Drawable de todos los emoticonos
		// a&ntilde;adir los drawable usando reflection es demasiado costoso
		emoticons.put(String.format(&quot;%C&quot;,0xe001),R.drawable.emoji_e001);
		emoticons.put(String.format(&quot;%C&quot;,0xe002),R.drawable.emoji_e002);
		emoticons.put(String.format(&quot;%C&quot;,0xe003),R.drawable.emoji_e003);
		emoticons.put(String.format(&quot;%C&quot;,0xe004),R.drawable.emoji_e004);
		emoticons.put(String.format(&quot;%C&quot;,0xe005),R.drawable.emoji_e005);
		emoticons.put(String.format(&quot;%C&quot;,0xe006),R.drawable.emoji_e006);
		emoticons.put(String.format(&quot;%C&quot;,0xe007),R.drawable.emoji_e007);
		emoticons.put(String.format(&quot;%C&quot;,0xe008),R.drawable.emoji_e008);
		emoticons.put(String.format(&quot;%C&quot;,0xe009),R.drawable.emoji_e009);
		emoticons.put(String.format(&quot;%C&quot;,0xe00a),R.drawable.emoji_e00a);
		emoticons.put(String.format(&quot;%C&quot;,0xe00b),R.drawable.emoji_e00b);
		emoticons.put(String.format(&quot;%C&quot;,0xe00c),R.drawable.emoji_e00c);
		emoticons.put(String.format(&quot;%C&quot;,0xe00d),R.drawable.emoji_e00d);
		emoticons.put(String.format(&quot;%C&quot;,0xe00e),R.drawable.emoji_e00e);
		emoticons.put(String.format(&quot;%C&quot;,0xe00f),R.drawable.emoji_e00f);
		emoticons.put(String.format(&quot;%C&quot;,0xe010),R.drawable.emoji_e010);
		emoticons.put(String.format(&quot;%C&quot;,0xe011),R.drawable.emoji_e011);
		emoticons.put(String.format(&quot;%C&quot;,0xe012),R.drawable.emoji_e012);
		emoticons.put(String.format(&quot;%C&quot;,0xe013),R.drawable.emoji_e013);
		emoticons.put(String.format(&quot;%C&quot;,0xe014),R.drawable.emoji_e014);
		emoticons.put(String.format(&quot;%C&quot;,0xe015),R.drawable.emoji_e015);
		emoticons.put(String.format(&quot;%C&quot;,0xe016),R.drawable.emoji_e016);
		emoticons.put(String.format(&quot;%C&quot;,0xe017),R.drawable.emoji_e017);
		emoticons.put(String.format(&quot;%C&quot;,0xe018),R.drawable.emoji_e018);
		emoticons.put(String.format(&quot;%C&quot;,0xe019),R.drawable.emoji_e019);
		emoticons.put(String.format(&quot;%C&quot;,0xe01a),R.drawable.emoji_e01a);
		emoticons.put(String.format(&quot;%C&quot;,0xe01b),R.drawable.emoji_e01b);
		emoticons.put(String.format(&quot;%C&quot;,0xe01c),R.drawable.emoji_e01c);
		emoticons.put(String.format(&quot;%C&quot;,0xe01d),R.drawable.emoji_e01d);
		emoticons.put(String.format(&quot;%C&quot;,0xe01e),R.drawable.emoji_e01e);
		emoticons.put(String.format(&quot;%C&quot;,0xe01f),R.drawable.emoji_e01f);
		emoticons.put(String.format(&quot;%C&quot;,0xe020),R.drawable.emoji_e020);
		emoticons.put(String.format(&quot;%C&quot;,0xe021),R.drawable.emoji_e021);
		emoticons.put(String.format(&quot;%C&quot;,0xe022),R.drawable.emoji_e022);
		emoticons.put(String.format(&quot;%C&quot;,0xe023),R.drawable.emoji_e023);
		emoticons.put(String.format(&quot;%C&quot;,0xe024),R.drawable.emoji_e024);
		emoticons.put(String.format(&quot;%C&quot;,0xe025),R.drawable.emoji_e025);
		emoticons.put(String.format(&quot;%C&quot;,0xe026),R.drawable.emoji_e026);
		emoticons.put(String.format(&quot;%C&quot;,0xe027),R.drawable.emoji_e027);
		emoticons.put(String.format(&quot;%C&quot;,0xe028),R.drawable.emoji_e028);
		emoticons.put(String.format(&quot;%C&quot;,0xe029),R.drawable.emoji_e029);
		emoticons.put(String.format(&quot;%C&quot;,0xe02a),R.drawable.emoji_e02a);
		emoticons.put(String.format(&quot;%C&quot;,0xe02b),R.drawable.emoji_e02b);
		emoticons.put(String.format(&quot;%C&quot;,0xe02c),R.drawable.emoji_e02c);
		emoticons.put(String.format(&quot;%C&quot;,0xe02d),R.drawable.emoji_e02d);
		emoticons.put(String.format(&quot;%C&quot;,0xe02e),R.drawable.emoji_e02e);
		emoticons.put(String.format(&quot;%C&quot;,0xe02f),R.drawable.emoji_e02f);
		emoticons.put(String.format(&quot;%C&quot;,0xe030),R.drawable.emoji_e030);
		emoticons.put(String.format(&quot;%C&quot;,0xe031),R.drawable.emoji_e031);
		emoticons.put(String.format(&quot;%C&quot;,0xe032),R.drawable.emoji_e032);
		emoticons.put(String.format(&quot;%C&quot;,0xe033),R.drawable.emoji_e033);
		emoticons.put(String.format(&quot;%C&quot;,0xe034),R.drawable.emoji_e034);
		emoticons.put(String.format(&quot;%C&quot;,0xe035),R.drawable.emoji_e035);
		emoticons.put(String.format(&quot;%C&quot;,0xe036),R.drawable.emoji_e036);
		emoticons.put(String.format(&quot;%C&quot;,0xe037),R.drawable.emoji_e037);
		emoticons.put(String.format(&quot;%C&quot;,0xe038),R.drawable.emoji_e038);
		emoticons.put(String.format(&quot;%C&quot;,0xe039),R.drawable.emoji_e039);
		emoticons.put(String.format(&quot;%C&quot;,0xe03a),R.drawable.emoji_e03a);
		emoticons.put(String.format(&quot;%C&quot;,0xe03b),R.drawable.emoji_e03b);
		emoticons.put(String.format(&quot;%C&quot;,0xe03c),R.drawable.emoji_e03c);
		emoticons.put(String.format(&quot;%C&quot;,0xe03d),R.drawable.emoji_e03d);
		emoticons.put(String.format(&quot;%C&quot;,0xe03e),R.drawable.emoji_e03e);
		emoticons.put(String.format(&quot;%C&quot;,0xe03f),R.drawable.emoji_e03f);
		emoticons.put(String.format(&quot;%C&quot;,0xe040),R.drawable.emoji_e040);
		emoticons.put(String.format(&quot;%C&quot;,0xe041),R.drawable.emoji_e041);
		emoticons.put(String.format(&quot;%C&quot;,0xe042),R.drawable.emoji_e042);
		emoticons.put(String.format(&quot;%C&quot;,0xe043),R.drawable.emoji_e043);
		emoticons.put(String.format(&quot;%C&quot;,0xe044),R.drawable.emoji_e044);
		emoticons.put(String.format(&quot;%C&quot;,0xe045),R.drawable.emoji_e045);
		emoticons.put(String.format(&quot;%C&quot;,0xe046),R.drawable.emoji_e046);
		emoticons.put(String.format(&quot;%C&quot;,0xe047),R.drawable.emoji_e047);
		emoticons.put(String.format(&quot;%C&quot;,0xe048),R.drawable.emoji_e048);
		emoticons.put(String.format(&quot;%C&quot;,0xe049),R.drawable.emoji_e049);
		emoticons.put(String.format(&quot;%C&quot;,0xe04a),R.drawable.emoji_e04a);
		emoticons.put(String.format(&quot;%C&quot;,0xe04b),R.drawable.emoji_e04b);
		emoticons.put(String.format(&quot;%C&quot;,0xe04c),R.drawable.emoji_e04c);
		emoticons.put(String.format(&quot;%C&quot;,0xe04d),R.drawable.emoji_e04d);
		emoticons.put(String.format(&quot;%C&quot;,0xe04e),R.drawable.emoji_e04e);
		emoticons.put(String.format(&quot;%C&quot;,0xe04f),R.drawable.emoji_e04f);
		emoticons.put(String.format(&quot;%C&quot;,0xe050),R.drawable.emoji_e050);
		emoticons.put(String.format(&quot;%C&quot;,0xe051),R.drawable.emoji_e051);
		emoticons.put(String.format(&quot;%C&quot;,0xe052),R.drawable.emoji_e052);
		emoticons.put(String.format(&quot;%C&quot;,0xe053),R.drawable.emoji_e053);
		emoticons.put(String.format(&quot;%C&quot;,0xe054),R.drawable.emoji_e054);
		emoticons.put(String.format(&quot;%C&quot;,0xe055),R.drawable.emoji_e055);
		emoticons.put(String.format(&quot;%C&quot;,0xe056),R.drawable.emoji_e056);
		emoticons.put(String.format(&quot;%C&quot;,0xe057),R.drawable.emoji_e057);
		emoticons.put(String.format(&quot;%C&quot;,0xe058),R.drawable.emoji_e058);
		emoticons.put(String.format(&quot;%C&quot;,0xe059),R.drawable.emoji_e059);
		emoticons.put(String.format(&quot;%C&quot;,0xe05a),R.drawable.emoji_e05a);
		emoticons.put(String.format(&quot;%C&quot;,0xe101),R.drawable.emoji_e101);
		emoticons.put(String.format(&quot;%C&quot;,0xe102),R.drawable.emoji_e102);
		emoticons.put(String.format(&quot;%C&quot;,0xe103),R.drawable.emoji_e103);
		emoticons.put(String.format(&quot;%C&quot;,0xe104),R.drawable.emoji_e104);
		emoticons.put(String.format(&quot;%C&quot;,0xe105),R.drawable.emoji_e105);
		emoticons.put(String.format(&quot;%C&quot;,0xe106),R.drawable.emoji_e106);
		emoticons.put(String.format(&quot;%C&quot;,0xe107),R.drawable.emoji_e107);
		emoticons.put(String.format(&quot;%C&quot;,0xe108),R.drawable.emoji_e108);
		emoticons.put(String.format(&quot;%C&quot;,0xe109),R.drawable.emoji_e109);
		emoticons.put(String.format(&quot;%C&quot;,0xe10a),R.drawable.emoji_e10a);
		emoticons.put(String.format(&quot;%C&quot;,0xe10b),R.drawable.emoji_e10b);
		emoticons.put(String.format(&quot;%C&quot;,0xe10c),R.drawable.emoji_e10c);
		emoticons.put(String.format(&quot;%C&quot;,0xe10d),R.drawable.emoji_e10d);
		emoticons.put(String.format(&quot;%C&quot;,0xe10e),R.drawable.emoji_e10e);
		emoticons.put(String.format(&quot;%C&quot;,0xe10f),R.drawable.emoji_e10f);
		emoticons.put(String.format(&quot;%C&quot;,0xe110),R.drawable.emoji_e110);
		emoticons.put(String.format(&quot;%C&quot;,0xe111),R.drawable.emoji_e111);
		emoticons.put(String.format(&quot;%C&quot;,0xe112),R.drawable.emoji_e112);
		emoticons.put(String.format(&quot;%C&quot;,0xe113),R.drawable.emoji_e113);
		emoticons.put(String.format(&quot;%C&quot;,0xe114),R.drawable.emoji_e114);
		emoticons.put(String.format(&quot;%C&quot;,0xe115),R.drawable.emoji_e115);
		emoticons.put(String.format(&quot;%C&quot;,0xe116),R.drawable.emoji_e116);
		emoticons.put(String.format(&quot;%C&quot;,0xe117),R.drawable.emoji_e117);
		emoticons.put(String.format(&quot;%C&quot;,0xe118),R.drawable.emoji_e118);
		emoticons.put(String.format(&quot;%C&quot;,0xe119),R.drawable.emoji_e119);
		emoticons.put(String.format(&quot;%C&quot;,0xe11a),R.drawable.emoji_e11a);
		emoticons.put(String.format(&quot;%C&quot;,0xe11b),R.drawable.emoji_e11b);
		emoticons.put(String.format(&quot;%C&quot;,0xe11c),R.drawable.emoji_e11c);
		emoticons.put(String.format(&quot;%C&quot;,0xe11d),R.drawable.emoji_e11d);
		emoticons.put(String.format(&quot;%C&quot;,0xe11e),R.drawable.emoji_e11e);
		emoticons.put(String.format(&quot;%C&quot;,0xe11f),R.drawable.emoji_e11f);
		emoticons.put(String.format(&quot;%C&quot;,0xe120),R.drawable.emoji_e120);
		emoticons.put(String.format(&quot;%C&quot;,0xe121),R.drawable.emoji_e121);
		emoticons.put(String.format(&quot;%C&quot;,0xe122),R.drawable.emoji_e122);
		emoticons.put(String.format(&quot;%C&quot;,0xe123),R.drawable.emoji_e123);
		emoticons.put(String.format(&quot;%C&quot;,0xe124),R.drawable.emoji_e124);
		emoticons.put(String.format(&quot;%C&quot;,0xe125),R.drawable.emoji_e125);
		emoticons.put(String.format(&quot;%C&quot;,0xe126),R.drawable.emoji_e126);
		emoticons.put(String.format(&quot;%C&quot;,0xe127),R.drawable.emoji_e127);
		emoticons.put(String.format(&quot;%C&quot;,0xe128),R.drawable.emoji_e128);
		emoticons.put(String.format(&quot;%C&quot;,0xe129),R.drawable.emoji_e129);
		emoticons.put(String.format(&quot;%C&quot;,0xe12a),R.drawable.emoji_e12a);
		emoticons.put(String.format(&quot;%C&quot;,0xe12b),R.drawable.emoji_e12b);
		emoticons.put(String.format(&quot;%C&quot;,0xe12c),R.drawable.emoji_e12c);
		emoticons.put(String.format(&quot;%C&quot;,0xe12d),R.drawable.emoji_e12d);
		emoticons.put(String.format(&quot;%C&quot;,0xe12e),R.drawable.emoji_e12e);
		emoticons.put(String.format(&quot;%C&quot;,0xe12f),R.drawable.emoji_e12f);
		emoticons.put(String.format(&quot;%C&quot;,0xe130),R.drawable.emoji_e130);
		emoticons.put(String.format(&quot;%C&quot;,0xe131),R.drawable.emoji_e131);
		emoticons.put(String.format(&quot;%C&quot;,0xe132),R.drawable.emoji_e132);
		emoticons.put(String.format(&quot;%C&quot;,0xe133),R.drawable.emoji_e133);
		emoticons.put(String.format(&quot;%C&quot;,0xe134),R.drawable.emoji_e134);
		emoticons.put(String.format(&quot;%C&quot;,0xe135),R.drawable.emoji_e135);
		emoticons.put(String.format(&quot;%C&quot;,0xe136),R.drawable.emoji_e136);
		emoticons.put(String.format(&quot;%C&quot;,0xe137),R.drawable.emoji_e137);
		emoticons.put(String.format(&quot;%C&quot;,0xe138),R.drawable.emoji_e138);
		emoticons.put(String.format(&quot;%C&quot;,0xe139),R.drawable.emoji_e139);
		emoticons.put(String.format(&quot;%C&quot;,0xe13a),R.drawable.emoji_e13a);
		emoticons.put(String.format(&quot;%C&quot;,0xe13b),R.drawable.emoji_e13b);
		emoticons.put(String.format(&quot;%C&quot;,0xe13c),R.drawable.emoji_e13c);
		emoticons.put(String.format(&quot;%C&quot;,0xe13d),R.drawable.emoji_e13d);
		emoticons.put(String.format(&quot;%C&quot;,0xe13e),R.drawable.emoji_e13e);
		emoticons.put(String.format(&quot;%C&quot;,0xe13f),R.drawable.emoji_e13f);
		emoticons.put(String.format(&quot;%C&quot;,0xe140),R.drawable.emoji_e140);
		emoticons.put(String.format(&quot;%C&quot;,0xe141),R.drawable.emoji_e141);
		emoticons.put(String.format(&quot;%C&quot;,0xe142),R.drawable.emoji_e142);
		emoticons.put(String.format(&quot;%C&quot;,0xe143),R.drawable.emoji_e143);
		emoticons.put(String.format(&quot;%C&quot;,0xe144),R.drawable.emoji_e144);
		emoticons.put(String.format(&quot;%C&quot;,0xe145),R.drawable.emoji_e145);
		emoticons.put(String.format(&quot;%C&quot;,0xe146),R.drawable.emoji_e146);
		emoticons.put(String.format(&quot;%C&quot;,0xe147),R.drawable.emoji_e147);
		emoticons.put(String.format(&quot;%C&quot;,0xe148),R.drawable.emoji_e148);
		emoticons.put(String.format(&quot;%C&quot;,0xe149),R.drawable.emoji_e149);
		emoticons.put(String.format(&quot;%C&quot;,0xe14a),R.drawable.emoji_e14a);
		emoticons.put(String.format(&quot;%C&quot;,0xe14b),R.drawable.emoji_e14b);
		emoticons.put(String.format(&quot;%C&quot;,0xe14c),R.drawable.emoji_e14c);
		emoticons.put(String.format(&quot;%C&quot;,0xe14d),R.drawable.emoji_e14d);
		emoticons.put(String.format(&quot;%C&quot;,0xe14e),R.drawable.emoji_e14e);
		emoticons.put(String.format(&quot;%C&quot;,0xe14f),R.drawable.emoji_e14f);
		emoticons.put(String.format(&quot;%C&quot;,0xe150),R.drawable.emoji_e150);
		emoticons.put(String.format(&quot;%C&quot;,0xe151),R.drawable.emoji_e151);
		emoticons.put(String.format(&quot;%C&quot;,0xe152),R.drawable.emoji_e152);
		emoticons.put(String.format(&quot;%C&quot;,0xe153),R.drawable.emoji_e153);
		emoticons.put(String.format(&quot;%C&quot;,0xe154),R.drawable.emoji_e154);
		emoticons.put(String.format(&quot;%C&quot;,0xe155),R.drawable.emoji_e155);
		emoticons.put(String.format(&quot;%C&quot;,0xe156),R.drawable.emoji_e156);
		emoticons.put(String.format(&quot;%C&quot;,0xe157),R.drawable.emoji_e157);
		emoticons.put(String.format(&quot;%C&quot;,0xe158),R.drawable.emoji_e158);
		emoticons.put(String.format(&quot;%C&quot;,0xe159),R.drawable.emoji_e159);
		emoticons.put(String.format(&quot;%C&quot;,0xe15a),R.drawable.emoji_e15a);
		emoticons.put(String.format(&quot;%C&quot;,0xe201),R.drawable.emoji_e201);
		emoticons.put(String.format(&quot;%C&quot;,0xe202),R.drawable.emoji_e202);
		emoticons.put(String.format(&quot;%C&quot;,0xe203),R.drawable.emoji_e203);
		emoticons.put(String.format(&quot;%C&quot;,0xe204),R.drawable.emoji_e204);
		emoticons.put(String.format(&quot;%C&quot;,0xe205),R.drawable.emoji_e205);
		emoticons.put(String.format(&quot;%C&quot;,0xe206),R.drawable.emoji_e206);
		emoticons.put(String.format(&quot;%C&quot;,0xe207),R.drawable.emoji_e207);
		emoticons.put(String.format(&quot;%C&quot;,0xe208),R.drawable.emoji_e208);
		emoticons.put(String.format(&quot;%C&quot;,0xe209),R.drawable.emoji_e209);
		emoticons.put(String.format(&quot;%C&quot;,0xe20a),R.drawable.emoji_e20a);
		emoticons.put(String.format(&quot;%C&quot;,0xe20b),R.drawable.emoji_e20b);
		emoticons.put(String.format(&quot;%C&quot;,0xe20c),R.drawable.emoji_e20c);
		emoticons.put(String.format(&quot;%C&quot;,0xe20d),R.drawable.emoji_e20d);
		emoticons.put(String.format(&quot;%C&quot;,0xe20e),R.drawable.emoji_e20e);
		emoticons.put(String.format(&quot;%C&quot;,0xe20f),R.drawable.emoji_e20f);
		emoticons.put(String.format(&quot;%C&quot;,0xe210),R.drawable.emoji_e210);
		emoticons.put(String.format(&quot;%C&quot;,0xe211),R.drawable.emoji_e211);
		emoticons.put(String.format(&quot;%C&quot;,0xe212),R.drawable.emoji_e212);
		emoticons.put(String.format(&quot;%C&quot;,0xe213),R.drawable.emoji_e213);
		emoticons.put(String.format(&quot;%C&quot;,0xe214),R.drawable.emoji_e214);
		emoticons.put(String.format(&quot;%C&quot;,0xe215),R.drawable.emoji_e215);
		emoticons.put(String.format(&quot;%C&quot;,0xe216),R.drawable.emoji_e216);
		emoticons.put(String.format(&quot;%C&quot;,0xe217),R.drawable.emoji_e217);
		emoticons.put(String.format(&quot;%C&quot;,0xe218),R.drawable.emoji_e218);
		emoticons.put(String.format(&quot;%C&quot;,0xe219),R.drawable.emoji_e219);
		emoticons.put(String.format(&quot;%C&quot;,0xe21a),R.drawable.emoji_e21a);
		emoticons.put(String.format(&quot;%C&quot;,0xe21b),R.drawable.emoji_e21b);
		emoticons.put(String.format(&quot;%C&quot;,0xe21c),R.drawable.emoji_e21c);
		emoticons.put(String.format(&quot;%C&quot;,0xe21d),R.drawable.emoji_e21d);
		emoticons.put(String.format(&quot;%C&quot;,0xe21e),R.drawable.emoji_e21e);
		emoticons.put(String.format(&quot;%C&quot;,0xe21f),R.drawable.emoji_e21f);
		emoticons.put(String.format(&quot;%C&quot;,0xe220),R.drawable.emoji_e220);
		emoticons.put(String.format(&quot;%C&quot;,0xe221),R.drawable.emoji_e221);
		emoticons.put(String.format(&quot;%C&quot;,0xe222),R.drawable.emoji_e222);
		emoticons.put(String.format(&quot;%C&quot;,0xe223),R.drawable.emoji_e223);
		emoticons.put(String.format(&quot;%C&quot;,0xe224),R.drawable.emoji_e224);
		emoticons.put(String.format(&quot;%C&quot;,0xe225),R.drawable.emoji_e225);
		emoticons.put(String.format(&quot;%C&quot;,0xe226),R.drawable.emoji_e226);
		emoticons.put(String.format(&quot;%C&quot;,0xe227),R.drawable.emoji_e227);
		emoticons.put(String.format(&quot;%C&quot;,0xe228),R.drawable.emoji_e228);
		emoticons.put(String.format(&quot;%C&quot;,0xe229),R.drawable.emoji_e229);
		emoticons.put(String.format(&quot;%C&quot;,0xe22a),R.drawable.emoji_e22a);
		emoticons.put(String.format(&quot;%C&quot;,0xe22b),R.drawable.emoji_e22b);
		emoticons.put(String.format(&quot;%C&quot;,0xe22c),R.drawable.emoji_e22c);
		emoticons.put(String.format(&quot;%C&quot;,0xe22d),R.drawable.emoji_e22d);
		emoticons.put(String.format(&quot;%C&quot;,0xe22e),R.drawable.emoji_e22e);
		emoticons.put(String.format(&quot;%C&quot;,0xe22f),R.drawable.emoji_e22f);
		emoticons.put(String.format(&quot;%C&quot;,0xe230),R.drawable.emoji_e230);
		emoticons.put(String.format(&quot;%C&quot;,0xe231),R.drawable.emoji_e231);
		emoticons.put(String.format(&quot;%C&quot;,0xe232),R.drawable.emoji_e232);
		emoticons.put(String.format(&quot;%C&quot;,0xe233),R.drawable.emoji_e233);
		emoticons.put(String.format(&quot;%C&quot;,0xe234),R.drawable.emoji_e234);
		emoticons.put(String.format(&quot;%C&quot;,0xe235),R.drawable.emoji_e235);
		emoticons.put(String.format(&quot;%C&quot;,0xe236),R.drawable.emoji_e236);
		emoticons.put(String.format(&quot;%C&quot;,0xe237),R.drawable.emoji_e237);
		emoticons.put(String.format(&quot;%C&quot;,0xe238),R.drawable.emoji_e238);
		emoticons.put(String.format(&quot;%C&quot;,0xe239),R.drawable.emoji_e239);
		emoticons.put(String.format(&quot;%C&quot;,0xe23a),R.drawable.emoji_e23a);
		emoticons.put(String.format(&quot;%C&quot;,0xe23b),R.drawable.emoji_e23b);
		emoticons.put(String.format(&quot;%C&quot;,0xe23c),R.drawable.emoji_e23c);
		emoticons.put(String.format(&quot;%C&quot;,0xe23d),R.drawable.emoji_e23d);
		emoticons.put(String.format(&quot;%C&quot;,0xe23e),R.drawable.emoji_e23e);
		emoticons.put(String.format(&quot;%C&quot;,0xe23f),R.drawable.emoji_e23f);
		emoticons.put(String.format(&quot;%C&quot;,0xe240),R.drawable.emoji_e240);
		emoticons.put(String.format(&quot;%C&quot;,0xe241),R.drawable.emoji_e241);
		emoticons.put(String.format(&quot;%C&quot;,0xe242),R.drawable.emoji_e242);
		emoticons.put(String.format(&quot;%C&quot;,0xe243),R.drawable.emoji_e243);
		emoticons.put(String.format(&quot;%C&quot;,0xe244),R.drawable.emoji_e244);
		emoticons.put(String.format(&quot;%C&quot;,0xe245),R.drawable.emoji_e245);
		emoticons.put(String.format(&quot;%C&quot;,0xe246),R.drawable.emoji_e246);
		emoticons.put(String.format(&quot;%C&quot;,0xe247),R.drawable.emoji_e247);
		emoticons.put(String.format(&quot;%C&quot;,0xe248),R.drawable.emoji_e248);
		emoticons.put(String.format(&quot;%C&quot;,0xe249),R.drawable.emoji_e249);
		emoticons.put(String.format(&quot;%C&quot;,0xe24a),R.drawable.emoji_e24a);
		emoticons.put(String.format(&quot;%C&quot;,0xe24b),R.drawable.emoji_e24b);
		emoticons.put(String.format(&quot;%C&quot;,0xe24c),R.drawable.emoji_e24c);
		emoticons.put(String.format(&quot;%C&quot;,0xe24d),R.drawable.emoji_e24d);
		emoticons.put(String.format(&quot;%C&quot;,0xe24e),R.drawable.emoji_e24e);
		emoticons.put(String.format(&quot;%C&quot;,0xe24f),R.drawable.emoji_e24f);
		emoticons.put(String.format(&quot;%C&quot;,0xe250),R.drawable.emoji_e250);
		emoticons.put(String.format(&quot;%C&quot;,0xe251),R.drawable.emoji_e251);
		emoticons.put(String.format(&quot;%C&quot;,0xe252),R.drawable.emoji_e252);
		emoticons.put(String.format(&quot;%C&quot;,0xe253),R.drawable.emoji_e253);
		emoticons.put(String.format(&quot;%C&quot;,0xe301),R.drawable.emoji_e301);
		emoticons.put(String.format(&quot;%C&quot;,0xe302),R.drawable.emoji_e302);
		emoticons.put(String.format(&quot;%C&quot;,0xe303),R.drawable.emoji_e303);
		emoticons.put(String.format(&quot;%C&quot;,0xe304),R.drawable.emoji_e304);
		emoticons.put(String.format(&quot;%C&quot;,0xe305),R.drawable.emoji_e305);
		emoticons.put(String.format(&quot;%C&quot;,0xe306),R.drawable.emoji_e306);
		emoticons.put(String.format(&quot;%C&quot;,0xe307),R.drawable.emoji_e307);
		emoticons.put(String.format(&quot;%C&quot;,0xe308),R.drawable.emoji_e308);
		emoticons.put(String.format(&quot;%C&quot;,0xe309),R.drawable.emoji_e309);
		emoticons.put(String.format(&quot;%C&quot;,0xe30a),R.drawable.emoji_e30a);
		emoticons.put(String.format(&quot;%C&quot;,0xe30b),R.drawable.emoji_e30b);
		emoticons.put(String.format(&quot;%C&quot;,0xe30c),R.drawable.emoji_e30c);
		emoticons.put(String.format(&quot;%C&quot;,0xe30d),R.drawable.emoji_e30d);
		emoticons.put(String.format(&quot;%C&quot;,0xe30e),R.drawable.emoji_e30e);
		emoticons.put(String.format(&quot;%C&quot;,0xe30f),R.drawable.emoji_e30f);
		emoticons.put(String.format(&quot;%C&quot;,0xe310),R.drawable.emoji_e310);
		emoticons.put(String.format(&quot;%C&quot;,0xe311),R.drawable.emoji_e311);
		emoticons.put(String.format(&quot;%C&quot;,0xe312),R.drawable.emoji_e312);
		emoticons.put(String.format(&quot;%C&quot;,0xe313),R.drawable.emoji_e313);
		emoticons.put(String.format(&quot;%C&quot;,0xe314),R.drawable.emoji_e314);
		emoticons.put(String.format(&quot;%C&quot;,0xe315),R.drawable.emoji_e315);
		emoticons.put(String.format(&quot;%C&quot;,0xe316),R.drawable.emoji_e316);
		emoticons.put(String.format(&quot;%C&quot;,0xe317),R.drawable.emoji_e317);
		emoticons.put(String.format(&quot;%C&quot;,0xe318),R.drawable.emoji_e318);
		emoticons.put(String.format(&quot;%C&quot;,0xe319),R.drawable.emoji_e319);
		emoticons.put(String.format(&quot;%C&quot;,0xe31a),R.drawable.emoji_e31a);
		emoticons.put(String.format(&quot;%C&quot;,0xe31b),R.drawable.emoji_e31b);
		emoticons.put(String.format(&quot;%C&quot;,0xe31c),R.drawable.emoji_e31c);
		emoticons.put(String.format(&quot;%C&quot;,0xe31d),R.drawable.emoji_e31d);
		emoticons.put(String.format(&quot;%C&quot;,0xe31e),R.drawable.emoji_e31e);
		emoticons.put(String.format(&quot;%C&quot;,0xe31f),R.drawable.emoji_e31f);
		emoticons.put(String.format(&quot;%C&quot;,0xe320),R.drawable.emoji_e320);
		emoticons.put(String.format(&quot;%C&quot;,0xe321),R.drawable.emoji_e321);
		emoticons.put(String.format(&quot;%C&quot;,0xe322),R.drawable.emoji_e322);
		emoticons.put(String.format(&quot;%C&quot;,0xe323),R.drawable.emoji_e323);
		emoticons.put(String.format(&quot;%C&quot;,0xe324),R.drawable.emoji_e324);
		emoticons.put(String.format(&quot;%C&quot;,0xe325),R.drawable.emoji_e325);
		emoticons.put(String.format(&quot;%C&quot;,0xe326),R.drawable.emoji_e326);
		emoticons.put(String.format(&quot;%C&quot;,0xe327),R.drawable.emoji_e327);
		emoticons.put(String.format(&quot;%C&quot;,0xe328),R.drawable.emoji_e328);
		emoticons.put(String.format(&quot;%C&quot;,0xe329),R.drawable.emoji_e329);
		emoticons.put(String.format(&quot;%C&quot;,0xe32a),R.drawable.emoji_e32a);
		emoticons.put(String.format(&quot;%C&quot;,0xe32b),R.drawable.emoji_e32b);
		emoticons.put(String.format(&quot;%C&quot;,0xe32c),R.drawable.emoji_e32c);
		emoticons.put(String.format(&quot;%C&quot;,0xe32d),R.drawable.emoji_e32d);
		emoticons.put(String.format(&quot;%C&quot;,0xe32e),R.drawable.emoji_e32e);
		emoticons.put(String.format(&quot;%C&quot;,0xe32f),R.drawable.emoji_e32f);
		emoticons.put(String.format(&quot;%C&quot;,0xe330),R.drawable.emoji_e330);
		emoticons.put(String.format(&quot;%C&quot;,0xe331),R.drawable.emoji_e331);
		emoticons.put(String.format(&quot;%C&quot;,0xe332),R.drawable.emoji_e332);
		emoticons.put(String.format(&quot;%C&quot;,0xe333),R.drawable.emoji_e333);
		emoticons.put(String.format(&quot;%C&quot;,0xe334),R.drawable.emoji_e334);
		emoticons.put(String.format(&quot;%C&quot;,0xe335),R.drawable.emoji_e335);
		emoticons.put(String.format(&quot;%C&quot;,0xe336),R.drawable.emoji_e336);
		emoticons.put(String.format(&quot;%C&quot;,0xe337),R.drawable.emoji_e337);
		emoticons.put(String.format(&quot;%C&quot;,0xe338),R.drawable.emoji_e338);
		emoticons.put(String.format(&quot;%C&quot;,0xe339),R.drawable.emoji_e339);
		emoticons.put(String.format(&quot;%C&quot;,0xe33a),R.drawable.emoji_e33a);
		emoticons.put(String.format(&quot;%C&quot;,0xe33b),R.drawable.emoji_e33b);
		emoticons.put(String.format(&quot;%C&quot;,0xe33c),R.drawable.emoji_e33c);
		emoticons.put(String.format(&quot;%C&quot;,0xe33d),R.drawable.emoji_e33d);
		emoticons.put(String.format(&quot;%C&quot;,0xe33e),R.drawable.emoji_e33e);
		emoticons.put(String.format(&quot;%C&quot;,0xe33f),R.drawable.emoji_e33f);
		emoticons.put(String.format(&quot;%C&quot;,0xe340),R.drawable.emoji_e340);
		emoticons.put(String.format(&quot;%C&quot;,0xe341),R.drawable.emoji_e341);
		emoticons.put(String.format(&quot;%C&quot;,0xe342),R.drawable.emoji_e342);
		emoticons.put(String.format(&quot;%C&quot;,0xe343),R.drawable.emoji_e343);
		emoticons.put(String.format(&quot;%C&quot;,0xe344),R.drawable.emoji_e344);
		emoticons.put(String.format(&quot;%C&quot;,0xe345),R.drawable.emoji_e345);
		emoticons.put(String.format(&quot;%C&quot;,0xe346),R.drawable.emoji_e346);
		emoticons.put(String.format(&quot;%C&quot;,0xe347),R.drawable.emoji_e347);
		emoticons.put(String.format(&quot;%C&quot;,0xe348),R.drawable.emoji_e348);
		emoticons.put(String.format(&quot;%C&quot;,0xe349),R.drawable.emoji_e349);
		emoticons.put(String.format(&quot;%C&quot;,0xe34a),R.drawable.emoji_e34a);
		emoticons.put(String.format(&quot;%C&quot;,0xe34b),R.drawable.emoji_e34b);
		emoticons.put(String.format(&quot;%C&quot;,0xe34c),R.drawable.emoji_e34c);
		emoticons.put(String.format(&quot;%C&quot;,0xe34d),R.drawable.emoji_e34d);
		emoticons.put(String.format(&quot;%C&quot;,0xe401),R.drawable.emoji_e401);
		emoticons.put(String.format(&quot;%C&quot;,0xe402),R.drawable.emoji_e402);
		emoticons.put(String.format(&quot;%C&quot;,0xe403),R.drawable.emoji_e403);
		emoticons.put(String.format(&quot;%C&quot;,0xe404),R.drawable.emoji_e404);
		emoticons.put(String.format(&quot;%C&quot;,0xe405),R.drawable.emoji_e405);
		emoticons.put(String.format(&quot;%C&quot;,0xe406),R.drawable.emoji_e406);
		emoticons.put(String.format(&quot;%C&quot;,0xe407),R.drawable.emoji_e407);
		emoticons.put(String.format(&quot;%C&quot;,0xe408),R.drawable.emoji_e408);
		emoticons.put(String.format(&quot;%C&quot;,0xe409),R.drawable.emoji_e409);
		emoticons.put(String.format(&quot;%C&quot;,0xe40a),R.drawable.emoji_e40a);
		emoticons.put(String.format(&quot;%C&quot;,0xe40b),R.drawable.emoji_e40b);
		emoticons.put(String.format(&quot;%C&quot;,0xe40c),R.drawable.emoji_e40c);
		emoticons.put(String.format(&quot;%C&quot;,0xe40d),R.drawable.emoji_e40d);
		emoticons.put(String.format(&quot;%C&quot;,0xe40e),R.drawable.emoji_e40e);
		emoticons.put(String.format(&quot;%C&quot;,0xe40f),R.drawable.emoji_e40f);
		emoticons.put(String.format(&quot;%C&quot;,0xe410),R.drawable.emoji_e410);
		emoticons.put(String.format(&quot;%C&quot;,0xe411),R.drawable.emoji_e411);
		emoticons.put(String.format(&quot;%C&quot;,0xe412),R.drawable.emoji_e412);
		emoticons.put(String.format(&quot;%C&quot;,0xe413),R.drawable.emoji_e413);
		emoticons.put(String.format(&quot;%C&quot;,0xe414),R.drawable.emoji_e414);
		emoticons.put(String.format(&quot;%C&quot;,0xe415),R.drawable.emoji_e415);
		emoticons.put(String.format(&quot;%C&quot;,0xe416),R.drawable.emoji_e416);
		emoticons.put(String.format(&quot;%C&quot;,0xe417),R.drawable.emoji_e417);
		emoticons.put(String.format(&quot;%C&quot;,0xe418),R.drawable.emoji_e418);
		emoticons.put(String.format(&quot;%C&quot;,0xe419),R.drawable.emoji_e419);
		emoticons.put(String.format(&quot;%C&quot;,0xe41a),R.drawable.emoji_e41a);
		emoticons.put(String.format(&quot;%C&quot;,0xe41b),R.drawable.emoji_e41b);
		emoticons.put(String.format(&quot;%C&quot;,0xe41c),R.drawable.emoji_e41c);
		emoticons.put(String.format(&quot;%C&quot;,0xe41d),R.drawable.emoji_e41d);
		emoticons.put(String.format(&quot;%C&quot;,0xe41e),R.drawable.emoji_e41e);
		emoticons.put(String.format(&quot;%C&quot;,0xe41f),R.drawable.emoji_e41f);
		emoticons.put(String.format(&quot;%C&quot;,0xe420),R.drawable.emoji_e420);
		emoticons.put(String.format(&quot;%C&quot;,0xe421),R.drawable.emoji_e421);
		emoticons.put(String.format(&quot;%C&quot;,0xe422),R.drawable.emoji_e422);
		emoticons.put(String.format(&quot;%C&quot;,0xe423),R.drawable.emoji_e423);
		emoticons.put(String.format(&quot;%C&quot;,0xe424),R.drawable.emoji_e424);
		emoticons.put(String.format(&quot;%C&quot;,0xe425),R.drawable.emoji_e425);
		emoticons.put(String.format(&quot;%C&quot;,0xe426),R.drawable.emoji_e426);
		emoticons.put(String.format(&quot;%C&quot;,0xe427),R.drawable.emoji_e427);
		emoticons.put(String.format(&quot;%C&quot;,0xe428),R.drawable.emoji_e428);
		emoticons.put(String.format(&quot;%C&quot;,0xe429),R.drawable.emoji_e429);
		emoticons.put(String.format(&quot;%C&quot;,0xe42a),R.drawable.emoji_e42a);
		emoticons.put(String.format(&quot;%C&quot;,0xe42b),R.drawable.emoji_e42b);
		emoticons.put(String.format(&quot;%C&quot;,0xe42c),R.drawable.emoji_e42c);
		emoticons.put(String.format(&quot;%C&quot;,0xe42d),R.drawable.emoji_e42d);
		emoticons.put(String.format(&quot;%C&quot;,0xe42e),R.drawable.emoji_e42e);
		emoticons.put(String.format(&quot;%C&quot;,0xe42f),R.drawable.emoji_e42f);
		emoticons.put(String.format(&quot;%C&quot;,0xe430),R.drawable.emoji_e430);
		emoticons.put(String.format(&quot;%C&quot;,0xe431),R.drawable.emoji_e431);
		emoticons.put(String.format(&quot;%C&quot;,0xe432),R.drawable.emoji_e432);
		emoticons.put(String.format(&quot;%C&quot;,0xe433),R.drawable.emoji_e433);
		emoticons.put(String.format(&quot;%C&quot;,0xe434),R.drawable.emoji_e434);
		emoticons.put(String.format(&quot;%C&quot;,0xe435),R.drawable.emoji_e435);
		emoticons.put(String.format(&quot;%C&quot;,0xe436),R.drawable.emoji_e436);
		emoticons.put(String.format(&quot;%C&quot;,0xe437),R.drawable.emoji_e437);
		emoticons.put(String.format(&quot;%C&quot;,0xe438),R.drawable.emoji_e438);
		emoticons.put(String.format(&quot;%C&quot;,0xe439),R.drawable.emoji_e439);
		emoticons.put(String.format(&quot;%C&quot;,0xe43a),R.drawable.emoji_e43a);
		emoticons.put(String.format(&quot;%C&quot;,0xe43b),R.drawable.emoji_e43b);
		emoticons.put(String.format(&quot;%C&quot;,0xe43c),R.drawable.emoji_e43c);
		emoticons.put(String.format(&quot;%C&quot;,0xe43d),R.drawable.emoji_e43d);
		emoticons.put(String.format(&quot;%C&quot;,0xe43e),R.drawable.emoji_e43e);
		emoticons.put(String.format(&quot;%C&quot;,0xe43f),R.drawable.emoji_e43f);
		emoticons.put(String.format(&quot;%C&quot;,0xe440),R.drawable.emoji_e440);
		emoticons.put(String.format(&quot;%C&quot;,0xe441),R.drawable.emoji_e441);
		emoticons.put(String.format(&quot;%C&quot;,0xe442),R.drawable.emoji_e442);
		emoticons.put(String.format(&quot;%C&quot;,0xe443),R.drawable.emoji_e443);
		emoticons.put(String.format(&quot;%C&quot;,0xe444),R.drawable.emoji_e444);
		emoticons.put(String.format(&quot;%C&quot;,0xe445),R.drawable.emoji_e445);
		emoticons.put(String.format(&quot;%C&quot;,0xe446),R.drawable.emoji_e446);
		emoticons.put(String.format(&quot;%C&quot;,0xe447),R.drawable.emoji_e447);
		emoticons.put(String.format(&quot;%C&quot;,0xe448),R.drawable.emoji_e448);
		emoticons.put(String.format(&quot;%C&quot;,0xe449),R.drawable.emoji_e449);
		emoticons.put(String.format(&quot;%C&quot;,0xe44a),R.drawable.emoji_e44a);
		emoticons.put(String.format(&quot;%C&quot;,0xe44b),R.drawable.emoji_e44b);
		emoticons.put(String.format(&quot;%C&quot;,0xe44c),R.drawable.emoji_e44c);
		emoticons.put(String.format(&quot;%C&quot;,0xe501),R.drawable.emoji_e501);
		emoticons.put(String.format(&quot;%C&quot;,0xe502),R.drawable.emoji_e502);
		emoticons.put(String.format(&quot;%C&quot;,0xe503),R.drawable.emoji_e503);
		emoticons.put(String.format(&quot;%C&quot;,0xe504),R.drawable.emoji_e504);
		emoticons.put(String.format(&quot;%C&quot;,0xe505),R.drawable.emoji_e505);
		emoticons.put(String.format(&quot;%C&quot;,0xe506),R.drawable.emoji_e506);
		emoticons.put(String.format(&quot;%C&quot;,0xe507),R.drawable.emoji_e507);
		emoticons.put(String.format(&quot;%C&quot;,0xe508),R.drawable.emoji_e508);
		emoticons.put(String.format(&quot;%C&quot;,0xe509),R.drawable.emoji_e509);
		emoticons.put(String.format(&quot;%C&quot;,0xe50a),R.drawable.emoji_e50a);
		emoticons.put(String.format(&quot;%C&quot;,0xe50b),R.drawable.emoji_e50b);
		emoticons.put(String.format(&quot;%C&quot;,0xe50c),R.drawable.emoji_e50c);
		emoticons.put(String.format(&quot;%C&quot;,0xe50d),R.drawable.emoji_e50d);
		emoticons.put(String.format(&quot;%C&quot;,0xe50e),R.drawable.emoji_e50e);
		emoticons.put(String.format(&quot;%C&quot;,0xe50f),R.drawable.emoji_e50f);
		emoticons.put(String.format(&quot;%C&quot;,0xe510),R.drawable.emoji_e510);
		emoticons.put(String.format(&quot;%C&quot;,0xe511),R.drawable.emoji_e511);
		emoticons.put(String.format(&quot;%C&quot;,0xe512),R.drawable.emoji_e512);
		emoticons.put(String.format(&quot;%C&quot;,0xe513),R.drawable.emoji_e513);
		emoticons.put(String.format(&quot;%C&quot;,0xe514),R.drawable.emoji_e514);
		emoticons.put(String.format(&quot;%C&quot;,0xe515),R.drawable.emoji_e515);
		emoticons.put(String.format(&quot;%C&quot;,0xe516),R.drawable.emoji_e516);
		emoticons.put(String.format(&quot;%C&quot;,0xe517),R.drawable.emoji_e517);
		emoticons.put(String.format(&quot;%C&quot;,0xe518),R.drawable.emoji_e518);
		emoticons.put(String.format(&quot;%C&quot;,0xe519),R.drawable.emoji_e519);
		emoticons.put(String.format(&quot;%C&quot;,0xe51a),R.drawable.emoji_e51a);
		emoticons.put(String.format(&quot;%C&quot;,0xe51b),R.drawable.emoji_e51b);
		emoticons.put(String.format(&quot;%C&quot;,0xe51c),R.drawable.emoji_e51c);
		emoticons.put(String.format(&quot;%C&quot;,0xe51d),R.drawable.emoji_e51d);
		emoticons.put(String.format(&quot;%C&quot;,0xe51e),R.drawable.emoji_e51e);
		emoticons.put(String.format(&quot;%C&quot;,0xe51f),R.drawable.emoji_e51f);
		emoticons.put(String.format(&quot;%C&quot;,0xe520),R.drawable.emoji_e520);
		emoticons.put(String.format(&quot;%C&quot;,0xe521),R.drawable.emoji_e521);
		emoticons.put(String.format(&quot;%C&quot;,0xe522),R.drawable.emoji_e522);
		emoticons.put(String.format(&quot;%C&quot;,0xe523),R.drawable.emoji_e523);
		emoticons.put(String.format(&quot;%C&quot;,0xe524),R.drawable.emoji_e524);
		emoticons.put(String.format(&quot;%C&quot;,0xe525),R.drawable.emoji_e525);
		emoticons.put(String.format(&quot;%C&quot;,0xe526),R.drawable.emoji_e526);
		emoticons.put(String.format(&quot;%C&quot;,0xe527),R.drawable.emoji_e527);
		emoticons.put(String.format(&quot;%C&quot;,0xe528),R.drawable.emoji_e528);
		emoticons.put(String.format(&quot;%C&quot;,0xe529),R.drawable.emoji_e529);
		emoticons.put(String.format(&quot;%C&quot;,0xe52a),R.drawable.emoji_e52a);
		emoticons.put(String.format(&quot;%C&quot;,0xe52b),R.drawable.emoji_e52b);
		emoticons.put(String.format(&quot;%C&quot;,0xe52c),R.drawable.emoji_e52c);
		emoticons.put(String.format(&quot;%C&quot;,0xe52d),R.drawable.emoji_e52d);
		emoticons.put(String.format(&quot;%C&quot;,0xe52e),R.drawable.emoji_e52e);
		emoticons.put(String.format(&quot;%C&quot;,0xe52f),R.drawable.emoji_e52f);
		emoticons.put(String.format(&quot;%C&quot;,0xe530),R.drawable.emoji_e530);
		emoticons.put(String.format(&quot;%C&quot;,0xe531),R.drawable.emoji_e531);
		emoticons.put(String.format(&quot;%C&quot;,0xe532),R.drawable.emoji_e532);
		emoticons.put(String.format(&quot;%C&quot;,0xe533),R.drawable.emoji_e533);
		emoticons.put(String.format(&quot;%C&quot;,0xe534),R.drawable.emoji_e534);
		emoticons.put(String.format(&quot;%C&quot;,0xe535),R.drawable.emoji_e535);
		emoticons.put(String.format(&quot;%C&quot;,0xe536),R.drawable.emoji_e536);
		emoticons.put(String.format(&quot;%C&quot;,0xe537),R.drawable.emoji_e537);
		// as&iacute; solamente se realiza la b&uacute;squeda en la inicializaci&oacute;n
		categories.put(Tipo.Smiley.toString(), getCharsFromTags(Tipo.Smiley));
		categories.put(Tipo.Event.toString(), getCharsFromTags(Tipo.Event));
		categories.put(Tipo.Nature.toString(), getCharsFromTags(Tipo.Nature));
		categories.put(Tipo.Place.toString(), getCharsFromTags(Tipo.Place));
		categories.put(Tipo.Symbol.toString(), getCharsFromTags(Tipo.Symbol));
	}
	/**
	 * Transforma los vectores de c&oacute;digo hexadecimal con los c&oacute;digos de caracter unicode a los propios caracteres
	 * @param tipo Categor&iacute;a del emoticono deseado
	 * @return Vector de caracteres unicode
	 */
	private static String[] getCharsFromTags(Tipo tipo) {
		int[] array = null;
		switch (tipo) {
			case Smiley:
				array = smileys;
				break;
			case Event:
				array = events;
				break;
			case Nature:
				array = nature;
				break;
			case Place:
				array = places;
				break;
			case Symbol:
				array = symbols;
				break;
		}
		LinkedList&lt;String&gt; tags = new LinkedList&lt;String&gt;();
		for (int i:array)
			tags.add(String.format(&quot;%C&quot;,i));
		return tags.toArray(new String[0]);
	}
	/**
	 * Devuelve un vector de caracteres unicode perteneciente a una categor&iacute;a de emoji
	 *
	 * @param tipo Categor&iacute;a de emoji deseada
	 * @return Vector de caracteres unicode de los emoji del tipo indicado
	 */
	public static String[] getTags(Tipo tipo) {
		return categories.get(tipo.toString());
	}
	/**
	 * Devuelve la ID del Resource perteneciente a un emoticono, dado su caracter unicode
	 *
	 * @param tag Caracter unicode del emoji deseado
	 * @return
	 */
	public static int getResource(String tag) {
		return emoticons.get(tag);
	}
	/**
	 * Nos devuelve el Spannable con la mezcla de texto/im&aacute;genes necesaria para la representaci&oacute;n de los emoticonos
	 *
	 * @param context Contexto de ejecuci&oacute;n donde se realiza la llamada
	 * @param text Texto a parsear con los caracteres de los emoticonos
	 * @return Devuelve un Spannable con las im&aacute;genes intercaladas en el texto
	 */
	public static Spannable getEmojiText(Context context, String text) {
		SpannableStringBuilder builder = new SpannableStringBuilder(text);
		int index;
		for (index = 0; index &lt; builder.length(); index++) {
			for (Entry&lt;String, Integer&gt; entry : emoticons.entrySet()) {
				int length = entry.getKey().length();
				if (index + length &gt; builder.length())
					continue;
				if (builder.subSequence(index, index + length).toString().equals(entry.getKey())) {
					builder.setSpan(new ImageSpan(context, entry.getValue()), index, index + length,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
					index += length - 1;
		        	break;
				}
			}
		}
		return builder;
	}
}
</pre>
</p>
<p>Para utilizar este código en tus proyectos, solamente hay que cambiar las implementaciones que utilicen <strong>setText</strong> de <strong>String</strong> a <strong>Spannable</strong>, que lo admiten perfectamente. Por ejemplo, os puedo comentar que tanto <strong>TextView</strong> como <strong>EditText</strong> lo admiten sin ningún problema. Un ejemplo de uso sería el que sigue.</p>
<p>
<pre>
final TextView mensajeTexto = (TextView)findViewById(R.id.mensajeTexto);
mensajeTexto.setText(EmoticonUtils.getEmojiText(ctx, textoPlano));
</pre>
</p>
<p>
La variable <strong>textoPlano</strong> debe de ser una String en UTF-8 que puede contener tanto texto como caracteres emoji, que serán convenientemente cambiados por sus respectivas imágenes guardadas en los recursos del proyecto.
</p>
<p>Espero que este código os sirva, que para mí ha sido un coñazo hacerlo. Lo mejoraré seguramente para minimizar los costes, pero a saber si me da por actualizar este post&#8230; de todos modos esto es totalmente funcional <img src='http://www.perry.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Si encontráis algún problema, dejádmelo en los comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perry.es/2011/05/31/implementar-soporte-a-emoji-en-aplicaciones-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uso de XMPP en Android</title>
		<link>http://www.perry.es/2011/05/25/uso-de-xmpp-en-android/</link>
		<comments>http://www.perry.es/2011/05/25/uso-de-xmpp-en-android/#comments</comments>
		<pubDate>Wed, 25 May 2011 10:12:49 +0000</pubDate>
		<dc:creator>mrm</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[smack]]></category>
		<category><![CDATA[snippets]]></category>
		<category><![CDATA[xmpp]]></category>

		<guid isPermaLink="false">http://www.perry.es/?p=7932</guid>
		<description><![CDATA[Por (circunstancias) estoy trabajando con XMPP para un cliente multiplataforma (móvil) de mensajería, por su potencia, por ser un estándar conocido, y por las diversas implementaciones de gran calidad y extensibilidad que existen a nivel de servidor. Para elegir una librería en Java, para usar en Android, la cosa está bastante clara: hay que tirar [...]]]></description>
			<content:encoded><![CDATA[<p>Por (circunstancias) estoy trabajando con XMPP para un cliente multiplataforma (móvil) de mensajería, por su potencia, por ser un estándar conocido, y por las diversas implementaciones de gran calidad y extensibilidad que existen a nivel de servidor.</p>
<p>Para elegir una librería en Java, para usar en Android, la cosa está bastante clara: hay que tirar con <a title="Smack" href="http://www.igniterealtime.org/projects/smack/index.jsp">Smack</a>. Pero presenta una serie de problemas la librería, al menos con las versiones a día de hoy, que hacen que tengamos que buscar por otro lado: errores en la conexión por no poder utilizar el método SASL por defecto (al no estar presentes en la VM de Android algunos métodos utilizados), incapacidad de usar compresión, entre otras.</p>
<p>Entonces se llega a <a href="http://code.google.com/p/asmack/">asmack</a>, o sea, Smack para Android, que es un fork donde se han aplicado una serie de parches en la autenticación, DNS, y más.</p>
<p>Y a priori, todo funciona bien.</p>
<pre>
System.setProperty("java.net.preferIPv6Addresses", "false");
ConnectionConfiguration cc = new ConnectionConfiguration("domain",5222);
cc.setSecurityMode(SecurityMode.disabled);
cc.setCompressionEnabled(false);
cc.setReconnectionAllowed(true);

conn = new XMPPConnection(cc);
Connection.DEBUG_ENABLED = true;

try {
conn.connect();
if (conn.isConnected())
Log.d(TAG,"Conectado");
else {
Log.d(TAG,"No conectado");
return;
}

conn.login(user+"@domain", pass, "resource");

if (conn.isAuthenticated()) {
Log.d(TAG,"Autenticado");
res = true;
}
else
Log.d(TAG,"No autenticado");
} catch (XMPPException ex) { ex.printStackTrace(); }
</pre>
<p>Pero tiene pegas. Hay algunas funcionalidades que no van del todo bien, y para solventarlas en su mayoría hay que tirar de versiones de asmack que han parcheado. Yo tuve la suerte de encontrar <a href="https://github.com/Flowdalic/asmack">un fork de asmack hecho por Flowdalic</a> que soluciona la mayoría de problemas, como por ejemplo la búsqueda de usuarios en el servidor.</p>
<p>Pero hay un tema muy insidioso que nadie ha solucionado en sus JAR. Resulta que existe, dentro de la carpeta META-INF de los mismos, un archivo que se llama smack.providers que debería cargarse, puesto que cuenta con los IQ providers de la mayoría de añadidos útiles de XMPP, pero por cuestiones de cómo se generan los JAR de Android, no está presente. Por lo tanto -y que sepáis que es lo que más me dio por culo a la hora de encontrar qué fallaba- hay que registrarlos manualmente.</p>
<p>Antes de definir el ConnectionConfiguration, debemos añadir esta línea de código:</p>
<pre>
// poner entre el System.setProperty y el ConnectionConfiguration
configure(ProviderManager.getInstance());
// ha de ir siempre antes del establecimiento de la conexión
</pre>
<p>Y después crear una función que se llame configure, quedando como la que sigue:</p>
<pre>

// reemplazo para smack.providers ya que éste no funciona en asmack
private void configure(ProviderManager pm) {
//  Private Data Storage
pm.addIQProvider("query","jabber:iq:private", new PrivateDataManager.PrivateDataIQProvider());

//  Time
try {
pm.addIQProvider("query","jabber:iq:time", Class.forName("org.jivesoftware.smackx.packet.Time"));
} catch (ClassNotFoundException e) {
Log.w(TAG, "Can't load class for org.jivesoftware.smackx.packet.Time");
}

//  XHTML
pm.addExtensionProvider("html","http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider());

//  Roster Exchange
pm.addExtensionProvider("x","jabber:x:roster", new RosterExchangeProvider());
//  Message Events
pm.addExtensionProvider("x","jabber:x:event", new MessageEventProvider());
//  Chat State
pm.addExtensionProvider("active","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
pm.addExtensionProvider("composing","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
pm.addExtensionProvider("paused","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
pm.addExtensionProvider("inactive","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
pm.addExtensionProvider("gone","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());

//   FileTransfer
pm.addIQProvider("si","http://jabber.org/protocol/si", new StreamInitiationProvider());
pm.addIQProvider("query","http://jabber.org/protocol/bytestreams", new BytestreamsProvider());
pm.addIQProvider("open","http://jabber.org/protocol/ibb", new OpenIQProvider());
pm.addIQProvider("close","http://jabber.org/protocol/ibb", new CloseIQProvider());
pm.addExtensionProvider("data","http://jabber.org/protocol/ibb", new DataPacketProvider());

//  Group Chat Invitations
pm.addExtensionProvider("x","jabber:x:conference", new GroupChatInvitation.Provider());
//  Service Discovery # Items
pm.addIQProvider("query","http://jabber.org/protocol/disco#items", new DiscoverItemsProvider());
//  Service Discovery # Info
pm.addIQProvider("query","http://jabber.org/protocol/disco#info", new DiscoverInfoProvider());
//  Data Forms
pm.addExtensionProvider("x","jabber:x:data", new DataFormProvider());
//  MUC User
pm.addExtensionProvider("x","http://jabber.org/protocol/muc#user", new MUCUserProvider());
//  MUC Admin
pm.addIQProvider("query","http://jabber.org/protocol/muc#admin", new MUCAdminProvider());
//  MUC Owner
pm.addIQProvider("query","http://jabber.org/protocol/muc#owner", new MUCOwnerProvider());
//  Delayed Delivery
pm.addExtensionProvider("x","jabber:x:delay", new DelayInformationProvider());
//  Version
try {
pm.addIQProvider("query","jabber:iq:version", Class.forName("org.jivesoftware.smackx.packet.Version"));
} catch (ClassNotFoundException e) {
Log.w(TAG, "Can't load class for org.jivesoftware.smackx.packet.Version");
}
//  VCard
pm.addIQProvider("vCard","vcard-temp", new VCardProvider());
//  Offline Message Requests
pm.addIQProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider());
//  Offline Message Indicator
pm.addExtensionProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider());
//  Last Activity
pm.addIQProvider("query","jabber:iq:last", new LastActivity.Provider());
//  User Search
pm.addIQProvider("query","jabber:iq:search", new UserSearch.Provider());
//  SharedGroupsInfo
pm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup", new SharedGroupsInfo.Provider());
//  JEP-33: Extended Stanza Addressing
pm.addExtensionProvider("addresses","http://jabber.org/protocol/address", new MultipleAddressesProvider());
}
</pre>
<p>Y con esto ya nos funcionarían todas las características, doy fe de ello: ya me funcionan IncomingFileTransfer y OutgoingFileTransfer, los chats multiusuario, e incluso los mensajes de OfflineMessageManager.</p>
<p>No sé si soy manco o qué, pero darme cuenta de todo esto y hallar las soluciones me ha costado bastantes semanas de dolor y agonía, y aquí lo comparto con vosotros, si es que a alguno alguna vez le toca trastear con XMPP en Android.</p>
<p>Sólo se que estoy temblando pensando en el momento que tenga que portar esta aplicación a iOS xDD</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perry.es/2011/05/25/uso-de-xmpp-en-android/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Battery Info Widget para Android</title>
		<link>http://www.perry.es/2011/05/13/battery-info-widget-para-android/</link>
		<comments>http://www.perry.es/2011/05/13/battery-info-widget-para-android/#comments</comments>
		<pubDate>Fri, 13 May 2011 14:04:37 +0000</pubDate>
		<dc:creator>mrm</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[audev]]></category>
		<category><![CDATA[battery info widget]]></category>
		<category><![CDATA[batteryinfowidget-android]]></category>

		<guid isPermaLink="false">http://www.perry.es/?p=2471</guid>
		<description><![CDATA[He sacado una nueva aplicación al Android Market, que he hecho en un ratillo, que muestra en un widget el nivel de batería, su temperatura, la salud de la misma, y una estimación de lo que tardará en vaciarse/llenarse (aunque debo refinar todavía un poco más los valores). Para el que le apetezca bajársela, os [...]]]></description>
			<content:encoded><![CDATA[<p>He sacado una nueva aplicación al Android Market, que he hecho en un ratillo, que muestra en un widget el nivel de batería, su temperatura, la salud de la misma, y una estimación de lo que tardará en vaciarse/llenarse (aunque debo refinar todavía un poco más los valores).</p>
<p><a rel="attachment wp-att-2472" href="http://www.perry.es/2011/05/13/battery-info-widget-para-android/captura1/"><img class="alignnone size-full wp-image-2472" title="Battery Info Widget" src="http://www.perry.es/extra/uploads/2011/05/captura1-e1305295273158.png" alt="" width="460" height="424" /></a></p>
<p>Para el que le apetezca bajársela, os dejo el <a title="Battery Info Widget" href="https://market.android.com/details?id=net.audev.batteryinfowidget">link al Android Market aquí</a>.</p>
<p><a href="https://market.android.com/details?id=net.audev.batteryinfowidget" title="AndroidShort" target="_blank"><img width="300" alt="Android Market badge" src="http://www.perry.es/wp-content/plugins/AndroidShort/images/android_badge.png" /></a></p>
<p>Próximamente le meteré más cosillas, como posibilidad de usar grados fahrenheit, y mejoraré la estimación de tiempos con estadística de la buena. Ah, y está en inglés y en español.</p>
<p>Espero que le valga a alguien <img src='http://www.perry.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.perry.es/2011/05/13/battery-info-widget-para-android/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AnimeUnderground 1.4 para Android</title>
		<link>http://www.perry.es/2011/04/07/animeunderground-para-android-1-4/</link>
		<comments>http://www.perry.es/2011/04/07/animeunderground-para-android-1-4/#comments</comments>
		<pubDate>Thu, 07 Apr 2011 19:50:44 +0000</pubDate>
		<dc:creator>mrm</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[animeunderground]]></category>
		<category><![CDATA[animeunderground-android]]></category>
		<category><![CDATA[audev]]></category>

		<guid isPermaLink="false">http://www.perry.es/?p=2399</guid>
		<description><![CDATA[Para celebrar las 2000 descargas, he subido una actualización importante para la aplicación de Android de AU. El changelog, como podemos ver en el Android Market, es el que sigue: Novedades de esta versión: Rediseño del icono del launcher. Rediseño del widget. Añadida nueva ventana de login. Añadida nueva ventana de registro. Añadidas opciones en [...]]]></description>
			<content:encoded><![CDATA[<p>Para celebrar las 2000 descargas, he subido una actualización importante para la aplicación de Android de AU.</p>

<a href='http://www.perry.es/2011/04/07/animeunderground-para-android-1-4/au_login/' title='au_login'><img width="150" height="150" src="http://www.perry.es/extra/uploads/2011/04/au_login-150x150.png" class="attachment-thumbnail" alt="au_login" title="au_login" /></a>
<a href='http://www.perry.es/2011/04/07/animeunderground-para-android-1-4/au_registrarse/' title='au_registrarse'><img width="150" height="150" src="http://www.perry.es/extra/uploads/2011/04/au_registrarse-150x150.png" class="attachment-thumbnail" alt="au_registrarse" title="au_registrarse" /></a>
<a href='http://www.perry.es/2011/04/07/animeunderground-para-android-1-4/au_iconosnuevos/' title='au_iconosnuevos'><img width="150" height="150" src="http://www.perry.es/extra/uploads/2011/04/au_iconosnuevos-150x150.png" class="attachment-thumbnail" alt="au_iconosnuevos" title="au_iconosnuevos" /></a>
<a href='http://www.perry.es/2011/04/07/animeunderground-para-android-1-4/au_principal/' title='au_principal'><img width="150" height="150" src="http://www.perry.es/extra/uploads/2011/04/au_principal-150x150.png" class="attachment-thumbnail" alt="au_principal" title="au_principal" /></a>

<p>El changelog, como podemos ver en el <a href="https://market.android.com/details?id=com.aunder.application&amp;feature=search_result">Android Market</a>, es el que sigue:</p>
<p>Novedades de esta versión:</p>
<ol>
<li>Rediseño del icono del launcher.</li>
<li>Rediseño del widget.</li>
<li>Añadida nueva ventana de login.</li>
<li>Añadida nueva ventana de registro.</li>
<li>Añadidas opciones en configuración.</li>
<li>Mejoras en el login del foro.</li>
<li>Corrección de FCs reportados por los usuarios.</li>
<li>Se han arreglado las noticias de Abyss, ya funcionan todas bien y se muestran correctamente con su foto correspondiente.</li>
<li>Se han arreglado los errores que salían al hacer check-in de una serie.</li>
</ol>
<p>De paso, aprovecho para comentar que están en desarrollo versiones de AU para Windows Phone 7 y para dispositivos iOS 4.3.1 (en principio), sin tiempo estimado de salida, puesto que se hacen en los ratos libres cuando no pasamos el día trabajando.</p>
<p>Es que en <a href="http://www.audev.net">AUDev</a> molamos más que un <a href="http://spb.fotolog.com/photo/59/58/11/sopademerluza/1243092940827_f.jpg">bocata de chopped</a>, y que el esmegma de un <a href="http://images.wikia.com/starwars/images/6/6c/Rancor.jpg">rancor</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perry.es/2011/04/07/animeunderground-para-android-1-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aplicaciones imprescindibles para tu Android</title>
		<link>http://www.perry.es/2011/03/22/aplicaciones-imprescindibles-para-tu-android/</link>
		<comments>http://www.perry.es/2011/03/22/aplicaciones-imprescindibles-para-tu-android/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 14:48:14 +0000</pubDate>
		<dc:creator>mrm</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[aplicaciones]]></category>

		<guid isPermaLink="false">http://www.perry.es/?p=2367</guid>
		<description><![CDATA[Aprovechando la &#8220;Androidificación&#8221; de mucha gente que me rodea, como siempre les suelto el mismo rollo de por dónde empezar y qué instalarse, voy a centralizarlo todo en un post para poder ahorrarme horas de mi vida (para variar, sólo escribo aquí cuando me quita trabajo xD). La mayoría de aplicaciones son multiplataforma, así que [...]]]></description>
			<content:encoded><![CDATA[<p>Aprovechando la &#8220;Androidificación&#8221; de mucha gente que me rodea, como siempre les suelto el mismo rollo de por dónde empezar y qué instalarse, voy a centralizarlo todo en un post para poder ahorrarme horas de mi vida (para variar, sólo escribo aquí cuando me quita trabajo xD). La mayoría de aplicaciones son multiplataforma, así que supongo que se puede aprovechar el post para gente de iOS y Blackberry, aunque no todas valen, claro.</p>
<h2><a href="https://market.android.com/details?id=com.google.android.gm">Gmail</a></h2>
<p>Si tu dispositivo Android tiene google apps, tienes este programa por defecto instalado. Y, sin duda, es el mejor cliente de correo con el que contamos, hasta el punto que las otras cuentas POP3/IMAP que tengo he acabado haciendo que se descarguen en Gmail. Además, con tecnología PUSH por la patilla, te enteras al momento si te llega algún correo.</p>
<div id='app914' class='appbrain-app'><a href='http://www.appbrain.com/app/gmail/com.google.android.gm' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Gmail for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.whatsapp">Whatsapp</a></h2>
<p>A todo el mundo se lo digo: instalaos esta aplicación. Es un sistema de mensajería multiplataforma (iOS, Symbian, Android, Blackberry, y próximamente WP7) que utiliza la conexión de datos y la tecnología PUSH para la comunicación, con las ventajas que esto conlleva: adiós a los malditos y carísimos SMS, recepción instantánea, y posibilidad de crear grupos de usuarios. La aplicación para Android es gratuita el primer año, y a partir de entonces, costará del orden de un par de euros al año. Pero se compensa con creces, la verdad. Además, para mí el mayor incentivo de la aplicación es el siguiente: con que tengas a alguien que tenga Whatsapp en tu agenda del móvil, ya te saldrá como contacto en la aplicación. Y es más, como tengas un dispositivo con Sense 2.x, con tenerle en Facebook, Gtalk, o cualquier otro lado que tengas sincronizado con el SO, te bastará para que te salga como contacto.</p>
<p>Hay alternativas a esta aplicación, pero la mayoría requieren un nombre de usuario para añadir a amigos y demás: Kik messenger, PingChat, Beluga, etc. Y próximamente también tendremos el BBM.</p>
<div id='app314' class='appbrain-app'><a href='http://www.appbrain.com/app/whatsapp-messenger/com.whatsapp' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>WhatsApp Messenger for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.facebook.katana">Facebook</a></h2>
<p>Ya todo el mundo tiene uno. La aplicación es bastante completa, y van añadiéndole mejoras (incluso algunas que son exclusivas para móvil). El chat funciona bastante bien, la mensajería igual, y salvo algún error tipográfico en la versión en español (ese &#8220;fotosn&#8221; que lleva eones ahí puesto y nadie corrige) va como la seda. Además, se te sincroniza en el calendario del móvil con los eventos de cumpleaños y demás, que hacen que ya no me olvide jamás de felicitar a la gente <img src='http://www.perry.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id='app209' class='appbrain-app'><a href='http://www.appbrain.com/app/facebook-for-android/com.facebook.katana' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Facebook for Android for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.google.android.apps.maps">Latitude</a></h2>
<p>Es muy stalker y entra ya en terrenos pantanosos de privacidad/seguridad y tal, pero para gente con la que tienes mucha confianza como amigos cercanos/novias/etc va de perlas: puedes saber en todo momento por dónde andan. El sábado pasado, mismamente, nos fue bastante útil para encontrarnos con unos amigos sin tener que gastar dinero en teléfono/sms y demás. Y seguro que más de algún caso se habrá dado con gente que ha pillado a su pareja poniéndole los tochos gracias a esto xD</p>
<p>Para el que no lo sepa, es un servicio que tiene Google Maps que nos indica sobre el mapa dónde están nuestros amigos con cuenta en el mismo servicio y que nos han dado permiso para poder ver su ubicación. Yo lo uso muy a menudo para saber más o menos a la hora a la que llegará maca a casa, viendo cuánto le queda.</p>
<div id='app455' class='appbrain-app'><a href='http://www.appbrain.com/app/google-maps/com.google.android.apps.maps' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Google Maps for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.nullsoft.winamp">Winamp</a></h2>
<p>Después de probar muchas aplicaciones de música para el móvil (la stock, doubleTwist, aMusic y demás), me quedo descaradamente con Winamp para escuchar mis canciones en formato digital de toda la vida. Además, tiene opciones que usándolas en conjunción con el Winamp del PC de escritorio, le dan una funcionalidad añadida bestial, como la sincronización OTA de las canciones en la librería. Además, tienes acceso a las radios y música variada por la patilla.</p>
<div id='app880' class='appbrain-app'><a href='http://www.appbrain.com/app/winamp/com.nullsoft.winamp' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Winamp for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.spotify.mobile.android.ui">Spotify</a></h2>
<p>En el caso de que tengáis Spotify Premium como yo, es un MUST HAVE. Poder escuchar toda la música que quieras y donde quieras es un lujazo, yo mismo soy fan de escuchar música mientras limpio la casa, y me motivo a saco. O mientras trabajo también le doy bastante tralla. Además, para el caso de que os veáis obligados a gastar el 3G con algún plan con límites de datos, siempre podéis en la comodidad de vuestra casa (con WiFi) asignar listas de reproducción para que se conserven offline. Una pega gorda es que no cuenta con las características de Radio en la versión móvil, no sé muy bien porqué.</p>
<h2><a href="https://market.android.com/details?id=com.joelapenna.foursquared">Foursquare</a></h2>
<p>Es una cosa un poco rara de describir: un jueguecito que utiliza la geolocalización para permitirte hacer &#8220;check in&#8221; cada vez que vas a un lugar nuevo, pudiendo compartirlo con tus amigos. Además por el hecho de hacer check ins y compartirlos te dan puntos y logros, para incentivar su utilización, y algunas tiendas poseen acuerdos con la empresa que permiten recibir promociones especiales por usar la aplicación con su establecimiento, como por ejemplo cafés gratis en Starbucks, descuentos en productos en El Corte Inglés, etc.</p>
<div id='app969' class='appbrain-app'><a href='http://www.appbrain.com/app/foursquare/com.joelapenna.foursquared' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Foursquare for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.twitter.android">Twitter</a> (<a href="https://market.android.com/details?id=com.levelup.touiteur">Plume</a>/<a href="https://market.android.com/details?id=com.thedeck.android.app">TweetDeck</a>)</h2>
<p>Para estar al tanto de tu timeline propongo dos aplicaciones, ya que cada una tiene sus pros y sus contras. Personalmente, mi debilidad es Plume (antes conocida como Touiteur), ya que por interfaz y funcionalidad es la más completa. Tiene dos versiones, una de pago (baratita) y una gratuita, que tiene unas funcionalidades de menos.</p>
<p>El TweetDeck, como sus homólogos en aplicaciones de escritorio, tiene todas las funcionalidades necesarias para twittear lo que nos de la gana, y de forma totalmente gratuita, además de implementar soporte a otras redes sociales como Facebook y Foursquare, ofreciéndonos un timeline más completo y organizado. Como pega, que le faltan cosas como el autocompletado de nombres de usuario y algunas tonterías más. Por preferencia personal, recomiendo Plume, pero para el gran público, TweetDeck parte la pana.</p>
<p>La aplicación oficial, Twitter, tampoco está nada mal, aunque algunas características que le faltan hace que no lo tenga muy en cuenta para uso personal.</p>
<div id='app249' class='appbrain-app'><a href='http://www.appbrain.com/app/twitter/com.twitter.android' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Twitter for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<div id='app786' class='appbrain-app'><a href='http://www.appbrain.com/app/plume-for-twitter/com.levelup.touiteur' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Plume for Twitter for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<div id='app559' class='appbrain-app'><a href='http://www.appbrain.com/app/tweetdeck-(twitter-facebook)/com.thedeck.android.app' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>TweetDeck (Twitter, Facebook) for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.skype.raider">Skype</a></h2>
<p>El rey de las aplicaciones VoIP tiene una buena aplicación para Android, que integra la posibilidad de utilizar su producto de voz, así como de usar el chat indistintamente. Tiene un buen sistema de búsqueda de contactos, sincronizándolos con todos los existentes en el teléfono, que me ayudó a encontrar y a añadir a multitud de usuarios que de otra manera no hubiera podido encontrar. La aplicación funciona relativamente bien, con algún que otro bug de vez en cuando, pero que se ve minimizado por la gran utilidad que te da, el gran ahorro que consigues, y la certeza de que te pueden encontrar siempre que conserves tu conexión a internet para una conversación gratuita.</p>
<div id='app696' class='appbrain-app'><a href='http://www.appbrain.com/app/skype/com.skype.raider' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Skype for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.bazaarlabs.miso">Miso</a></h2>
<p>Con los smartphones llegó la moda del check in a todo, pues ea: un sistema de check in para series, películas, y hasta programas de la tele, que te permite saber cuáles son las tendencias actualmente en el panorama audiovisual mundial, saber qué ven tus amigos, e incluso saber qué opina la gente de lo que ve. Es bastante curioso, la verdad, aunque últimamente no lo esté utilizando mucho (por el #epicpal más que nada).</p>
<div id='app214' class='appbrain-app'><a href='http://www.appbrain.com/app/miso/com.bazaarlabs.miso' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Miso for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.google.android.apps.maps">Google Maps</a></h2>
<p>Creo que es la aplicación más <em>killer</em> que puedes tener en un smartphone, y más para alguien en mi misma situación, viviendo en una ciudad que todavía no conoces. Entre la utilidad propia de maps para conocer cualquier lugar del mundo a vista de pájaro, puedes integrar el Street View (bajado por separado) para ver las cosas a pie de calle, puedes utilizar el Hotpot para valorar lugares (hoteles, restaurantes, etc), puedes utilizar el Navigator a modo de GPS (y funciona realmente bien, me hizo olvidar el Tomtom), puedes hacer check in en lugares a modo de Foursquare&#8230; vamos, lo tiene todo.</p>
<div id='app455v2' class='appbrain-app'><a href='http://www.appbrain.com/app/google-maps/com.google.android.apps.maps' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Google Maps for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.google.android.apps.reader">Google Reader</a></h2>
<p>Para gestor de feeds antes utilizaba la aplicación web móvil del Reader, y desde hace unos meses que ya está una aplicación (bastante simple, por cierto) pues la utilizo. Cumple perfectamente su cometido, y me mantiene informado: no le pido más.</p>
<p>A alguna gente le gusta también el Pulse, y la verdad es que no está nada mal, pero #epicpal configurarlo.</p>
<div id='app99' class='appbrain-app'><a href='http://www.appbrain.com/app/google-reader/com.google.android.apps.reader' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Google Reader for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.dropbox.android">Dropbox</a></h2>
<p>Para pasarme cosas entre PCs y dispositivos, da bastante perrería andar enchufando cables y demás, así que lo ideal es utilizar un servicio como Dropbox. Pues con su versión de Android, me paso las fotos que quiero al PC al momento. Un gustazo, oye.</p>
<div id='app575' class='appbrain-app'><a href='http://www.appbrain.com/app/dropbox/com.dropbox.android' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>Dropbox for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
<h2><a href="https://market.android.com/details?id=com.aunder.application">AnimeUnderground</a></h2>
<p>Por supuesto, la mejor aplicación del universo. Sin duda. Y del mejor fansub.</p>
<div id='app395' class='appbrain-app'><a href='http://www.appbrain.com/app/animeunderground/com.aunder.application' style='font-size: 11px; color: #555; font-family: Arial, sans-serif;'>AnimeUnderground for Android on AppBrain</a></div>
<p> <script type='text/javascript' language='javascript' src='http://www.appbrain.com/api/api.nocache.js'></script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.perry.es/2011/03/22/aplicaciones-imprescindibles-para-tu-android/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>AnimeUnderground para Android</title>
		<link>http://www.perry.es/2010/11/21/animeunderground-para-android/</link>
		<comments>http://www.perry.es/2010/11/21/animeunderground-para-android/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 20:15:24 +0000</pubDate>
		<dc:creator>mrm</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[animeunderground]]></category>
		<category><![CDATA[animeunderground-android]]></category>

		<guid isPermaLink="false">http://www.perry.es/?p=1510</guid>
		<description><![CDATA[Tras más de un mes sin poner nada por aquí, algo pasaba que me tenía tan ocupado. Pues eran varias cosas, entre ellas esta aplicación. La aplicación para Android de AnimeUnderground. Con ella podréis ver las últimas noticias, toda la información sobre nuestras series y sobre los miembros de AU. También proporciona acceso rápido al [...]]]></description>
			<content:encoded><![CDATA[<p>Tras más de un mes sin poner nada por aquí, algo pasaba que me tenía tan ocupado. Pues eran varias cosas, entre ellas esta aplicación. La aplicación para <strong>Android </strong>de <strong>AnimeUnderground</strong>.</p>
<p>Con ella podréis ver las últimas noticias, toda la información sobre nuestras series y sobre los miembros de AU. También proporciona acceso rápido al foro, y te notifica cuando haya una nueva noticia. Además, incorpora un widget de 4&#215;1 para estar al tanto de la última noticia y dar un acceso rápido a la misma y a la aplicación completa.</p>
<p>Os dejo unas cuantas capturas de la misma (hacedles click para verlas mejor).</p>

<a href='http://www.perry.es/2010/11/21/animeunderground-para-android/captura-1/' title='captura-1'><img width="150" height="150" src="http://www.perry.es/extra/uploads/2010/11/captura-1-150x150.png" class="attachment-thumbnail" alt="captura-1" title="captura-1" /></a>
<a href='http://www.perry.es/2010/11/21/animeunderground-para-android/captura-2/' title='captura-2'><img width="150" height="150" src="http://www.perry.es/extra/uploads/2010/11/captura-2-150x150.png" class="attachment-thumbnail" alt="captura-2" title="captura-2" /></a>
<a href='http://www.perry.es/2010/11/21/animeunderground-para-android/captura-3/' title='captura-3'><img width="150" height="150" src="http://www.perry.es/extra/uploads/2010/11/captura-3-150x150.png" class="attachment-thumbnail" alt="captura-3" title="captura-3" /></a>
<a href='http://www.perry.es/2010/11/21/animeunderground-para-android/captura-4/' title='captura-4'><img width="150" height="150" src="http://www.perry.es/extra/uploads/2010/11/captura-4-150x150.png" class="attachment-thumbnail" alt="captura-4" title="captura-4" /></a>
<a href='http://www.perry.es/2010/11/21/animeunderground-para-android/captura-5/' title='captura-5'><img width="150" height="150" src="http://www.perry.es/extra/uploads/2010/11/captura-5-150x150.png" class="attachment-thumbnail" alt="captura-5" title="captura-5" /></a>
<a href='http://www.perry.es/2010/11/21/animeunderground-para-android/captura-6/' title='captura-6'><img width="150" height="150" src="http://www.perry.es/extra/uploads/2010/11/captura-6-150x150.png" class="attachment-thumbnail" alt="captura-6" title="captura-6" /></a>

<p>Podéis descargarla, valorarla, y demás en este enlace.</p>
<div id="app198" class="appbrain-app"><a style="font-size: 11px; color: #555; font-family: Arial, sans-serif;" href="http://www.appbrain.com/app/animeunderground/com.aunder.application">AnimeUnderground for Android on AppBrain</a></div>
<p><script src="http://www.appbrain.com/api/api.nocache.js" type="text/javascript"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.perry.es/2010/11/21/animeunderground-para-android/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Swype: Aprovechad mientras se pueda</title>
		<link>http://www.perry.es/2010/06/18/swype-aprovechad-mientras-se-pueda/</link>
		<comments>http://www.perry.es/2010/06/18/swype-aprovechad-mientras-se-pueda/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 12:05:55 +0000</pubDate>
		<dc:creator>mrm</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[swype]]></category>

		<guid isPermaLink="false">http://www.perry.es/?p=1420</guid>
		<description><![CDATA[El gran teclado Swype, quizá el mejor que haya podido probar, ha vuelto a abrir su beta de Android al público. La verdad es que le pega mil vueltas a todos los demás, SlideIT y sus demás copias, o los Better Keyboard, y otras zarandajas. Una vez te acostumbras a él, es difícil volver a [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-1421" title="swype kicks ass" src="http://www.perry.es/extra/uploads/2010/06/myTouch-black-150x150.jpg" alt="" width="150" height="150" />El gran teclado Swype, quizá el mejor que haya podido probar, <a href="http://beta.swype.com/">ha vuelto a abrir su beta de Android al público</a>.</p>
<p>La verdad es que le pega mil vueltas a todos los demás, SlideIT y sus demás copias, o los Better Keyboard, y otras zarandajas. Una vez te acostumbras a él, es difícil volver a cualquier otra cosa. Y una vez tienes enseñado al teclado para las palabras que más sueles usar, es una delicia.</p>
<p>Además, es más fácil acertar así estando en algo que se mueve bacheado como un coche o el tren. Lo dicho, soy un enamorado de este teclado.</p>
<p>Yo ahora, pese a estar registrado en la beta, lo tengo puesto de otro lugar, con una skin similar al teclado de HTC que está bastante bien. Si alguien quiere probarlo, le dejo por aquí el APK (para WVGA, resolución del Desire y el Nexus One entre otros).</p>
<a href="http://www.perry.es/descargas/Swype+WVGA+con+skin+HTC">Swype WVGA con skin HTC</a> 1.56.30.7625 - 293 hits
]]></content:encoded>
			<wfw:commentRss>http://www.perry.es/2010/06/18/swype-aprovechad-mientras-se-pueda/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Migración completada</title>
		<link>http://www.perry.es/2010/05/18/migracion-completada/</link>
		<comments>http://www.perry.es/2010/05/18/migracion-completada/#comments</comments>
		<pubDate>Tue, 18 May 2010 14:00:06 +0000</pubDate>
		<dc:creator>mrm</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[Random]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[htc desire]]></category>

		<guid isPermaLink="false">http://www.perry.es/?p=1372</guid>
		<description><![CDATA[Pues eso, escribo ahora mismo desde la Desire y es una maravilla. Estoy probando el WPToGo y va bastante bien. Ahora que me familiarize un poco más con las aplicaciones y le de bastante tute, pondré algún post con las apps más curiosas o algo. Ah, y dentro de poco subiré un programita nuevo que [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.perry.es/extra/uploads/2010/05/wpid-IMAG0001.jpg"><img class="alignleft" style="display: block; margin-top: 2px; margin-bottom: 2px; margin-left: 5px; margin-right: 5px;" title="Con la cámara no puedo sacarle fotos al propio móvil, claro xD" src="http://www.perry.es/extra/uploads/2010/05/wpid-IMAG0001.jpg" alt="image" width="90" height="160" /></a></p>
<p>Pues eso, escribo ahora mismo desde la Desire y es una maravilla. Estoy probando el WPToGo y va bastante bien.</p>
<p>Ahora que me familiarize un poco más con las aplicaciones y le de bastante tute, pondré algún post con las apps más curiosas o algo.</p>
<p>Ah, y dentro de poco subiré un programita nuevo que he hecho, que no tiene nada que ver con móviles ni nada, pero eso, que no he muerto ni nada xD</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perry.es/2010/05/18/migracion-completada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Preparando la migración a Android</title>
		<link>http://www.perry.es/2010/05/10/preparando-la-migracion-a-android/</link>
		<comments>http://www.perry.es/2010/05/10/preparando-la-migracion-a-android/#comments</comments>
		<pubDate>Mon, 10 May 2010 10:10:51 +0000</pubDate>
		<dc:creator>mrm</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[Random]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[htc desire]]></category>

		<guid isPermaLink="false">http://www.perry.es/?p=1368</guid>
		<description><![CDATA[Como niño con zapatos nuevos, así voy a estar en cuanto me llegue mi nuevo retoño: el HTC Desire. Acostumbrado al WinMo 6.1/6.5, tengo muchas ganas de pillar por banda un Android, que aunque he podido trastear en mi Diamond con XDAndroid, la experiencia no será completa hasta probarlo con la bestia de 1GHz ya [...]]]></description>
			<content:encoded><![CDATA[<p>Como niño con zapatos nuevos, así voy a estar en cuanto me llegue mi nuevo retoño: el <strong>HTC Desire</strong>.</p>
<p><a href="http://www.perry.es/extra/uploads/2010/05/android.jpg"><img class="alignleft size-full wp-image-1369" title="android" src="http://www.perry.es/extra/uploads/2010/05/android.jpg" alt="" width="300" height="300" /></a>Acostumbrado al WinMo 6.1/6.5, tengo muchas ganas de pillar por banda un Android, que aunque he podido trastear en mi Diamond con <strong>XDAndroid</strong>, la experiencia no será completa hasta probarlo con la bestia de 1GHz ya comentada.</p>
<p>Ahora tocará empollar de blogs y webs variadas que se dedican a la información sobre el sistema operativo móvil de Google.</p>
<p>Y de paso, aprovecho para nombrar a <a href="http://www.elandroidelibre.com/">El Androide Libre</a> por su sorteo del N1, que es otra bestia parda, y prima de mi Desire. A ver si es verdad que me llega mañana, por cierto, que tengo monarro.</p>
<p>A ver cuánto tardo en rootear y meterle una ROM nueva&#8230; y cuánto tarda en salir Froyo para instalar APPs en la SD (si no rooteo antes). Ya comentaré alguna cosilla al respecto, e igual hago un post recopilatorio de apps interesantes cuando ya lleve un tiempo de uso, <a href="http://www.perry.es/2010/03/mis-10-aplicaciones-imprescindibles-en-windows-mobile/">como hice con WinMo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.perry.es/2010/05/10/preparando-la-migracion-a-android/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

