Uso de Intents en Android

Buenas tardes, en esta entrada sobre Android veremos como llamar a aplicaciones que ya están instaladas en nuestro dispositivo y que vienen por defecto, como puede ser la aplicación encargada de realizar llamadas con un número de teléfono, la apertura del navegador para visualizar una web, o la apertura de la aplicación Maps para visualizar un punto geográfico en el mapa. Todo esto lo usaremos mediante el uso de la clase Intent.


La clase Intent es una clase la cual suele llevar 2 argumentos, la acción y el dato. La acción describe lo que debe ser realizado, como editar un item, ver el contenido de un item. El dato especifica lo que es afectado, como por ejemplo una persona de la lista de contactos. El dato está especificado mediante el objeto Uri.

Con esta pequeña introducción, podemos ponermos manos a la obra:

  • Creación del Proyecto Android

    Para empezar vamos a crear neustro proyecto Android, para ello vamos a File -> New -> Android Application Project. Si por algún caso no vemos en la lista el elemento Android Application Project, vamos a “Other”, y bien buscandolo a mano o introduciendo Android en el campo de texto nos debe filtrar los resultados.

    Podemos poner cualquier nombre que queramos a nuestro proyecto, en mi caso lo he llamado UsoDeIntents.

    El resto de opciones podemos dejarlas igual, y cuando lleguemos a la pantalla de dar nombre a nuestra Activity, podemos ponerle como nombre IntentsActivity, en mi caso he decidido llamarlo así, pero podeis poner el nombre que querais. Su archivo layout-xml lo he llamado activity_using_intents.xml.

  • IntentsActivity.java

    Una vez nuestro proyecto esté creado, tendremos ya nuestra Activity creada con el nombre que hemos asignado.

    Vamos a empezar definiendo su archivo xml, que se encuentra en al carpeta src/layout, con el nombre de activity_using_intents.xml, y en el cual definiremos el aspecto que tendrá nuestra Activity.

    		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    		    xmlns:tools="http://schemas.android.com/tools"
    		    android:layout_width="match_parent"
    		    android:layout_height="match_parent"
    		    android:orientation="vertical"
    		    tools:context=".UsingIntents" >
    		
    		    <Button
    		        android:id="@+id/btnNavegador"
    		        android:layout_width="fill_parent"
    		        android:layout_height="wrap_content"
    		        android:onClick="onClickWebBrowser"
    		        android:text="Navegador Web" />
    		
    		    <Button
    		        android:id="@+id/btnLlamada"
    		        android:layout_width="fill_parent"
    		        android:layout_height="wrap_content"
    		        android:onClick="onClickLlamada"
    		        android:text="Llamada" />
    		
    		    <Button
    		        android:id="@+id/btnMostrarUbicacion"
    		        android:layout_width="fill_parent"
    		        android:layout_height="wrap_content"
    		        android:onClick="onClickMapa"
    		        android:text="Mostrar Mapa" />
    		
    		</LinearLayout>
    		

    Lo que podemos ver es que hemos creado 3 botones, cada uno tiene su id propio, y un método onClick propio, el cual usaremos luego en nuestro código java para invocar la acción. Como texto, cada uno tiene el texto que se refiere a la acción que va a realizar.

    En este ejemplo vamos a ver como podemos llamar a la aplicación que realiza una llamada, a ir a una página web usando el navegador del teléfono, y abrir la aplicación de Maps para abrir una coordenada concreta.

    Terminada la GUI, vamos a irnos a nuestra clase de Activity, en mi caso llamada UsingIntents.java y que se encuentra localizada en src/nombre.del.paquete/IntentsActivity.java

    		public class UsingIntents extends Activity {
    
    			@Override
    			protected void onCreate(Bundle savedInstanceState) {
    				super.onCreate(savedInstanceState);
    				setContentView(R.layout.activity_using_intents);
    		
    			}
    		
    			public void onClickWebBrowser(View v) {
    				Intent i = new Intent(android.content.Intent.ACTION_VIEW,
    						Uri.parse("http://www.google.com"));
    				startActivity(i);
    			}
    		
    			public void onClickLlamada(View v) {
    				// Intent i = new Intent(android.content.Intent.ACTION_CALL,
    				// Uri.parse("tel:+3748593458"));
    				Intent i = new Intent(android.content.Intent.ACTION_DIAL,
    						Uri.parse("tel:+3748593458")); //
    				startActivity(i);
    			}
    		
    			public void onClickMapa(View v) {
    				float latitude = 37.456456f;
    				float longitude = -156.8767f;
    				String url = String.format("geo:%f, %f", latitude, longitude);
    				Intent i = new Intent(android.content.Intent.ACTION_VIEW,
    						Uri.parse(url));
    				startActivity(i);
    			}
    		}
    		

    El método onCreate en este ejemplo no hemos añadido nada, pues no nos hace falta. A continuación vemos 3 métodos:

    • public void onClickBrowser(View v)

      En este método creamos un Intent, el cual lleva como Acción Intent.ACTION_VIEW, y como dato una dirección web que es pasada como objeto Uri.

    • public void onClickLlamada(View v)

      -En este método creamos un intent, el cual lleva como acción Intent.ACTION_DIAL (el nombre es bastante intuitivo) y como dato el número de teléfono, pero en este caso agregamos el prefijo tel: para que se reconozca el número y se dé por válido.

      Si por el contrario usamos el Intent.ACTION_CALL, el teléfono empezará a llamar directamente, por tanto la he puesto entre comentarios para evitar problemas en el caso de que lo probemos en un dispositivo real.

    • public void onClickMapa(View v)

      En este método creamos un intent, el cual lleva como acción Intent.ACTION_VIEW, y como dato unas coordenadas geográficas, las cuales, como en el caso del número de teléfono, lleva como prefijo “geo:” seguido de las coordenadas.

  • AndroidManifest.xml

    Aún nuestra aplicación no está finalizada, pues vamos a necesitar darle los permisos adecuados para que puedan ejecutarse ciertas opciones.

    		<?xml version="1.0" encoding="utf-8"?>
    		<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    		    package="sekth.droid.usingintents"
    		    android:versionCode="1"
    		    android:versionName="1.0" >
    		
    		    <uses-sdk
    		        android:minSdkVersion="8"
    		        android:targetSdkVersion="17" />
    		    <uses-permission android:name="android.permission.CALL_PHONE"/>
    		    <uses-permission android:name="android.permission.INTERNET"/>
    		
    		    <application
    		        android:allowBackup="true"
    		        android:icon="@drawable/ic_launcher"
    		        android:label="@string/app_name"
    		        android:theme="@style/AppTheme" >
    		        <activity
    		            android:name="sekth.droid.usingintents.UsingIntents"
    		            android:label="@string/app_name" >
    		            <intent-filter>
    		                <action android:name="android.intent.action.MAIN" />
    		
    		                <category android:name="android.intent.category.LAUNCHER" />
    		            </intent-filter>
    		        </activity>
    		    </application>
    		
    		</manifest>
    		

    Como podemos apreciar hemos agregado 2 permisos, en este caso, el permiso de poder realizar llamadas, y el permiso de poder hacer uso de Internet.

