tag:blogger.com,1999:blog-41468902714537009172023-11-15T16:42:41.130+01:00light byteDesarrollo de aplicaciones Android.Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-4146890271453700917.post-6069185023354813972012-06-20T18:36:00.001+02:002012-06-20T18:36:20.802+02:00lightbyte.org<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.lightbyte.org/"><img border="0" src="http://www.lightbyte.org/img/title.png" /></a></div>
<br />
Hola a todos. <br />
Este es el último post que escribiré en este blog porque me he mudado a mi propio dominio <a href="http://www.lightbyte.org/">http://www.lightbyte.org</a> :)<br />
En mi sitio web no sólo hablaré de Android, sino de desarrollo web, Ubuntu y, en general, de todo lo que quiera.<br />
Espero verte por allí la próxima vez! <br />
<br />
<br />
<div style="color: #999999;">
<span style="font-size: xx-small;">--------English version--------</span></div>
<br />
Hi all.<br />
This is the last post I will write in this blog because I've moved to my own domain <a href="http://www.lightbyte.org/">http://www.lightbyte.org</a> :p<br />
In my own website I will not talk only about Android but web development, Ubuntu and, in general, about whatever I want.<br />
I hope to see you there next time!<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com0tag:blogger.com,1999:blog-4146890271453700917.post-82755859168598897062011-07-29T01:08:00.000+02:002011-07-29T01:08:58.652+02:00Nuevo diseño de "Say It Quietly"El <a href="http://lightbyte.blogspot.com/2011/07/mi-primer-proyecto-say-it-quietly.html">primer post</a> donde anuncié el proyecto "Say It Quietly" mostraba una interfaz gráfica poco trabajada. No es que ahora haya trabajado mucho más, pero es que yo no soy diseñador y para mi el mundo de las imágenes es complicado.<br />
Bueno, se que no es nada del otro mundo y que queda mucho por hacer. Algo mejorada con respecto al anterior diseño sí que está.<br />
Espero que siga siendo intuitiva!<br />
Creo que sea como fuere, se quedará así algún tiempecito... <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-MlbffDJ-jp0/TjHp2PrzKnI/AAAAAAAAAJM/Nqqy_mmjIs4/s1600/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-MlbffDJ-jp0/TjHp2PrzKnI/AAAAAAAAAJM/Nqqy_mmjIs4/s320/Screenshot.png" width="215" /></a></div><br />
¿Se te ocurre algún consejo o mejora?Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com1tag:blogger.com,1999:blog-4146890271453700917.post-73977565983711507112011-07-29T00:51:00.000+02:002011-07-29T00:51:51.454+02:00Comportamientos del Canvas.drawBitmap()Intentando dar soporte a mi aplicación <a href="http://lightbyte.blogspot.com/2011/07/mi-primer-proyecto-say-it-quietly.html">Say It Quietly</a> para todas las versiones de Android he dado con un problema al que, al comienzo de este post, no tengo muy claro como arreglarlo. Al menos se me ocurre una solución posible.<br />
<br />
<u><b>El problema:</b></u><br />
<br />
Antes de nada, voy a intentar describir el problema. El texto es escrito en un bitmap. En cada repetición del thread voy recorriendo el bitmap con un Rect de ancho fijo (el alto de la pantalla, o el ancho si hablamos de landscape). El problema viene cuando el bitmap entra en escena, el Rect tiene valores negativos; o cuando el bitmap sale de escena, el right del Rect tiene valores que no pertenecen al bitmap.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-zf_wHeY9p_E/TjEkIUif3aI/AAAAAAAAAIs/SEFpLwItjYM/s1600/post-drawBitmap-problem.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-zf_wHeY9p_E/TjEkIUif3aI/AAAAAAAAAIs/SEFpLwItjYM/s1600/post-drawBitmap-problem.png" /></a></div><br />
En este gráfico se ve que tanto al aparecer el bitmap en pantalla como al salir de ella el Rect abarca un espacio vacío. Esto causa que <b>en versiones de Android anteriores a la 2.2 drawBitmap estire la imagen al pintarla en la pantalla</b>. Esto es lo que se ve:<br />
<br />
Pantallazos de la entrada del texto en escena. Se puede apreciar como se estira la "S":<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-aP0WzWWHD4M/TjHkvMR3bCI/AAAAAAAAAIw/n4hmkywAdc8/s1600/Screenshot-drawBitmap01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-aP0WzWWHD4M/TjHkvMR3bCI/AAAAAAAAAIw/n4hmkywAdc8/s200/Screenshot-drawBitmap01.png" width="135" /></a> <a href="http://3.bp.blogspot.com/-2ANdtzQnvTU/TjHkvjfeZZI/AAAAAAAAAI0/3_MrwiaKqC0/s1600/Screenshot-drawBitmap02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-2ANdtzQnvTU/TjHkvjfeZZI/AAAAAAAAAI0/3_MrwiaKqC0/s200/Screenshot-drawBitmap02.png" width="134" /></a> <a href="http://4.bp.blogspot.com/-TWV0vWlPqts/TjHkwOJpy3I/AAAAAAAAAI4/ASRqTh_at0w/s1600/Screenshot-drawBitmap03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/-TWV0vWlPqts/TjHkwOJpy3I/AAAAAAAAAI4/ASRqTh_at0w/s200/Screenshot-drawBitmap03.png" width="134" /></a></div><br />
<br />
Pantallazos de la salida del texto de la escena. Se puede apreciar como se estira la "Y":<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-ed-n0MjCtsg/TjHkw_FrAXI/AAAAAAAAAJA/UKnLoWgEBc8/s1600/Screenshot-drawBitmap05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-ed-n0MjCtsg/TjHkw_FrAXI/AAAAAAAAAJA/UKnLoWgEBc8/s200/Screenshot-drawBitmap05.png" width="133" /></a> <a href="http://3.bp.blogspot.com/-9HDNZ9FY3qI/TjHkxYeytvI/AAAAAAAAAJE/Tt9NzE53Gmo/s1600/Screenshot-drawBitmap06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-9HDNZ9FY3qI/TjHkxYeytvI/AAAAAAAAAJE/Tt9NzE53Gmo/s200/Screenshot-drawBitmap06.png" width="135" /></a> <a href="http://4.bp.blogspot.com/-jEnoZUa5X_8/TjHkxtVzk1I/AAAAAAAAAJI/tXnX8DTHXOc/s1600/Screenshot-drawBitmap07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/-jEnoZUa5X_8/TjHkxtVzk1I/AAAAAAAAAJI/tXnX8DTHXOc/s200/Screenshot-drawBitmap07.png" width="134" /></a></div><br />
<br />
<br />
<u><b>Solución fácil:</b></u><br />
<br />
Es fácil porque no hay que pensar nada, simplemente programar para ajustar los Rect pasados al drawBitmap, de esta forma no habrá <i>stretching</i>.<br />
<br />
<u><b>Solución difícil:</b></u><br />
<br />
Buscar si existe algún parámetro en el <i>Canvas</i> o el <i>Paint </i>o en algún sitio para cambiar el comportamiento del <i>drawBitmap </i>dependiendo de la versión de Android en que estemos corriendo la aplicación para que no haga <i>stretching</i>. Esto es "dificil" porque no se si existe algo así.<br />
<br />
Cualquier idea para solucionar esto será bien recibida. Mientras tanto yo seguiré por el camino "fácil" que es un lío con los Rect, las posiciones y demás.Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com3tag:blogger.com,1999:blog-4146890271453700917.post-18710124564346121952011-07-21T01:06:00.001+02:002011-07-21T15:35:27.949+02:00Mi primer proyecto, "Say It Quietly"<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-S1dNY43_8sQ/TiYIYOgkybI/AAAAAAAAAG0/XxF0cTOOyvI/s1600/SayItQuietly320x125.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://2.bp.blogspot.com/-S1dNY43_8sQ/TiYIYOgkybI/AAAAAAAAAG0/XxF0cTOOyvI/s1600/SayItQuietly320x125.png" /></a></div>Por fin puedo enseñaros algo de mi aplicación <b><i>Say It Quietly</i></b>.<br />
La empecé hace ya casi un año, septiembre de 2010. No es que lleve todo este tiempo trabajando en ella. La he dedicado más bien poco tiempo.<br />
<br />
<u><b>La idea:</b></u><br />
<br />
La idea es poder escribir un texto con la letra más grande que quepa en la pantalla. Parece muy sencillo, no? Pues veréis como la puedo liar parda. Al menos tengo la excusa que estoy aprendiendo... jeje<br />
<br />
<u><b>El market:</b></u><br />
<br />
Después de unas búsquedas por Internet y el Market no encontré más que una aplicación que hiciera lo que había pensado, y casi incluso coincidimos en el nombre, la otra se llama "Say It Laud". Como veis los conceptos son diferentes jeje.<br />
<br />
<u><b>Funcionamiento:</b></u><br />
<br />
Al ejecutar la aplicación aparece la pantalla donde escribir el texto a mostrar, elegir la velocidad de scroll, el color de fondo y color de texto (en próximas versiones) y un botón para cambiar a la otra pantalla.<br />
La otra pantalla será la de mostrar el texto a pantalla completa quitando la barra de estado y haciendo el texto lo más grande posible.<br />
<br />
Interfaz de usuario actual (en desarrollo, son sólo pruebas de diseño):<br />
Pantalla 1:<br />
<div class="separator" style="clear: both; text-align: left;"><a href="http://4.bp.blogspot.com/-UwR6H_B4cyk/TiYEkifRM9I/AAAAAAAAAGs/sITbbqIRjEo/s1600/Screenshot01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/-UwR6H_B4cyk/TiYEkifRM9I/AAAAAAAAAGs/sITbbqIRjEo/s200/Screenshot01.png" width="133" /></a></div><br />
Pantalla 2:<br />
<div class="separator" style="clear: both; text-align: left;"><a href="http://4.bp.blogspot.com/-I2xPWBE78W8/TiYEltu139I/AAAAAAAAAGw/Kwmuc81TpaY/s1600/Screenshot02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/-I2xPWBE78W8/TiYEltu139I/AAAAAAAAAGw/Kwmuc81TpaY/s200/Screenshot02.png" width="133" /></a></div><br />
<br />
<u><b>Problemas encontrados:</b></u><br />
<br />
<ul><li><b>Selector de color</b>. Todavía estoy pensando como hacer un selector de color chulo que no sea una simple lista con colores predefinidos ya que no he encontrado ningún widget para esto.<b> </b></li>
<li><b>Cálculo del tamaño del texto</b>. Hay que sacar el tamaño de la pantalla y la densidad para saber qué tamaño de letra establecer. Pongo un gráfico explicativo de las dimensiones de un glifo (glyph) sacado de la <a href="http://en.wikipedia.org/wiki/Typeface">wikipedia</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://upload.wikimedia.org/wikipedia/commons/3/39/Typography_Line_Terms.svg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="85" src="http://upload.wikimedia.org/wikipedia/commons/3/39/Typography_Line_Terms.svg" width="320" /></a></div><br />
<div class="command"><br />
public void buildBitmap(int width, int height) {<br />
<br />
<span style="color: #38761d;">// Establezco algunos parámetros del Paint que </span><br />
<span style="color: #38761d;"> // usaré para pintar el texto. </span><br />
Paint paint = new Paint();<br />
paint.setStyle(Paint.Style.FILL_AND_STROKE);<br />
paint.setAntiAlias(true);<br />
paint.setTypeface(Typeface.MONOSPACE);<br />
<br />
<span style="color: #38761d;">// Obtengo la densidad para calcular el tamaño del texto</span><br />
float density = getContext().getResources()<br />
.getDisplayMetrics().density;<br />
<span style="color: #38761d;">// Establezco el tamaño del texto </span><br />
paint.setTextSize(height * density);<br />
<br />
<span style="color: #93c47d;"> <span style="color: #38761d;">// Obtengo las FontMetrics para ver cuanto desciende </span></span><br />
<span style="color: #93c47d;"><span style="color: #38761d;"> // la fuente desde la línea base y así poder </span></span><br />
<span style="color: #93c47d;"><span style="color: #38761d;"> // centrar el texto verticalmente.</span></span><br />
FontMetricsInt fmi = new FontMetricsInt();<br />
paint.getFontMetricsInt(fmi);<br />
<br />
<span style="color: #38761d;">// Para sacar el ancho del texto uso el <b>measureText</b>.</span><br />
<span style="color: #38761d;"> // La función <b>paint.getTextBounds()</b> me devolvía el </span><br />
<span style="color: #38761d;"> // ancho pero añadiendo por delante espacio y quitándolo </span><br />
<span style="color: #38761d;"> // de detrás, así que se quedaba el último carácter </span><br />
<span style="color: #38761d;"> // un poco cortado.</span><br />
int measureWidth = (int)paint.measureText(mText);<br />
<br />
<span style="color: #38761d;"> // Creo el bitmap del <b>ancho del texto</b> y<b> </b></span><br />
<span style="color: #38761d;"><b> // el alto de la pantalla</b></span><br />
mBitmap = Bitmap.createBitmap(measureWidth, height,<br />
Bitmap.Config.RGB_565);<br />
<br />
<span style="color: #38761d;"> // Creo un canvas que me permitirá editar el bitmap creado</span> <br />
Canvas canvas = new Canvas(mBitmap);<br />
<span style="color: #38761d;"> // Color de fondo y pinto el fondo</span> <br />
paint.setColor(mBackColor);<br />
canvas.drawRect(0, 0, measureWidth, height, paint);<br />
<br />
<br />
<span style="color: #38761d;">// Color de texto y pinto el texto.</span><br />
<div style="color: #38761d;"> // Los parámetros del drawText son el texto, </div><div style="color: #38761d;"> // la posición X e Y y el objeto Paint.</div><div style="color: #38761d;"> // <b>La <i>Y</i> tiene que ser donde quieres que esté la </b></div><div style="color: #38761d;"> //<b> línea base de tu texto.</b> Y <b>hay que contar con lo que </b></div><div style="color: #38761d;"> //<b> desciende, es decir que si quieres que se vean los </b></div><div style="color: #38761d;"> //<b> palitos de las "p", las "q"</b> etc, tienes que hacer<br />
// esta operación.</div> paint.setColor(mForeColor);<br />
canvas.drawText(mText, 0,<br />
(float)mBitmap.getHeight() - fmi.descent,<br />
paint);<br />
<br />
}<br />
<br />
</div>Bueno en el código ya he explicado todo, sólo añadir que <b>si alguien ve algo raro como el cálculo del tamaño del texto (<i>height * density</i>) que me lo diga</b> porque no tengo muy claro que sea así, sólo he probado en 1 emulador y en mi HTC Desire y va bien!.<br />
</li>
<li><b>Procedimiento de mover el texto:</b></li>
<ul><li><u>Un simple loop</u>. Bloquea la aplicación. La primera versión del programa no podía regresar a la pantalla anterior porque el loop bloqueaba todo.</li>
<li><u>Un thread</u>. Buena opción, pero no va suave. Ya podía regresar de la pantalla del texto pero el texto en movimiento iba a tirones y con problemas de refrescos. Todo debido a que todavía escribía el texto en la pantalla en cada iteración del thread.</li>
<li><u>Escribir el texto cada iteración</u>. Demasiados <i>drawText </i>y <i>new Paint </i>en la hebra de pintado. Con un <i>drawText </i>en cada iteración ya era suficiente para ralentizar. Mejor crear bitmap con el texto en el constructor y que la hebra maneje objetos creados anteriormente.</li>
</ul></ul>Aún así no estoy contento con el resultado, sigo buscando como hacer esto para que el texto se vea fluido y suave (Corrijo: Sí estoy contento! he probado el programa en el HTC y va genial! el emulador es una castaña comparado)<br />
De todas formas el siguiente paso será trabajar con las animaciones (clase Animator) y probar OpenGL. <br />
<ul><ul></ul></ul>Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com0tag:blogger.com,1999:blog-4146890271453700917.post-19432875736566948712011-07-19T19:03:00.000+02:002011-07-19T19:03:47.273+02:00Optimización del For (for-each)<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-TuKL0-0MuVg/TiW2Il-AjvI/AAAAAAAAAGo/mQxMbSkLyp4/s1600/for-each.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-TuKL0-0MuVg/TiW2Il-AjvI/AAAAAAAAAGo/mQxMbSkLyp4/s1600/for-each.png" /></a></div>Hace tiempo que conozco el <i><b>for-each</b></i> y nunca me he parado a pensar qué utilidad podría tener ese <i>for</i> teniendo uno que hace lo que quiero y no necesito ni pensar como usarlo.<br />
En las plataformas móviles parece que es aún más útil usar estas estructuras por lo de ahorrar tiempo de proceso y no gastar bateria.<br />
<br />
El for-each puede usarse para colecciones que implementan el interfaz <i>Iterable</i> y para Arrays. Con las colecciones, cada elemento implementa en su interfaz las llamadas a hasNext() y next(). Con un ArrayList, un for escrito a mano es cerca de 3 veces más rápido, y para las colecciones el for-each será exáctamente equivalente al uso del for con los ArrayList.<br />
Ejemplos:<br />
<br />
<div class="command"><span class="pln"></span>static class Foo {<br />
int mSplat;<br />
}<br />
Foo[] mArray = ...<br />
<br />
public void zero() {<br />
int sum = 0;<br />
for (int i = 0; i < mArray.length; ++i) {<br />
sum += mArray[i].mSplat;<br />
}<br />
}<br />
<br />
public void one() {<br />
int sum = 0;<br />
Foo[] localArray = mArray;<br />
int len = localArray.length;<br />
<br />
for (int i = 0; i < len; ++i) {<br />
sum += localArray[i].mSplat;<br />
}<br />
}<br />
<br />
public void two() {<br />
int sum = 0;<br />
for (Foo a : mArray) {<br />
sum += a.mSplat;<br />
}<br />
} </div><br />
<ul><li><b>zero()</b> es la más lenta porque el JIT no puede optimizar el coste de pedir el tamaño del array cada iteración.</li>
<li><b>one()</b> es más rápida. Guarda todo en variables locales, evitando tener que ir a buscarlas fuera del ámbito de la función. Y optimiza la petición del tamaño del Array.</li>
<li><b>two()</b> es la más rápida para dispositivos sin JIT, y distinguiblemente mejor que la <b>one()</b> para los dispositivos con JIT. Usa el for-each introducido en la versión 1.5 del lenguaje de programación Java.</li>
</ul><br />
<br />
En definitiva que me tendré que acostumbrar a usar for-each por defecto, salvo excepciones que necesite algo especial en iteraciones con ArrayList.<br />
<br />
<b></b><br />
<br />
JIT: Compilador al vuelo de la máquina virtual Dalvik (Just In Time compiler).<br />
<b></b><br />
Texto original y ejemplos via <a href="http://developer.android.com/guide/practices/design/performance.html#foreach">Use Enhanced For Loop Syntax</a><br />
<br />
<br />
<b></b>Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com0tag:blogger.com,1999:blog-4146890271453700917.post-21588684932572086532011-04-09T16:41:00.002+02:002011-05-17T09:14:10.488+02:00Interfaz gráfica y los servicios<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-NAZmR-LJtIM/TaBsYGx-2AI/AAAAAAAAAD0/6N5yWeJZMUs/s1600/steam-android.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-NAZmR-LJtIM/TaBsYGx-2AI/AAAAAAAAAD0/6N5yWeJZMUs/s200/steam-android.jpg" width="200" /></a></div><u><b>Como se hace un Service:</b></u> <br />
<br />
Esta semana hemos visto los servicios en el curso de Android. No me refiero a los aseos, no, me refiero a un tipo de objeto que se ejecuta en background y por definición no tiene interfaz gráfica ni puede modificar nada de ésta.<br />
<br />
<div class="command">public class MyService extends Service { <br />
@Override<br />
public IBinder onBind(Intent arg0) {<br />
// Este sirve para enlazarse con el Manager de Notificaciones <br />
// para que otros programas usen este servicio.<br />
return null;<br />
}<br />
<br />
@Override<br />
public void onCreate() {<br />
super.onCreate();<br />
Log.d("MyService", "Arrancando el servicio");<br />
}<br />
<br />
@Override<br />
public void onDestroy() {<br />
super.onDestroy();<br />
<br />
Log.d("MyService", "Cerrando el servicio");<br />
}<br />
}</div><br />
<u><b>Como se hace un Interface:</b></u><br />
<br />
También vimos como hacer que nuestro servicio avisara a nuestras Activities del interfaz gráfico de algún cambio, como por ejemplo en las coordenadas del GPS.<br />
Para el aviso vimos el uso de las interfaces, como esta:<br />
<br />
<div class="command">public interface IMyServiceListener {<br />
public void updateCurrentLocation(Location loc);<br />
}</div><br />
Una interfaz muy sencilla con un único método a implementar en las clases que la implementen.<br />
En el servicio además hay que añadir un ArrayList, por ejemplo, de Listeners del tipo IMyServiceListener y un par de métodos públicos para poder añadir y quitar elementos del ArrayList.<br />
<br />
<div class="command">public static void registerLocationListener(IMyServiceListener listener){<br />
mArrayListeners.add(listener);<br />
}<br />
<br />
public static void unregisterLocationListener(IMyServiceListener listener){<br />
mArrayListeners.remove(listener);<br />
}</div><br />
Para implementar la interfaz simplemente sería algo así:<br />
<br />
<div class="command">public class AdvancedList extends ListActivity <b>implements IMyServiceListener </b>{<br />
private Location mLocation;<br />
<br />
@Override<br />
<b>public void updateCurrentLocation(Location loc) {</b><br />
<br />
mLocation = loc;<br />
Log.d("UpdatingLocation", loc.toString());<br />
<br />
<i style="color: red;">Toast.makeText(this, "New location: " + <br />
String.valueOf(loc.getLatitude()) + "-" + <br />
String.valueOf(loc.getLongitude()), <br />
Toast.LENGTH_LONG);</i><br />
<br />
new getImageTask().execute();<br />
}<br />
<br />
/** Called when the activity is first created. */<br />
@Override<br />
public void onCreate(Bundle savedInstanceState) {<br />
super.onCreate(savedInstanceState);<br />
<br />
// Arrancanco el servicio creado. <br />
<b>startService(new Intent(this, MyService.class));</b><br />
<br />
// Añado esta clase como listener del servicio, porque<br />
// implementa la interfaz.<br />
<b>MyService.registerLocationListener(this);</b><br />
<br />
myAdapter = new MyAdapter(this);<br />
setListAdapter(myAdapter);<br />
}<br />
}</div><br />
Y cuando desde el servicio se quiera avisar a todos los listeners de algún cambio, podemos crear un método como el siguiente en el servicio y llamarlo cuando se necesite.<br />
<br />
<div class="command">private void notifyListeners(){<br />
Log.d("NotifyListeners",<br />
"Number of listeners " +<br />
String.valueOf(mArrayListeners.size()));<br />
<br />
for(int i = 0; i < mArrayListeners.size(); i++){<br />
mArrayListeners.get(i).updateCurrentLocation(mLocation);<br />
}<br />
}</div><br />
<b><u>Problema:</u></b><br />
<br />
Bueno, no quería contar toda la clase de ayer pero al final me he liado. Lo que yo quería contar es que aunque implementemos en nuestras Activities la interfaz del listener, cuando el Service llama a ese método de nuestra Activity, la ejecución sigue en la hebra del Service. Por lo cual ni el Toast que he puesto en la implementación del updateCurrentLocation, ni ningún cambio del interfaz gráfico será realizado.<br />
<br />
Por suerte no he tardado mucho en darme cuenta jeje, habrá que ver otra forma de avisar desde el servicio si se quiere modificar el interfaz gráfico.Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com0tag:blogger.com,1999:blog-4146890271453700917.post-65201259180684236062011-04-05T00:57:00.001+02:002011-04-05T00:57:59.606+02:00Como java.io.Serializable<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-hbAWRbDm5Jg/TZpId4UekoI/AAAAAAAAADw/LrF7K9Kyue4/s1600/serialization.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="150" src="http://3.bp.blogspot.com/-hbAWRbDm5Jg/TZpId4UekoI/AAAAAAAAADw/LrF7K9Kyue4/s200/serialization.gif" width="200" /></a></div>Bueno, yo poco a poco sigo con mis pequeños descubrimientos, y quiero pensar que a alguien le puede venir bien encontrarse con posts como este, que cuenta cosas que una vez sabidas parecen obvias.<br />
<br />
Todo empezó porque un compañero del curso de Android se le ocurrió la brillante idea de serializar un objeto para pasarlo de una Activity a otra por medio de Intent. Y claro, yo quise copiarle.<br />
Como llegué tarde a clase y además no presté atención al profesor (no leas esto Rocapal ;) ), es ahora cuando descubro cómo funciona el interfaz java.io.Serializable.<br />
<br />
Mi clase:<br />
<br />
<div class="command">public class RestaurantItem implements java.io.Serializable{<br />
public String mName;<br />
public String mDescription;<br />
public int mPicture;<br />
public Location mLocation;<br />
}</div><br />
Y después de un rato de darle vueltas he visto que si la clase tiene un atributo de un tipo no básico como "Location" no se va a poder serializar de forma automática.<br />
He probado cambiando el Location por dos doubles:<br />
<br />
<div class="command">public double mLatitude;<br />
public double mLongitude;</div><br />
y funcionaba, pero prefiero no serializar a quitar el Location :p<br />
<br />
Por cierto, para quien quiera pasar un objeto serializado en un Intent, simplemente tiene que hacer:<br />
<br />
<div class="command">Intent i = new Intent();<br />
i.putExtra("ObjetoName", myObject);</div><br />
Siendo myObject un objeto de la clase que implementa java.io.Serializable.<br />
Y para recuperar el objeto del Intent, supuestamente en la otra Activity:<br />
<br />
<div class="command">ObjSerializable obj = (ObjSerializable) i.getSerializableExtra("ObjetoName");</div><br />
Y ya está.Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com2tag:blogger.com,1999:blog-4146890271453700917.post-8795881143130229432011-03-31T20:17:00.001+02:002011-04-04T11:00:51.011+02:00Problema de acceso a la clase R<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/-I_HnHnEkhcU/TZTBOJaMh5I/AAAAAAAAADo/xFhqcctuh5o/s1600/android-malo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://1.bp.blogspot.com/-I_HnHnEkhcU/TZTBOJaMh5I/AAAAAAAAADo/xFhqcctuh5o/s200/android-malo.png" width="162" /></a></div>Este post lo escribo motivado por un pelín de odio y deseando que no le pase a nadie.<br />
Después de estar un buen rato (una semanilla) mirando una posible solución a mi problema y pensando qué podría ser, he dado con la solución.<br />
<br />
<u><b>El problema:</b></u><br />
<br />
Un proyecto de Android me daba error al acceder a la clase R autogenerada por el SDK desde la clase Main.<br />
Pensaba que era por alguna cosa mal escrita en los recursos (ya sabes, no hay que escribir los nombres de archivo con letras mayúsculas) o por haber hecho un clean del proyecto o por tener activada la opción de autobuild. Lo intenté con "Android tools > Fix project properties", renombrando el paquete de la aplicación y nada.<br />
Ya dudaba de todo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-NaOMZ_7GOyY/TZTEaeRRu1I/AAAAAAAAADs/r23pCUJNKNs/s1600/pantallazo-error-R.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="119" src="http://3.bp.blogspot.com/-NaOMZ_7GOyY/TZTEaeRRu1I/AAAAAAAAADs/r23pCUJNKNs/s320/pantallazo-error-R.jpg" width="320" /></a></div><br />
<u><b>Solución:</b></u><br />
<br />
Desesperado ya he optado por empezar de nuevo un proyecto vacío.<br />
Copiando el código del viejo proyecto he dado con el problema. Estaba importando android.R porque en algún momento lo habré necesitado o porque habré hecho un copy/paste mal, el caso es que si ya has probado de todo y estás apunto de tirarte por la ventana, prueba a borrar todos los "import" que tengas y autogenéralos pulsando las teclas:<br />
<br />
<div class="command">Ctrl + Shift + O</div><br />
Puede salvarte la vida, a mi me la salvó ;)Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com3tag:blogger.com,1999:blog-4146890271453700917.post-34098179505608162892011-03-31T00:45:00.002+02:002011-04-04T11:01:07.717+02:00Curso Android<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/-ob1GXp15wA8/TZOjhE-CUKI/AAAAAAAAADg/byRmVroenuM/s1600/libresoft.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="91" src="http://1.bp.blogspot.com/-ob1GXp15wA8/TZOjhE-CUKI/AAAAAAAAADg/byRmVroenuM/s200/libresoft.jpeg" width="200" /></a></div>Buenas de nuevo!<br />
<br />
Se que he tardado mucho en volver a escribir. He estado liado con proyectos web en los que he aprendido a desarrollar con CakePHP[1], un framework de PHP que me ha gustado enormemente. Simplifica muchísimo las tareas comunes y tiene muchas cosas implementadas que se usan comúnmente y que funcionan sin mucho esfuerzo, pero bueno, eso es para otro blog.<br />
A ver si poco a poco retomo el blog de light byte :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-Ss3c3loqPyo/TZOkCUzPCGI/AAAAAAAAADk/xTU7ArM2We8/s1600/urjc.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="101" src="http://2.bp.blogspot.com/-Ss3c3loqPyo/TZOkCUzPCGI/AAAAAAAAADk/xTU7ArM2We8/s200/urjc.png" width="200" /></a></div><u><b>Sobre Android:</b></u><br />
<br />
Quiero decir que estoy en un curso de Android en la Universidad Rey Juán Carlos<span style="font-size: small;">[2]</span> impartido por LibreSoft[3]. El curso se imparte los viernes de 16:00 a 21:00 y el tiempo se pasa volando. Ya llevamos 4 sesiones y tengo unas ganas tremendas de que llegue el próximo viernes para aprender más cosas.<br />
<br />
Hasta ahora hemos visto bastantes cosas, la mayoría ya las había visto de forma autodidacta haciendo los ejemplos de la web de android[4]. Pero me gusta repasar conceptos y corregir fallos.<br />
Algunas cosas que me han llamado la atención:<br />
<br />
<ul><li>Que Android es una plataforma de software libre que no sigue al pie de la letra la filosofía de software libre, ya que Google es quien modifica el código y no permite modificaciones de fuera.<br />
<br />
</li>
<li>Que se puede programar directamente sobre las librerías de C que van sobre el kernel de linux por medio del NDK[5] y así obtener más velocidad, pero tiene la parte negativa de que nadie te asegura que vaya a funcionar igual en posteriores versiones de Android. En cambio si desarrollas sobre el SDK (la API de Android) te aseguras que tu aplicación funcione en posteriores versiones.<br />
<br />
En la siguiente imagen se puede ver en la parte azul el API de Android para trabajar de forma estandar (SDK) y en la parte verde, las librerías con las que trabajar en el NDK. Esto del NDK no lo he probado así que no se más jeje.</li>
</ul><div class="separator" style="clear: both; text-align: center;"><a href="http://developer.android.com/images/system-architecture.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="286" src="http://developer.android.com/images/system-architecture.jpg" width="400" /></a></div><br />
<br />
<ul><li>Vimos que hay varios markets pero que el market de Android no permite que se puedan descargar otra aplicación market de un tercero.<br />
<br />
</li>
<li>Como construir layouts complejos usando los LinearLayout, RelativeLayout, TabLayout, etc.<br />
<br />
</li>
<li>Como crear menús contextuales y de layout.<br />
<br />
</li>
<li>Como usar los Intents para llamar a otros layouts, digamos que es la forma de Android de abrir "ventanas" o "vistas" y con los que puedes pasar parámetros al layout que se llama.<br />
</li>
<li>Como crear nuestro propio Adapter para rellenar los ListView.<br />
<br />
</li>
<li>Como crear una View por código desde un recurso usando el LayoutInflater:<br />
<div class="command">LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);<br />
view = inflater.inflate(R.layout.advanced_list, null); </div></li>
</ul><ul><li>Como usar los mapas de Google así como obtener una clave para poder trabajar con los mapas[6]. <br />
Aunque esto merece un post aparte diré que es necesario unos pasos básicos para no desesperarse:</li>
<ul><li>En el AndroidManifest.xml añadir la siguiente línea dentro de la etiqueta "Application":<br />
<div class="command"><uses-library android:name="com.google.android.maps" /></div></li>
<li>Y añadir también en la etiqueta "manifest" los permisos:<br />
<div class="command"><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission><br />
<uses-permission android:name="android.permission.INTERNET"></uses-permission></div></li>
</ul></ul><br />
Bueno, me dejo muchos detalles de como hacer las cosas, pero no se puede hacer todo en un día ;)<br />
<br />
<br />
<b>Enlaces:</b><br />
<a href="http://cakephp.org/">[1] CakePHP </a><br />
<a href="http://www.urjc.es/">[2] Universidad Rey Juán Carlos</a><br />
<a href="http://libresoft.es/">[3] LibreSoft </a><br />
<a href="http://developer.android.com/resources/browser.html?tag=tutorial">[4] Android developers</a> <br />
<a href="http://developer.android.com/sdk/ndk/index.html">[5] NDK</a><br />
<a href="http://code.google.com/intl/es-AR/android/add-ons/google-apis/maps-overview.html">[6] Google Projects for Android: Google APIs</a>Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com0tag:blogger.com,1999:blog-4146890271453700917.post-30450082751252215412010-12-10T00:37:00.000+01:002010-12-10T08:38:05.240+01:00La primera aplicación Android<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_cU5-Bahew8k/TQHTjg63vuI/AAAAAAAAADU/4GoFA2DsuhU/s1600/Pantallazo-8.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://3.bp.blogspot.com/_cU5-Bahew8k/TQHTjg63vuI/AAAAAAAAADU/4GoFA2DsuhU/s1600/Pantallazo-8.png" /></a></div>Si ya has dado el paso de instalar todo lo necesario para programar en Android, pero aún no te has atrevido a hacer algún programita, este es tu post.<br />
Aquí vas a ver paso a paso lo sencillo que es crear un programa de prueba de tipo "Hola Mundo!" para ver cómo funciona el Eclipse y qué tiene un programa básico de Android.<br />
Como verás, empezar es muy sencillo. No tienes ni que escribir código. El plugin de Android para Eclipse (<a href="http://developer.android.com/sdk/eclipse-adt.html">Android Development Tools o ADT</a>) hará todo por ti, al menos al principio.<br />
<br />
<u><b>Nuevo proyecto en Eclipse:</b></u><br />
<ol><li>Ve al menú <b>File > New > Project...</b></li>
<li>Despliega si no lo está ya la carpeta <b>"Android"</b>, selecciona <b>"Android Project"</b> y pulsa <b>"Next"</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_cU5-Bahew8k/TPUllZD-S_I/AAAAAAAAAC0/S5Gg9T0FZF4/s1600/Pantallazo1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="http://4.bp.blogspot.com/_cU5-Bahew8k/TPUllZD-S_I/AAAAAAAAAC0/S5Gg9T0FZF4/s320/Pantallazo1.png" width="320" /></a></div><br />
</li>
<li>Seguidamente saldrá un diálogo que, en mi caso, me sale hasta scroll de lo alto que es. El primer dato a rellenar es el <b>nombre para tu aplicación</b>, por ejemplo <b>"Hola Light Byte"</b>.</li>
<li>A continuación del nombre, hay algunas opciones bajo el título <b>"Contents"</b>. Déjalas como están. Deben estar seleccionadas <b>"Create new project in workspace"</b> y <b>"Use default location"</b>.</li>
<li>Bajo el título <b>"Build target"</b> hay una lista de versiones de Adroid con y sin soporte de las API de google. Marca la versión que quieras que tu programa se ejecute. Para nuestro propósito <b>puede ser cualquiera</b>. Si estás indeciso, <a href="http://lightbyte.blogspot.com/2010/11/versiones-del-sdk-de-android.html">este post</a> igual te aclare un poco.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_cU5-Bahew8k/TPUsv3JmfhI/AAAAAAAAAC4/zLzLfUCPte4/s1600/Pantallazo2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/_cU5-Bahew8k/TPUsv3JmfhI/AAAAAAAAAC4/zLzLfUCPte4/s320/Pantallazo2.png" width="264" /></a></div><br />
</li>
<li>En el título <b>"Properties"</b> tienes varios datos que introducir:<br />
<ul style="margin-left: 20px;"><li><b>Application name:</b> es el título de nuestra aplicación cuando se ejecuta. Escribe <b>"Hola Light Byte"</b>.</li>
<li><b>Package name:</b> es el <a href="http://en.wikipedia.org/wiki/Namespace_%28computer_science%29">namespace</a> del paquete a crear donde están los archivos con el código Java de nuestra aplicación. Escribe, por ejemplo, <b>"org.android.holalightbyte"</b>.</li>
<li><b>Create activity:</b> deja marcada esta opción y escribe, por ejemplo, <b>"HolaLightByte"</b>. Esto creará la clase Activity donde empezará nuestro programa con ese nombre.</li>
<li><b>Min SDK Version:</b> este campo lo puedes dejar vacío por ahora, para un hola mundo no vamos a exigir ninguna versión mínima de Android.</li>
</ul></li>
<li>Pulsa <b>"Next"</b>, verás la opción de crear un proyecto para probar tu programa, pero por ahora déjalo sin marcar. Pulsa <b>"Finalizar"</b>.</li>
</ol><br />
<b><u>Explicación del contenido del proyecto:</u></b><br />
<br />
Una vez creado el proyecto, puedes ver en el "Package Explorer" el contenido de éste.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_cU5-Bahew8k/TPUzLRjsu9I/AAAAAAAAAC8/4G545hPnDcI/s1600/Pantallazo4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/_cU5-Bahew8k/TPUzLRjsu9I/AAAAAAAAAC8/4G545hPnDcI/s1600/Pantallazo4.png" /></a></div>Una representación en modo árbol donde el nodo principal la carpeta del proyecto con su nombre.<br />
En esa carpeta tienes:<br />
<br />
<b>src:</b> donde encontrarás el código Java organizado por paquetes.<br />
<br />
<b>gen:</b> donde el plugin ADT generará el archivo R.java con los IDs de los controles del interfaz gráfico, entre otras cosas. No tocar.<br />
<br />
<b>Android 1.5:</b> librería de la plataforma de Android 1.5. No tocar.<br />
<br />
<b>assets:</b> donde puedes guardar cualquier archivo que quieras que vaya en el paquete de tu programa. Estos contenidos no serán indexados en el R.java. Para el "Hola Mundo" no lo usarás.<br />
<br />
<b>res:</b> carpeta de recursos donde encuentras las cadenas de texto, imágenes y ficheros XML de definición de las pantallas y componentes.<br />
<br />
<b>AndroidManifest.xml:</b> donde se especifican propiedades de tu aplicación que Android necesita saber para ejecutarla. Por ejemplo, permisos necesarios, activities a usar, intents y más cosas que irás conociendo poco a poco.<br />
<br />
<b>default.properties:</b> fichero generado automáticamente por las herramientas de Android. No tocar.<br />
<br />
<br />
<u><b>Ejecución del programa:</b></u><br />
<br />
Para probar tu programa primero tienes que <a href="http://lightbyte.blogspot.com/2010/12/crear-un-android-virtual-device.html">crear un AVD (Android Virtual Device)</a>. De todas maneras al ejecutar la aplicación si no tuvieras un AVD, Eclipse te pedirá que lo crees en ese momento.<br />
Una vez tengas el AVD, puedes ejecutar el programa pulsando con el botón derecho sobre la carpeta del proyecto del "Package Explorer", y en el menú contextual selecciona <b>"Run As" > "Android Application"</b>.<br />
<br />
A continuación verás la ventana del emulador de Android que necesitará un tiempo larguito para iniciar Android. Te recomiendo que no cierres esta ventana hasta que termines tu sesión de trabajo, porque cada vez que la abras tardará el mismo tiempo. Y eclipse es capaz de conectarse al emulador lanzado para cargar una nueva versión de tu programa en depuración. Así que no te hace falta para nada cerrar el emulador, al menos hasta que cierres el Eclipse.<br />
<br />
Cuando carga el emulador de Android, te pide que pulses la tecla <b>"Menú"</b> para desbloquear el "teléfono" emulado y automáticamente ejecutará la aplicación en depuración, tu "Hola Light Byte" en acción :).<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_cU5-Bahew8k/TQFwdSs7vPI/AAAAAAAAADM/tnSyQ-YFZ0k/s1600/Pantallazo-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="227" src="http://1.bp.blogspot.com/_cU5-Bahew8k/TQFwdSs7vPI/AAAAAAAAADM/tnSyQ-YFZ0k/s320/Pantallazo-6.png" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_cU5-Bahew8k/TQFwfludXjI/AAAAAAAAADQ/A_-BQPiA4xo/s1600/Pantallazo-7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="227" src="http://2.bp.blogspot.com/_cU5-Bahew8k/TQFwfludXjI/AAAAAAAAADQ/A_-BQPiA4xo/s320/Pantallazo-7.png" width="320" /></a></div><br />
<br />
<ol></ol>Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com2tag:blogger.com,1999:blog-4146890271453700917.post-47984752574223424962010-12-05T11:00:00.002+01:002010-12-05T13:34:09.938+01:00Como crear un Android Virtual DeviceCuando se hace un programa es muy vergonzoso que un usuario descubra un error, y mucho más si es un error sencillo de sacar que no habías visto antes. Y por experiencia se que da igual cuánto pruebes que siempre habrá algún error que no hayas visto.<br />
<br />
Al desarrollar aplicaciones, es conveniente probar que funcionan bajo todas las circunstancias que te puedas imaginar. Por ejemplo, hablando de una aplicación para un dispositivo con Android, un tipo de pruebas sería probar con diferentes configuraciones hardware. Estaría bien que funcionara igual de bien en un dispositivo con una pantalla pequeña como la de un HTC Magic, que en otro con una pantalla grande como una tablet o una televisión con Android. De igual manera se podría probar con o sin tarjeta SD, con o sin antena GPS, etcétera.<br />
<br />
Para hacer estas pruebas, el SDK de Android trae una herramienta llamada <b>Android SDK and AVD Manager</b>.<br />
Mediante esta herramienta puedes obtener actualizaciones del SDK de Android y gestionar los <b>AVD (Android Virtual Devices o Dispositivos Virtuales de Android)</b>.<br />
<br />
Para abrir esta herramienta, puedes hacerlo desde el Eclipse, por medio de un botón de la barra de herramientas que se parece a esto:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><span href="http://2.bp.blogspot.com/_cU5-Bahew8k/TPgpM_KECiI/AAAAAAAAADA/qM-P8A6gNpk/s1600/Pantallazo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/_cU5-Bahew8k/TPgpM_KECiI/AAAAAAAAADA/qM-P8A6gNpk/s1600/Pantallazo.png" /></span></div><br />
<div class="separator" style="clear: both; text-align: center;"></div>Si lo prefieres, también puedes acceder al Android SDK and AVD Manager por medio de línea de comandos. Sólo tienes que ejecutar el programa "android" ("android.bat" si usas windows) que está en la carpeta "tools" del SDK. <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_cU5-Bahew8k/TPgtcmxqu6I/AAAAAAAAADE/30PyJ-HvwfE/s1600/Pantallazo-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="185" src="http://2.bp.blogspot.com/_cU5-Bahew8k/TPgtcmxqu6I/AAAAAAAAADE/30PyJ-HvwfE/s320/Pantallazo-1.png" width="320" /></a></div><br />
Selecciona <b>"Virtual Devices"</b> en la parte de la izquierda y pulsa el botón <b>"New"</b> de la derecha. Aparecerá la siguiente ventana:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_cU5-Bahew8k/TPguBEcn9mI/AAAAAAAAADI/rQJsRam5pSs/s1600/Pantallazo-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/_cU5-Bahew8k/TPguBEcn9mI/AAAAAAAAADI/rQJsRam5pSs/s320/Pantallazo-2.png" width="222" /></a></div><br />
Para crear un AVD dispones de los campos:<br />
<br />
<ul><li><b>Name:</b> nombre del AVD. <b>Obligatorio</b>.</li>
<li><b>Target:</b> versión de Android que quieres que tenga el AVD. <b>Obligatorio</b>.</li>
<li><b>SD Card:</b> si quieres que tenga tarjeta SD escribe alguna cantidad en el campo Size o selecciona un fichero para montarlo como tarjeta SD. Si no, deja el campo vacío.</li>
<li><b>Hardware:</b> para añadir diferentes configuraciones hardware.</li>
</ul>Una vez añadido todas las opciones deseadas pulsa "Create AVD". Y ya tendrías tu AVD.Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com1tag:blogger.com,1999:blog-4146890271453700917.post-57442845769965766442010-11-24T20:06:00.004+01:002010-11-25T18:01:48.417+01:00Versiones del SDK de Android<div class="separator" style="clear: both; text-align: center;"><span imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/_cU5-Bahew8k/TO1jVrR_9aI/AAAAAAAAACw/619JIxIGc0E/s1600/android-sdk.png" /></span></div>Cuando creas un programa para Android una de las primeras cosas que tienes que pensar es para qué versión de Android vas a hacerlo.<br />
Como novato, yo elegiría siempre la última versión que es la que tiene todo lo mejor y más bonito. Pero no todo el mundo tiene su dispositivo actualizado a la última versión. Puedes encontrarte con que hay gente que tiene problemas con tu programa (que, en este supuesto, vamos a decir que funciona muy bien en Android 2.2, que no es poco) porque su versión de Android es la 2.1.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div>En el post <a href="http://lightbyte.blogspot.com/2010/11/instalar-sistema-de-desarrollo-android.html">cómo preparar Ubuntu para desarrollar con Android</a>, se instalaron todas las versiones del <a href="http://es.wikipedia.org/wiki/Kit_de_desarrollo_de_software">SDK</a> de Android por médio del comando:<br />
<div class="command"><android-sdk-path>/tools/android update sdk</div>Este comando, a día de hoy, te instala, entre otras cosas, los SDK de Android:<br />
<ul><li>SDK Platform Android 1.1, API 2 revisión 1</li>
<li>SDK Platform Android 1.5, API 3 revisión 4</li>
<li>SDK Platform Android 1.6, API 4 revisión 3</li>
<li>SDK Platform Android 2.0, API 5 revisión 1</li>
<li>SDK Platform Android 2.1, API 7 revisión 2</li>
<li>SDK Platform Android 2.2, API 8 revisión 2</li>
</ul>En cada versión del SDK también aumenta la versión del <a href="http://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones">API</a>.<br />
Por lo general, un programa podrá correr en versiones de APIs posteriores al API para la cual se hizo, pero no se asegura que vaya a funcionar igual en versiones anteriores.<br />
<br />
Para evitar que tu programa falle por estos motivos, podemos hacer 2 cosas:<br />
<ol><li>Desarrollar el programa para la versión 1.5 y así sería soportada por todas las versiones futuras.</li>
<li>Requerir una versión mínima de Android para el correcto funcionamiento de nuestra aplicación. Esto implica perder los usuarios que estén por debajo de la versión requerida.</li>
</ol><br />
Se puede indicar al sistema operativo la versión mínima de Android configurando el archivo AndroidManifest.xml del proyecto.<br />
Desde Eclipse, se puede hacer gráficamente, pero para explicarlo, es mucho más sencillo si se hace directamente en el código XML del fichero.<br />
En Eclipse, abre el fichero en vista XML y busca las etiquetas <manifest>:<br />
<div class="command"><manifest><br />
...<br />
</manifest></div>Añade la nueva línea:<br />
<div class="command"><manifest><br />
...<br />
<br />
<uses-sdk android:minSdkVersion="3"> <br />
</manifest></div>El valor "3" especificado es la versión de API del SDK 1.5 en el cual nuestro programa funciona. En APIs anteriores no se podrá instalar el programa.<br />
Sustituye el "3" por la versión del API que tu quieras.<br />
<br />
Espero que esta información te haya ayudado algo.Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com2tag:blogger.com,1999:blog-4146890271453700917.post-28087014563422308212010-11-21T17:14:00.001+01:002010-11-21T17:19:22.330+01:00Cómo preparar Windows para desarrollar con Android<div class="separator" style="clear: both; text-align: center;"><spam imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://2.bp.blogspot.com/_cU5-Bahew8k/TOlBBiK_7tI/AAAAAAAAACs/j8upvAJkqLw/s200/AndroidWindows7.jpg" width="200" /></spam></div>Este post está dirigido a usuarios de Windows que quieran empezar a programar en android. Si tu Sistema Operativo es Ubuntu o cualquier otra distribución basada en Debian, te recomiendo que sigas <a href="http://lightbyte.blogspot.com/2010/11/instalar-sistema-de-desarrollo-android.html">este otro post</a>.<br />
<br />
Android no es un lenguaje de programación, es una agrupación de software para dispositivos móviles que incluye un sistema operativo, software intermédio (middleware) y aplicaciones clave. El SDK de Android proporciona las herramientas y APIs necesarias para comenzar el desarrollo de aplicaciones en la plataforma Android usando el lenguaje de programación Java.<br />
<br />
Te guiaré paso a paso para instalar todo lo necesario en tu ordenador. <br />
<br />
<br />
<b><u>Paso 1: Java</u></b><br />
En el siguiente enlace puedes descargar el JDK.<br />
Recuerda que <a href="http://es.wikipedia.org/wiki/Java_Development_Kit">JDK</a> no es lo mismo que <a href="http://es.wikipedia.org/wiki/JRE">JRE</a>.<br />
<div class="command"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a></div>Una vez descargado, instalalo como cualquier otra aplicación.<br />
<br />
<br />
<u><b>Paso 2: SDK de Android</b></u><br />
En el siguiente enlace puedes descargar el SDK de Android.<br />
<div class="command"><a href="http://dl.google.com/android/android-sdk_r07-windows.zip">http://dl.google.com/android/android-sdk_r07-windows.zip</a></div>Una vez en tu equipo, muévelo donde quieras, por ejemplo "C:\" y descomprime el .zip.<br />
Una vez descomprimido, puedes borrar el archivo .zip. <br />
Abre una consola, por ejemplo, pulsando en "Inicio" -> "Ejecutar", teclea "cmd" y pulsa "enter".<br />
Una vez en la consola:<br />
<div class="command">C:\una\carpeta\cualquiera><b>cd \</b><br />
C:\><b>cd android-sdk-windows</b><br />
C:\android-sdk-windows><b>tools\android.bat update sdk </b></div>Recuerda que sólo hay que ejecutar los comandos en negrita, lo que hay delante de la negrita se llama prompt y no hay que escribirlo.<br />
<br />
<br />
<b><u>Paso 3: Eclipse</u></b><br />
La versión de Eclipse necesaria para Android debe ser la 3.4 (Ganymede) o 3.5 (Galileo), en la 3.6 (Helios) se han detectado algunos errores.<br />
Sigue el enlace de más abajo, descarga e instala cualquiera de los siguientes Eclipses:<br />
- Eclipse Classic<br />
- Eclipse IDE for Java Developers<br />
- Eclipse IDE for Java EE Developers<br />
Cualquiera te puede valer.<br />
<div class="command"><a href="http://www.eclipse.org/downloads/packages/release/galileo/sr2">http://www.eclipse.org/downloads/packages/release/galileo/sr2</a></div><br />
<br />
<u><b>Paso 4: Plugin de Android para Eclipse - ADT Plugin -</b></u><br />
Ejecuta Eclipse y ve a "Help" > "Install New Software".<br />
Clic en el botón "Add" para añadir un nuevo sitio. Se abrirá un diálogo, en el campo "Name" escribes por ejemplo "Android Plugin" y en "Location", <br />
<div class="link">https://dl-ssl.google.com/android/eclipse/</div>Pulsa el botón "Aceptar", esperas a que te salgan cosas en la lista.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_cU5-Bahew8k/TOBs2t9tYVI/AAAAAAAAACI/HIhWx3F9eUk/s1600/eclipse-install1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="http://3.bp.blogspot.com/_cU5-Bahew8k/TOBs2t9tYVI/AAAAAAAAACI/HIhWx3F9eUk/s320/eclipse-install1.png" width="320" /></a></div><br />
Marca todas las casillas para instalar, pulsas "Siguiente", "Siguiente" otra vez, aceptas los términos de la licencia y pulsas "Finalizar".<br />
Una vez haya terminado igual te pide reiniciar el Eclipse.<br />
<br />
<br />
<u><b>Paso 5: Configurar Eclipse</b></u><br />
En Eclipse, vamos al menú "Window" > "Preferences".<br />
Seleccionamos la sección "Android". En la parte de la derecha tenemos que escribir (o seleccionar) la ruta a la carpeta del SDK de Android, recuerda donde descomprimiste el SDK en el paso 2.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_cU5-Bahew8k/TOBs42PM7MI/AAAAAAAAACM/Fgxl662SaGI/s1600/eclipse-preferences.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="251" src="http://4.bp.blogspot.com/_cU5-Bahew8k/TOBs42PM7MI/AAAAAAAAACM/Fgxl662SaGI/s320/eclipse-preferences.png" width="320" /></a></div><br />
La ventana de preferencias debe parecer a la foto anterior. Guarda los cambios realizados y cierra el diálogo de preferencias.<br />
<br />
<br />
<u><b>Listo para usarse</b></u><br />
Hemos terminado la instalación.<br />
Si eres principiante te recomiendo empezar leyendo sobre Android y el Framework:<br />
<div class="link"><a href="http://developer.android.com/guide/basics/what-is-android.html">http://developer.android.com/guide/basics/what-is-android.html</a></div>Y algunos ejemplos para aprender lo básico de android:<br />
<div class="link"><a href="http://developer.android.com/resources/tutorials/hello-world.html">http://developer.android.com/resources/tutorials/hello-world.html</a></div>Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com0tag:blogger.com,1999:blog-4146890271453700917.post-37245057348763293492010-11-17T00:38:00.003+01:002010-11-17T20:01:27.999+01:00Cómo preparar Ubuntu para desarrollar con Android<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><span imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/_cU5-Bahew8k/TOOKDcQ7nmI/AAAAAAAAACY/N44-8ulVGVs/s200/ubuntu-android.png" width="200" /></span></div>Este post está dirigido a usuarios de Ubuntu, que quieran empezar a programar en <a href="http://es.wikipedia.org/wiki/Android">android</a>.<br />
<br />
Android no es un lenguaje de programación, es una agrupación de software para dispositivos móviles que incluye un sistema operativo, software intermédio (<a href="http://es.wikipedia.org/wiki/Middleware">middleware</a>) y aplicaciones clave. El SDK de Android proporciona las herramientas y <a href="http://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones">APIs</a> necesarias para comenzar el desarrollo de aplicaciones en la plataforma Android usando el lenguaje de programación <a href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Java">Java</a>.<br />
Te guiaré paso a paso para instalar todo lo necesario en tu <a href="http://es.wikipedia.org/wiki/Ubuntu">Ubuntu</a>.<br />
<div class="separator" style="clear: both; text-align: center;"></div><br />
Nota: si trabajas con linux 64-bit debes instalar las librerías de 32-bit:<br />
<div class="command">user@machine:~$ sudo apt-get install ia32-libs</div><br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><u><b>Paso 1: Java</b></u><br />
Desde la consola ejecuta:<br />
<div class="command">user@machine:~$ sudo apt-get install sun-java6-jdk</div><br />
<br />
<u><b>Paso 2: SDK de Android</b></u><br />
En el siguiente enlace puedes descargar el SDK de Android.<br />
<div class="link"><a href="http://dl.google.com/android/android-sdk_r07-linux_x86.tgz">http://dl.google.com/android/android-sdk_r07-linux_x86.tgz</a></div>Una vez en nuestro equipo, muévelo donde quieras, por ejemplo "/home/tu-usuario/" y descomprime el .tgz:<br />
<div class="command">user@machine:~$ mv Descargas/android-sdk_r07-linux_x86.tgz .<br />
user@machine:~$ tar -xvzf android-sdk_r07-linux_x86.tgz<br />
user@machine:~$ rm android-sdk_r07-linux_x86.tgz</div>Abre una consola y ejecuta lo siguiente:<br />
<div class="command">user@machine:~$ android-sdk-linux_86/tools/android update sdk</div><br />
<br />
<u><b>Paso 3: Eclipse</b></u><br />
La versión de Eclipse necesaria para Android debe ser la 3.4 o 3.5, en la 3.6 se han detectado algunos errores.<br />
A día de hoy la versión de Eclipse de los repositorios es la 3.5, así que se puede instalar desde consola ejecutando:<br />
<div class="command">user@machine:~$ sudo apt-get install eclipse</div><br />
<br />
<u><b>Paso 4: Plugin de Android para Eclipse - ADT Plugin -</b></u><br />
Ejecuta Eclipse, lo encontrarás en "Aplicaciones" > "Programación" > "Eclipse".<br />
Dentro, ve a "Help" > "Install New Software".<br />
Clic en el botón "Add" para añadir un nuevo sitio. Se abrirá un diálogo, en el campo "Name" escribes por ejemplo "Android Plugin" y en "Location", <br />
<div class="link">https://dl-ssl.google.com/android/eclipse/</div>Pulsa el botón "Aceptar", esperas a que te salgan cosas en la lista.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_cU5-Bahew8k/TOBs2t9tYVI/AAAAAAAAACI/HIhWx3F9eUk/s1600/eclipse-install1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="http://3.bp.blogspot.com/_cU5-Bahew8k/TOBs2t9tYVI/AAAAAAAAACI/HIhWx3F9eUk/s320/eclipse-install1.png" width="320" /></a></div><br />
Marca todas las casillas para instalar, pulsas "Siguiente", "Siguiente" otra vez, aceptas los términos de la licencia y pulsas "Finalizar".<br />
Una vez haya terminado igual te pide reiniciar el Eclipse.<br />
<br />
<br />
<u><b>Paso 5: Configurar Eclipse</b></u><br />
En Eclipse, vamos al menú "Window" > "Preferences".<br />
Seleccionamos la sección "Android". En la parte de la derecha tenemos que escribir (o seleccionar) la ruta a la carpeta del SDK de Android, recuerda donde descomprimiste el SDK en el paso 2.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_cU5-Bahew8k/TOBs42PM7MI/AAAAAAAAACM/Fgxl662SaGI/s1600/eclipse-preferences.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="251" src="http://4.bp.blogspot.com/_cU5-Bahew8k/TOBs42PM7MI/AAAAAAAAACM/Fgxl662SaGI/s320/eclipse-preferences.png" width="320" /></a></div><br />
La ventana de preferencias debe parecer a la foto anterior. Guarda los cambios realizados y cierra el diálogo de preferencias.<br />
<br />
<br />
<u><b>Listo para usarse</b></u><br />
Hemos terminado la instalación.<br />
Si eres principiante te recomiendo empezar leyendo sobre Android y el Framework:<br />
<div class="link"><a href="http://developer.android.com/guide/basics/what-is-android.html">http://developer.android.com/guide/basics/what-is-android.html</a></div>Y algunos ejemplos para aprender lo básico de android:<br />
<div class="link"><a href="http://developer.android.com/resources/tutorials/hello-world.html">http://developer.android.com/resources/tutorials/hello-world.html</a></div>Anonymoushttp://www.blogger.com/profile/10236598740373192242noreply@blogger.com1