lunes, 4 de julio de 2011

Debugging Android “Source not found” Errors

When dimensions of a project start being considerable the plugin of Android for Eclipse starts not working properly and also very slow, when it comes to XML modifications, refractoring the code from the XML files becomes tedious.

I had a problem with the Strings resources, as the compiler didnt say anything about it, but at runtime the resource for an String wasnt not found.

android.content.res.Resources$NotFoundException: String resource ID #0x7f050022

I have finally solve the problem cleaning the project from Eclipse. And due to the bad perfomance of the plugin sometimes is a common solution.

viernes, 24 de junio de 2011

Problem with DatePicker example on Android. Possible Android bug.

I am implementing a DateTimePicker. I have reuse this repository:

http://code.google.com/p/datetimepicker/

The problem appears when I am trying to catch the events for the onTimeChanged when I change the minutes. If I use the buttons of + and – Its fine, the event is fired and I can handle it here

public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {

// Update the internal Calendar instance

mCalendar.set(mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH), hourOfDay, minute);

}

Whereas when I click on the minutes and I change it using the keyboard the event doesnt arise, as in the case of the hours, days, etc…

A more detail description of the problem is:

What steps will reproduce the problem?

1. Select the timepicker

2. touch on the numbers, so the keyboard appear

3. when i write an amout of minutes, the event doesnt fire.

What is the expected output? What do you see instead?

I would expect to catch this event inside onTimeChanged, but I cant.

What version of the product are you using? On what operating system?

Version 2. On Android Froyo.

The author of this code has told me there is a bug on Android. I think should be a work around to this problem, for example creating my own class extending from TimePicker and reimplementing the interface OnTimeChangedListener.

miércoles, 22 de junio de 2011

¿Cómo puedo aprender inglés?

En más de una ocasión me han hecho esta pregunta, empezando por mí mismo. A continuación os dejo unos links que en su momento me resultaron de gran ayuda. Me gustaría compartir mi experiencia, ayudar a quien le interese, pero sobretodo tenerlo ya escrito para cuando me pregunten la próxima vez! J

El método depende de cada uno, evidentemente. Personalmente recomendaría estas pautas a un nivel medio que quiere conseguir un nivel alto. En mi caso fueron más o menos así.

Empezar escuchando Vaughan Radio: 30min/1h al dia. http://www.vaughanradio.com/ Te puedes bajar los podcast y llevarlos en el coche, escucharlos antes de dormir…

Practicar el speaking 30min. Para ello internet nuevamente nos supone una herramienta perfecta. Hay una comunidad muy buena, en la que pones tu idioma materno e intercambias con alguien que tenga interés en tu idioma y tú en el suyo. Se llama http://www.sharedtalk.com/

Para el reading que mejor que irse a Reading! jeje(este es un chiste para familiarizaros con el fino humor británico, no en serio! Cuál es la palabra más larga en ingles…SMILES, porque entre una S y la otra hay una milla de distancia…) Para el Reading empezar con libros que están marcados por niveles. Los hay en la biblioteca de la escuela de idiomas. También revistas, como SPEAK UP, muy buena y con un CD interesante.

Tampoco hay que descuidar la gramática y fonética. Para esto lo mejor es ir a una escuela, y si no, pues también hay muchos libros en pdf sobre gramática del inglés, boletines a los que suscribirse por email…Buscar en internet cualquier recurso para el First, Advance, IELTS, TOEFL…

Para la fonética hay unos videos muy buenos de la BBC: http://www.bbc.co.uk/worldservice/learningenglish/grammar/pron/

Una página con cantidad de recursos y de consejos es http://elblogdelingles.blogspot.com/

La autora de este blog y Richard Vaughan, son dos profesores que le ponen tanto entusiasmo a su profesión que de verdad hace que te interese el inglés. Claro está que debe de haber una motivación previa para ello. En mi caso fue poder leer libros técnicos para mi proyecto, foros, y demás recursos que tiene internet en materia de informática y teleco…Otros pueden ser la música, viajar a algún país...Y en cualquier caso lo recomiendo, pues aprender un idioma es una actividad muy estimulante, que puede tomarse como hobby y con la que puedes aprender cosas que ya tenías olvidadas. Como es el caso de los podcast http://www.bbc.co.uk/podcasts.