Nuestra aplicación ahora es completamente funcional, excepto en un punto. El botón para abrir las coordenadas no funcionarán, al menos en mi caso, ya que el emulador no tiene una aplicación que pueda manejar el contenido de ese Intent, sin embargo si lo probais en un dispositivo físico en el que tengais la aplicación Maps instalada, se abrirá el punto en el mapa. En nuestro caso, el emulador al no tener la aplicación para gestionar el Intent, deja de responder y automáticamente sale de ella mostrando el error.

A continuación podemos ver unas fotos sobre la aplicación terminada:

Aplicación con dispositivo en Portrait:

PrincipalPortrait ACTION_VIEWIntentPortrait ACTION_DIALIntentPortrait

Aplicación con dispositivo en Landscape:

PrincipalLandscape
ACTION_VIEWIntentLandscape

Por último, un vídeo en el que podemos verlo en funcionamiento:

En el video no ejecuto el botón que nos lanza a Maps, porque genera error, pero en un dispositivo físico podréis probar que funciona :).


Con esto hemos visto que podemos usar los Intents para llamar a otras aplicaciones ya instaladas en el teléfono, aquí hemos cubierto solo 3, pero hay bastantes mas como enviar email, una función muy importante y bastante usada. Mas adelante podremos cubrir otros tipos diferentes.

El código de este ejemplo puede bajarse de aquí.

Sin más, cualquier aporte o corrección es bienvenido.

Saludos!!!