No es un bug, es una característica no documentada

martes, 19 de enero de 2016

Programación multimedia. Intents implícitos

Cuando queremos interactuar con nuestro dispositivo Android desde una aplicación programada por nosotros, le deberemos indicar dos cosas:
  • Como queremos que se comporte nuestra aplicación (puede ser usando una funcionalidad del sistema que integremos en nuestra app, como ya vimos anteriormente al programar el navegador web), o la segunda opción, es decir que desde nuestra aplicación se ejecute algún proceso del sistema operativo independiente de nuestra app, como podría ser abrir la cámara de fotos, la aplicación de Gmail…
  • Los permisos que debemos atribuirle al Manifest para poder hacer uso de ese recurso del sistema.

En esta sección nos centraremos en la opción de lanzar recursos del sistema operativo desde nuestra app, a través de intents implícitos.

Para explicarlo en mejor detalle, vamos a realizar paso a paso el siguiente ejercicio:

Ejercicio: Realiza un proyecto de una aplicación semejante a la de la siguiente imagen




Es decir, según el botón que pulsemos haremos lo siguiente:
  1. Abrir el navegador cargando la web de IES Sierra de Guara (o programandoapasitos.blogspot.com, que de paso hacemos visitas).
  2. Abrir la aplicación de teléfono para llamar a otro número
  3. Abrir la aplicación de teléfono con un número ya precargado, en este caso el teléfono del IES Sierra de Guara
  4. Cargar la dirección del IES Sierra de Guara en Google Maps
  5. Abrir la cámara de fotos
  6. Abrir la aplicación de Correo Electrónico (o Gmail, etc.) con un destinatario, título y cuerpo ya configurado.
  7. Abrir la agenda de contactos
  8. Abrir Google Maps cargando la búsqueda de la ciudad de Huesca.
Lo primero será crear un nuevo proyecto en el Android Studio, y generar el Layout con los botones de la siguiente forma:


A continuación copio y pego el XML del Layout por si se quiere hacer directamente:

<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".ItemsImplicitos">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Mostrar web del instituto"
        android:id="@+id/btnWebInstituto"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:onClick="verInstituto" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Llamar por telefono a otro emulador"
        android:id="@+id/btnLlamarTelefono"
        android:layout_below="@+id/btnWebInstituto"
        android:layout_centerHorizontal="true"
        android:onClick="llamarTelefono" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Marcar teléfono del instituto"
        android:id="@+id/btnMarcarTelefono"
        android:layout_below="@+id/btnLlamarTelefono"
        android:layout_centerHorizontal="true"
        android:onClick="llamarInstituto" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Google Maps del instituto"
        android:id="@+id/btnMaps"
        android:layout_below="@+id/btnMarcarTelefono"
        android:layout_centerHorizontal="true"
        android:onClick="mapaInstituto" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hacer foto"
        android:id="@+id/btnFoto"
        android:layout_below="@+id/btnMaps"
        android:layout_centerHorizontal="true"
        android:onClick="hacerFoto" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Enviar email al instituto"
        android:id="@+id/btnMail"
        android:layout_below="@+id/btnFoto"
        android:layout_centerHorizontal="true"
        android:onClick="enviarMail" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Mostrar contactos"
        android:id="@+id/btnContactos"
        android:layout_below="@+id/btnMail"
        android:layout_centerHorizontal="true"
        android:onClick="verContactos" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnMapsBuscar"
        android:layout_below="@+id/btnContactos"
        android:layout_centerHorizontal="true"
        android:text="Buscar Huesca en Google Maps"
        android:onClick="buscarHuesca" />
</RelativeLayout>

Hecho esto, nos vamos a ir a la clase Java desde la que programaremos todo, en mi caso ItemsImplicitos.java.

Lo primero que haremos es crear las variables para los botones y capturarlos del Layout en el método onCreate(), como siempre:

Button btnWebInstituto;
Button btnLlamarTelefono;
Button btnMarcarTelefono;
Button btnMaps;
Button btnFoto;
Button btnMail;
Button btnContactos;
Button btnMapsBuscar;
Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_items_implicitos);
    btnWebInstituto = (Button)findViewById(R.id.btnWebInstituto);
    btnLlamarTelefono = (Button)findViewById(R.id.btnLlamarTelefono);
    btnMarcarTelefono = (Button)findViewById(R.id.btnMarcarTelefono);
    btnMaps = (Button)findViewById(R.id.btnMaps);
    btnFoto = (Button)findViewById(R.id.btnFoto);
    btnMail = (Button)findViewById(R.id.btnMail);
    btnContactos = (Button)findViewById(R.id.btnContactos);
    btnMapsBuscar = (Button)findViewById(R.id.btnMapsBuscar);
}