Una vez que se tiene un dominio intermedio-alto. Lo mejor sin lugar a dudas es irse un tiempo al país donde se hable ese idioma. Si no es posible, siempre hay posibilidad de conocer a personas inglesas en España. En Murcia por ejemplo hacen un tándem (Erasmus que quieren practicar español) en la cafetería Fitz Patrick (junto al Rex), o una comunidad llamada http://www.erasmusu.com/es/ Donde también conocer gente Erasmus. De esta forma es posible practicar el inglés como si estuviéramos en el país y mantener vivo el idioma. Una vez que tienes nivel suficiente es genial poder hablar con angloparlantes, y por ende con gente de casi cualquier nacionalidad, entender algunas canciones, ver algunas series, películas, etc…

miércoles, 15 de junio de 2011

Controlling Installation Preference

There is an important point to take into account when developing applicacions for android. And this is the parameter which added to the manifest root says where you want to install your application. It is pretty straight forward to do it. And I dont understand why applications like Facebook doesnt allow you to be installed on your SD (under Froyo 2.2). Something that frees lot of memory on your phone and improves the general perfomance.

package="com.yourcompany.yourapplication.activitiy"
android:versionCode="1"
android:versionName="1.0" android:installLocation="auto">

Now on, I will add this parameter as it says here http://android-developers.blogspot.com/2010/07/apps-on-sd-card-details.html to allow future applications on Android to be moved to the SD. And keep wondering why not all of them have this option enable.



miércoles, 16 de marzo de 2011

Acceder al código fuente de Android

Cuando estamos programando en Android es muy útil si queremos ver el funcionamiento de un componente de Android buscarlo en la API. Sin embargo aún más cómodo y mas potente es poder acceder al código base, como si de una clase de nuestro proyecto se tratase, esto es, acceder a los ficheros .class que incluye nuestro android.jar.

La forma de hacerlo con el IDE Eclipse es instalando un plugin tal y como explican aqui
An easier way of getting the source into your Eclipse installation is to use the "Android Sources" plugin from http://code.google.com/p/adt-addons/ . Haris Peco maintains plugins with gives access to the Android Source code. Using the Eclipse update manager install two of his plugins. Update site: "http://adt-addons.googlecode.com/svn/trunk/source/com.android.ide.eclipse.source.update" and "http://adt-addons.googlecode.com/svn/trunk/binedit/com.android.ide.eclipse.binedit.update".

Me ha pasado que no funcionaba a veces el plugin, por lo que manualmente nos vamos a las propiedades del proyecto y en las librerias adjuntas, editamos la de android y le ponemos como source: I:/Eclipse/plugins/com.android.ide.eclipse.source_8.0.1.201012181425/4/sources.zip

En la web también explican como acceder mediante Git al proyecto de código abierto de Android, hacer los cambios en el código que queramos y compilar el proyecto. Para de este modo customizar la versión de Android y si nos encontramos iluminados mejorar algún aspecto y comunicarlo a Google.


martes, 1 de marzo de 2011

Buscar información en la Red de Redes.

Uno de los aspectos más importantes en que ha cambiado Internet durante todos estos años, es la forma que tenemos para descubrir cosas nuevas. Antes este lugar lo ocupaba la televisión, las revistas, los periódicos. Desde la llegada de Internet a nuestra cotidianidad, a mediados de los 90s, el descubrir nueva música, películas y expresiones culturales en general, se transformo en una búsqueda activa. En un inexistente mapa del tesoro que se encontraba disperso en Yahoo o Altavista. Hasta que años después, el mensajero cambio de nombre y de algoritmo, y descubríamos las cosas en Google. Nos convertíamos así en cartógrafos, en descubridores, en navegantes. Había que tomar el lápiz para dibujar el camino.

