Como evitar en Emulador el error time out al instalar aplicacion con Eclipse

Objetivo:

Evitar el error de time out al intentar instalar una aplicación en nuestro Emulador Android instalado en Eclipse.

Este fallo me viene pasando desde hace milenios (bueno, quizás un par de siglos menos), y “googleando” encontré varias soluciones, pero comento como siempre la más rápida, eficaz y menos compleja.

Modificaremos para ello el valor de Time Out que tiene Eclipse:

Eclipse -> Window -> Preferences -> Android -> DDMS

Evitar error time out al instalar apk

Y cambiamos el valor ADB connection time out (ms), del que venga por defecto a uno más alto (por ejemplo a 15000 como vemos en la captura de pantalla).

Con esto debería estar solucionado el problema.

Saludos!

Como hacer un link al Market para ver una aplicacion o para ver aplicaciones de desarrollador

Objetivo:

Crear un link hacia una aplicación ofrecida en Android Market.

Este tutorial tiene varios pasos muy sencillos: chequear la conexión a internet y acceder a una aplicación en Android Market (muy útil en caso de querer promocionar nuestra version PRO del producto).

Para ello podemos utilizar una simple función exiteConexionIntenet(), que se puede ver en este post.

Aunque se comenta en el post, recordamos que no podemos olvidar los permisos especiales en nuestro AndroidManifest.xml, que también mencionamos más abajo: internet (android.permission.INTERNET) y estado de la red (android.permission.ACCESS_NETWORK_STATE).

Mostramos la función que usaremos:

Código fuente función (Java):

[sourcecode language=”java”]
/**
* Mira si hay conexión a internet.
* Nota: mi.paquete.aqui representa el nombre del paquete de la aplicación. Otro ejemplo sería com.example.es
* Nota2: mi+usuario+aqui representa el usuario que el desarrollador posee en Android Market, donde los espacios
* debemos escribirlos como signos de suma (+)
*/
public void abrirDetallesAplicacionEnMarket(){
if (exiteConexionInternet()){
try{
Intent intent = new Intent(Intent.ACTION_VIEW);
//cargamos la url de una aplicación en Android Market
intent.setData(Uri.parse("market://details?id=mi.paquete.aqui"));
//si lo que deseamos buscar es las aplicaciones de un desarrollador:
//intent.setData(Uri.parse("market://search?q=mi+usuario+aqui"));
startActivity(intent);
}catch(Exception e){
//Si entramos aquí es porque no tiene Market instalado (p.ej. en emuladores)
//la opción sería enviarlos a la página web
Intent intent = new Intent(Intent.ACTION_VIEW);
//cargamos la url de una aplicación en la web de Android Market
intent.setData(Uri.parse("http://market.android.com/details?id=mi.paquete.aqui"));
//si lo que deseamos buscar es las aplicaciones de un desarrollador:
//intent.setData(Uri.parse("http://market.android.com/developer?pub=mi+usuario+aqui"));
startActivity(intent);
}
}else{ //no hay conexión a internet
Toast.makeText(getApplicationContext(), "Para poder realizar esta acción se necesita conexión a Internet.", Toast.LENGTH_LONG).show();
}
}
[/sourcecode]

Como chequear si existe conexión a internet

Objetivo:

Chequear si el dispositivo móvil dispone de una conexión a internet.

Muchos de los fallos en aplicaciones para Android vienen a causa de no tratar todos los casos posibles. Para una aplicación que requiera contenido de la red de redes, lo correcto es comenzar verificando que el dispositivo tiene conexión a internet.

Para ello podemos utilizar una simple función exiteConexionIntenet(), que devolverá verdadero en caso de existir y falso en caso contrario.

No podemos olvidar los permisos especiales en nuestro AndroidManifest.xml, que también mencionamos más abajo: internet (android.permission.INTERNET) y estado de la red (android.permission.ACCESS_NETWORK_STATE).

Mostramos la implementación de dicha función y cómo usarla:

Código fuente función (Java):

[sourcecode language=”java”]
/**
* Mira si hay conexión a internet.
* @return boolean
*/
public boolean exiteConexionInternet() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
[/sourcecode]

Código fuente utilización (Java):

[sourcecode language=”java”]
if (exiteConexionInternet()){
//acciones realizables, teniendo conexión a internet
//…
}else{
Toast.makeText(Esta_Activity.this, "Requerida conexión a internet", Toast.LENGTH_LONG).show();
}
[/sourcecode]

Código fuente XML (AndroidManifest.xml):

[sourcecode language=”java”]
<!– … –>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!– … –>
[/sourcecode]

Como crear pestañas (tabs) en independientes activities

Objetivo:

Crear un TabHost que contenga tabs (pestañas) independientes; es decir, que cada una sea una Activity diferente.

En las situaciones en las que nos conviene independizar cada cuerpo de las tabs en activities diferentes, podemos crear el TabHost y añadir las tabs a la vez que señalamos que en caso de necesitar aparecer, el contenido se extraiga de la activity que especifiquemos.

Vamos a crear una mini-aplicación con tan solo dos tabs. Se necesitarán tres actividades: la principal (contiene TabHost), y una por cada contenido del tab (es decir, dos). También necesitaremos tres ficheros XML, dado que son tres actividades independientes.

Vemos un par de capturas de la mini-aplicación:

TutorialAndroid - Tabs en activities independientes1TutorialAndroid - Tabs en activities independientes2
Y a continuación mostramos el texto comentado:

Código fuente Java (Container.java):

[sourcecode language=”java”]
package tabsdiferentesactividades.tutorialandroid.com;

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;

public class Container extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//creamos el contenedor de Tabs
TabHost host = getTabHost();
//Añadimos cada tab, que al ser pulsadas abren sus respectivas Activities
host.addTab(host.newTabSpec("tab_1").setIndicator("TAB1").setContent(new Intent(this, Tab1Activity.class)));
host.addTab(host.newTabSpec("tab_2").setIndicator("TAB2").setContent(new Intent(this, Tab2Activity.class)));
}
}
[/sourcecode]

Código fuente Java (Tab1Activity.java):

[sourcecode language=”java”]
package tabsdiferentesactividades.tutorialandroid.com;

import android.app.Activity;
import android.os.Bundle;

public class Tab1Activity extends Activity {

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab1);
}
}
[/sourcecode]

Código fuente Java (Tab2Activity.java):

[sourcecode language=”java”]
package tabsdiferentesactividades.tutorialandroid.com;

import android.app.Activity;
import android.os.Bundle;

public class Tab2Activity extends Activity {

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab2);
}
}
[/sourcecode]

Código fuente XML (main.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />
</LinearLayout>
[/sourcecode]

Código fuente XML (tab1.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="Estamos en la tab 1. \n by TutorialAndroid.com" />
</LinearLayout>
[/sourcecode]

Código fuente XML (tab2.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="Estamos en la tab 2. \n by TutorialAndroid.com" />
</LinearLayout>
[/sourcecode]

En los próximos posts explicaremos como dar un diseño a nuestras pestañas, y cómo crear un TabHost con tabs en una misma actividad, para casos simples donde no necesitamos independencia.

Descárgate el código aquí

Como hacer que un texto parpadee (fadein y fadeout)

Objetivo:

Hacer que un texto parpadee en nuestra aplicación Android.

Para ello podremos crear una animación, que aplique fadein y fadeout al texto, con intensidad y velocidad deseada.

Vamos a crear una Activity Principal que mostrará el texto, creando una instancia de la clase TextoParpadeante. Esta última necesita de dos ficheros XML que , que definirán varios parámetros, tales como la duración .

Vemos unas capturas de pantalla (aunque lo suyo hubiera sido una animación):

TutorialAndroid - Texto parpadeando 1

Y a continuación mostramos el texto comentado:

Código fuente Java (Main.java):

[sourcecode language=”java”]
package textoparpadeo.tutorialandroid.com;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.vista_texto);
tv.setText("Este texto va a parpadear. \n by TutorialAndroid.com");
new TextoParpadeante(getBaseContext(),tv);
}
}
[/sourcecode]

Código fuente Java (TextoParpadeante.java):

[sourcecode language=”java”]
package textoparpadeo.tutorialandroid.com;
import android.content.Context;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Animation.AnimationListener;
import android.widget.TextView;

public class TextoParpadeante {
Context context;
private TextView texto = null;
private Animation fadeIn = null;
private Animation fadeOut = null;
// Listeners que detectan el fin de la animación
private LocalFadeInAnimationListener myFadeInAnimationListener = new LocalFadeInAnimationListener();
private LocalFadeOutAnimationListener myFadeOutAnimationListener = new LocalFadeOutAnimationListener();

/**
* Constructor de la clase
* @param Context context
* @param TextView text
*/
public TextoParpadeante(Context context, TextView text){
this.context = context;
this.texto = (TextView)text;
runAnimations();
}

private void launchOutAnimation() {
texto.startAnimation(fadeOut);
}

/**
* Performs the actual fade-in
*/
private void launchInAnimation() {
texto.startAnimation(fadeIn);
}

/**
* Comienzo de la animación
*/
private void runAnimations() {
//uso de las animaciones
fadeIn = AnimationUtils.loadAnimation(this.context, R.anim.fadein);
fadeIn.setAnimationListener( myFadeInAnimationListener );
fadeOut = AnimationUtils.loadAnimation(this.context, R.anim.fadeout);
fadeOut.setAnimationListener( myFadeOutAnimationListener );
// And start
launchInAnimation();
}

// Runnable que arranca la animación
private Runnable mLaunchFadeOutAnimation = new Runnable() {
public void run() {
launchOutAnimation();
}
};

private Runnable mLaunchFadeInAnimation = new Runnable() {
public void run() {
launchInAnimation();
}
};

/**
* Listener para la animacion del Fadeout
*
* @author moi
*
*/
private class LocalFadeInAnimationListener implements AnimationListener {
public void onAnimationEnd(Animation animation) {
texto.post(mLaunchFadeOutAnimation);
}
public void onAnimationRepeat(Animation animation){
}
public void onAnimationStart(Animation animation) {
}
};

/**
* Listener de animación para el Fadein
*/
private class LocalFadeOutAnimationListener implements AnimationListener {
public void onAnimationEnd(Animation animation) {
texto.post(mLaunchFadeInAnimation);
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationStart(Animation animation) {
}
};
}

[/sourcecode]

Construimos el fichero XML para la vista principal de la aplicación:
Código fuente XML (Main.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/vista_texto"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
[/sourcecode]

Y a continuación se implentan los fichero que deben ir en el directorio /res/anim/ de nuestro proyecto:
Código fuente XML (res/anim/fadein.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="1000"
/>
[/sourcecode]

Código fuente XML (res/anim/fadeout.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="0.1"
android:duration="1000"
/>
[/sourcecode]

Descárgate el código aquí