Hecho esto, ahora procederemos a crear una función para cada acción que realizarán los botones.

Los pasos a seguir son crear un intent que convoque a un componente externo a nuestra clase que debe estar ya declardo. Realmente eso ya sabemos hacerlo, en la sección que desarrollamos el navegador web hicimos exactamente lo mismo, con la diferencia que aquí necesitamos acceder a componentes no programados por nosotros.

Si vamos a la web http://developer.android.com/intl/es/guide/components/intents-common.html veremos los tipos de intents más comunes para Android.

Vamos pues a ello. Cada intent necesario irá remarcado en una subcategoría:

ACTION_VIEW

Este será el intent usado para programar la apertura de navegadores web, google maps… aplicaciones que sirvan para visualizar un objeto concreto que le pasemos.

El código que programaremos para btnWebInstituto es el siguiente:

public void verInstituto(View v){
    intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.iessierradeguara.com/site/"));
    startActivity(intent);
}

Lo que le estamos indicando es que será un intent tipo ACTION_VIEW, y que la dirección completa que nos mostrará será la que pasamos como segundo parámetro. El sistema Android entenderá esa dirección y nos mostrará un menú con varias opciones para abrirlo (Google Chrome, navegador por defecto…) dependiendo de nuestra versión de Android.

Para btnMaps el código es:

public void mapaInstituto(View v){
    intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:42.1345931,-0.4053455"));
    startActivity(intent);
}
Aquí en vez de pasar una dirección web le vamos a enviar unas coordenadas geográficas, que el sistema detectará para abrir con Google Maps o con nuestro navegador web.

En btnContactos, la función es:

public void verContactos(View v){
    intent = new Intent(Intent.ACTION_VIEW, ContactsContract.Contacts.CONTENT_URI);
    startActivity(intent);
}

Indicando que abriremos una función específica de nuestro sistema operativo.

Para el botón btnMapsBuscar, generamos esto:

public void buscarHuesca(View v){
    intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:0.0?=Huesca"));
}

Si comparáis con el antiguo código de coordenadas geográficas, hay una sutil diferencia. En el otro le indicamos una posición numérica exacta, mientras que aquí estamos diciendo que obvie las coordenadas numéricas y haga una búsqueda de algo llamado ‘Huesca’.

ACTION_CALL

Éste método lo usaremos cuando queramos abrir el teléfono predefiniendo ya un número concreto al que marcar.

Lo usaremos para el botón btnMarcarTelefono, que nos pondrá en contacto con el IES Sierra de Guara. La función se crea tal que así:

public void llamarInstituto(View v){
    intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:974243477"));
    startActivity(intent);
}

Es decir, abrimos el teléfono e indicamos el número, sin más.

ACTION_DIAL

Es el mismo procedimiento que ACTION_CALL, con la diferencia de que aquí no vamos a pasar ningún número, indicaremos simplemente que se abra el componente Teléfono.

public void llamarTelefono(View v){
    intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"));
}

Como veis, solo hay que pasar el parámetro “tel:” y listo. Esto podremos usarlo para el botón btnLlamarTelefono.

ACTION PARA CÁMARA DE FOTOS

Para poder acceder a la cámara de fotos, deberemos indicar la siguiente función que referiremos a btnFoto:

public void hacerFoto(View v){
    intent = new Intent("android.media.action.IMAGE_CAPTURE");
    startActivity(intent);
}

ACTION_SEND

Y por último, para configurar nuestro btnMail y poder enviar correos electrónicos, deberemos crear la siguiente función:

public void enviarMail(View v){
    intent = new Intent(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_SUBJECT, "Reciclaje tecnologico");
    intent.putExtra(Intent.EXTRA_TEXT, "Información sobre el proyecto de Educacion 2015");
    intent.putExtra(Intent.EXTRA_EMAIL, "iessguhuesca@educa.aragon.es");
    startActivity(intent);
}

Aquí hay que definir distintos parámetros, a saber:
  • setType(). El tipo de mensaje que será, pudiendo adjuntar texto plano, enriquecido, etc.
  • putExtra(Intent.EXTRA_SUBJECT). Adjuntaremos el asunto del mensaje
  • putExtra(Intent.EXTRA_TEXT). Será el cuerpo de nuestro mensaje
  • putExtra(Intent.EXTRA_MAIL). Las direcciones a las que lo enviaremos. Si quisiéramos hacerlo para varios correos una solución sería pasar un array de strings en vez de un único campo.

Una vez hecho, faltará añadir los permisos en el manifest de Android para asegurarnos de poder acceder a todos los componentes del sistema.


Y con esto ya tendríamos las funciones necesarias para generar nuestro ejercicio. Al ejecutarlo, podremos ver algo tal que así:




0 comentarios:

Publicar un comentario