Descubríamos porque buscábamos.

Pero poco a poco fueron apareciendo sitios que buscaban por nosotros. Que seleccionaban y nos regalaban una buena cantidad de recursos. Fue así como Internet se llenó de cartógrafos que nos indicaban un posible camino.

Por otro lado las redes sociales han cambiado el modo en que podemos acceder a la información, que al fin y al cabo la componen las vivencias de todos y cada uno de nosotros.

Estas redes aparecen en diversos contextos, y me sorprende ver el gran apoyo que ha supuesto a la comunicación en las últimas revoluciones de los países Árabes. Donde una población en busca de la libertad, ha podido expresarse libremente y comunicarse por medios como Twitter. Encontrando esa ansiada información, y demostrando como su acceso es vital para un buen funcionamiento global. Poniendo de manifiesto y de forma coherente que la tecnología mejora nuestra vidas.

Es importante encontrar "nuestro camino" y en el caso de Internet lo tenemos a un par de clicks, increíbles guías nos ofrecen sus blogs, tweets, foros, etc. Y nos ayudan a conocer sitios y experiencias que de otro modo serian difícilmente accesibles. Siempre teniendo cuidado de separar la paja, y no dejarnos caer en los grandes "vacíos" de esta ruta trazada cual descubridor de nuevos mundos.

miércoles, 23 de febrero de 2011

Manejo de Hilos en Android

Uno de los mayores quebraderos de cabeza en Android es el manejo de hilos.
No es posible acceder a las variables de la UI desde un hilo diferente del principal. Por tanto si después de realizar una operacion pesada(una comunicacion por red, acceso al GPS...) queremos actualizar un textview, debemos de pasar esa operacion dentro de un runnable al handler de la Activity. El handler es un objeto de la clase Handler, que una vez declarado en la clase principal, en nuestro ejemplo una Activity, permite interactuar con sus variables.


public class MyActivity extends Activity {
[ . . . ]
// Need handler for callbacks to the UI thread
final Handler mHandler = new Handler();

// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateResultsInUi
();
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

[ . . . ]
}

protected void startLongRunningOperation() {

// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
mResults
= doSomethingExpensive();
mHandler
.post(mUpdateResults);
}
};
t
.start();
}

private void updateResultsInUi() {

// Back in the UI thread -- update our UI elements based on the data in mResults
[ . . . ]
}
}

Otra forma de abordar el problema es mediante el uso de mensajes de nuevo con la clase handler. Como bien indica el SDK de android:

There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.

En este ejemplo tan sencillo, nos interesa utilizar el handler para pasar el control del programa desde el hilo que realiza la operacion en el background a el hilo principal, para que actualice el UI. Es decir, como ya hemos mencionado, no sería posible modificar el UI desde el hilo secundario, sino que tenemos que llamar al hilo principal(mediante el objeto hanlder)para que se ocupe de ello. El siguiente código NO SERIA CORRECTO:

protected void startLongRunningOperation() {

// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
mResults
= doSomethingExpensive();
updateResultsInUi
(); //NO DEBE LLAMARSE AQUI.

}
};
t
.start();
}

private void updateResultsInUi() {

//update our UI elements based on the data in mResults
[ . . . ]
}

Como comentaba antes, otro modo de comunicación con el handler es mediante el uso de mensajes, que equivale a hacer un "post(Runnable r)":

public class MyActivity extends Activity {

[ . . . ]
// Need handler for callbacks to the UI thread
final Handler mHandler = new Handler(){ @override public void handleMessage(Message msg){ if(msg.what == 0) updateResultsInUi(); } };

// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateResultsInUi
();
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

[ . . . ]
}

protected void startLongRunningOperation() {

// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
mResults
= doSomethingExpensive();
//mHandler
.post(mUpdateResults); mHandler.sendMessage(0);
}
};
t
.start();
}
private void updateResultsInUi() {

// Back in the UI thread -- update our UI elements based on the data in mResults
[ . . . ]
}
}