Android: ejemplos de llamadas a Intents

Los filtros de Intents son, desde mi punto de vista, una de las características más potentes de Android. Nos permiten reutilizar componentes de otras aplicaciones usando muy pocas líneas de código.

“¿Para que voy a programar una Activity de captura de fotos cuando puedo llamar a la de la aplicación de cámara incluida en el sistema?”

Os dejo un ejemplo sencillo en el que se realizan varias llamadas para ilustrarlo:

Más información en la Guia Android y el listado de Intents que nos facilita Android

/**
 * Intent samples
 * http://francho.org
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.francho.test.intents;

import java.util.HashMap;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class IntentsActivity extends Activity {
    private static final int REQUEST_PHOTO = 1;

	private HashMap<String, Intent> mPruebas;
	private LinearLayout mContainer;

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mContainer = new LinearLayout(this);
        mContainer.setOrientation(LinearLayout.VERTICAL);
        mContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
        setContentView(mContainer);

        Intent intent;

        // Web
        intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://francho.org/"));
        createButton("Web", intent);

        // Web filtrada
        intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/"));
        createButton("Google maps (web)", intent);

        // Geo (maps)
        intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:41.656313,-0.877351"));
        createButton("Google maps geopunto", intent);

        // Llamadas
        intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:976123123"));
        createButton("Llamada telefónica", intent);

        // Enviar texto (sencillo)
        intent = new Intent(Intent.ACTION_SEND);
        intent.setType("text/plain");
        intent.putExtra(Intent.EXTRA_SUBJECT, "asunto de prueba");
        intent.putExtra(Intent.EXTRA_TEXT, "probando el envio");
        createButton("compartir (selector)", intent.createChooser(intent, "enviar"));

        // enviar un mail
        intent = new Intent(Intent.ACTION_SEND);
        intent.setType("text/plain");
        intent.putExtra(Intent.EXTRA_SUBJECT, "asunto de prueba");
        intent.putExtra(Intent.EXTRA_TEXT, "probando el envio");
        intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"sheldon@cooper.com"});
        createButton("Mail To", intent);

        // tomar una foto
        intent = new Intent("android.media.action.IMAGE_CAPTURE");
        createButton("Tomar foto", intent, REQUEST_PHOTO);
    }

    @Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(resultCode == Activity.RESULT_OK) {
			Bundle extras;
			switch(requestCode) {
			case REQUEST_PHOTO:
				extras = data.getExtras();
				String result = data.toURI();
				Toast.makeText(IntentsActivity.this, result, Toast.LENGTH_LONG).show();
			}
		}
		super.onActivityResult(requestCode, resultCode, data);
	}

	protected void createButton(String label, Intent intent) {
    	createButton(label, intent, null);
    }

    protected void createButton(String label, Intent intent, Integer requestCode) {
    	 Button btn = new Button(this);
    	 btn.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    	 btn.setText(label);
    	 btn.setOnClickListener(new BtnOnClickListener(intent, requestCode));

    	 mContainer.addView(btn);
    }

    class BtnOnClickListener implements OnClickListener  {

    	private Intent mIntent;
		private Integer mRequestCode;

		BtnOnClickListener(Intent intent, Integer requestCode) {
    		mIntent = intent;
    		mRequestCode = requestCode;
    	}

		public void onClick(View v) {
			try {
				if( mRequestCode != null) {
					startActivityForResult(mIntent, mRequestCode);
				} else {
					startActivity(mIntent);
				}
			} catch(Exception e) {
				Toast.makeText(IntentsActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
				e.printStackTrace();
			}
		}

    }

}

Actualización 9-Nov-2011

Subido el código fuente de este proyecto a Github: https://github.com/francho/francho.org-lab/tree/master/0806-LlamadasIntents

About these ads

Acerca de francho

Maño, unutopico, geek, artesano de software, aprendiz ágil, programador Android en activo, sysop retirado, linuxero de corazón, papá a tiempo completo... Más en francho.org/about

Publicado el 11 abril, 2011 en Android y etiquetado en , , . Guarda el enlace permanente. 17 comentarios.

  1. y en el main ke va si pongo solo ese codigo en lo de java entonces en el main ke va ?????

    • Es una aplicación Android, que no tiene main, a diferencia de una aplicación en Java. Lo más parecido al main sería el contenido del onCreate(), pero ya te digo es Android (Sin ir más lejos el SetContentView no te lo cogerá)

  2. Mary acabo de subir el código fuente del proyecto completo a Github.

    Tienes el enlace al pie del artículo.

    Espero que te sirva.

  3. el ejemplo esta genial pero cuando lo intento abrir , no sirve al exportar… no entiendo como es que lo tengo que hacer, espero me puedan ayudar

  4. Si no quieres exportar el repositorio entero de github debes crear un proyecto que siga la estructura y tenga el mismo contenido que:

    https://github.com/francho/francho.org-lab/tree/master/0806-LlamadasIntents

    (Este proyecto está preparado para ser Compilado con Eclipse + Android ADT)

    Saludos

  5. Gracias por la info ;)

  6. Hola, tengo una duda se puede abrir cualquier aplicación que tengas instalada en tu android mediante un intent?, si es asi como puedes conocer el formato de las llamadas?

    gracias.

    • Si, si conoces la llamada o los filtros puedes llamar a cualquier Activity o servicio.

      Normalmente la documentación de la app llamada debe darte los filtros de intent o llamada a usar.

      Tambien puedes fijarte en los logs del sistema: enchufas el terminal a tu ordenador abres los logs (por ejemplo desde el Eclipse), arrancas la aplicación y te fijas que intent se ha llamado.

      Saludos

  7. francho me gustaria que me explicases si vos podes , el como acceder a la opcion descolgar la llamada en android, si podes mandame un correo a la direccion que os puse al enviar este coment y me comentas por ahi, gracias.
    un saludo

  8. David,

    La verdad es que nunca me he puesto con el tema de llamadas. De todas formas supongo que se hará a través de TelephonyManager (http://developer.android.com/reference/android/telephony/TelephonyManager.html) o de algún tipo de BroadcastReceiver

    Saludos

  9. Hola que tal quería consultarte si sabes como interactuar con la aplicaicón google maps para pasarle dos posiciones y que me muestre el camino entre los dos puntos.
    Gracias.

  10. Buenas tarde suna pregunta como hacer en mi aplicacion cuando oprimo la tecla BACK y me saque al menu del celular… que no sea solo con la tecla HOME, gracias y buen post.

  11. Lugh debes crear un intent de tipo ACTION_VIEW y montar una url similar a la de la web de Google Maps, si tienes la app oficial instalada (como tiene los filtros correspondientes definidos) la abrirá.

    Un ejemplo de llamada sería

    Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
    Uri.parse(“http://maps.google.com/maps?saddr=”+latitude_source+”,”+longitude_source+”&daddr=”+destinotLatitud+”,”+destinoLongitud));
    startActivity(intent);

  1. Pingback: Bitacoras.com

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 1.028 seguidores

A %d blogueros les gusta esto: