Como crear acceso directo de mi aplicacion en la Home Screen (Escritorio)

Objetivo:

Crear un acceso directo (shortcut) de vuestra aplicación en la pantalla Home (llamado “Estritorio” a veces), así como se crean accesos directos de una aplicación de tu ordenador en el escritorio cuando la instalas.

Para ello podemos usar la función que hay más abajo, llamada crearAccesoDirectoEnEscritorio(String Nombre), donde el parámetro es el nombre que queremos que tenga el acceso directo.

El comportamiento de la función si no hay espacio, es buscar en otro de nuestros múltiples escritorios, avisando de que no había espacio en el que estaba activo la última vez antes de acceder a nuestra aplicación.

La forma ideal de usar esta función es llamarla a través de un botón. En el ejemplo hemos creado una aplicación simple que simplemente lo crea al principio.

No podemos olvidar los permisos especiales en nuestro Manifiesto, para poder crear accesos directos (INSTALL_SHORTCUT).

Código fuente función (Java):

[sourcecode language=”java”]
private void crearAccesoDirectoEnEscritorio(String nombre) {
Intent shortcutIntent = new Intent();
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, getIntentShortcut());
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, nombre);
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this.getApplicationContext(), R.drawable.icon));
shortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
this.sendBroadcast(shortcutIntent);
}

public Intent getIntentShortcut(){
Intent i = new Intent();
i.setClassName(this.getPackageName(), this.getPackageName() + "." + this.getLocalClassName());
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
return i;
}
[/sourcecode]

Código fuente función (XML):

[sourcecode language=”xml”]
<!– En Android Manifest… –>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
<!– … –>
[/sourcecode]

Descárgate el código aquí

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í