lunes, 26 de marzo de 2012

Android : Introducción, tutorial y tipos de Intent

Hoy en Android vamos a ver que es eso de Intent. Para mí es un recurso muy útil y práctico.


Para que todos lo entendamos un Intent és una llamada a otra aplicación, ya sea nuestra o del sistema operativo Android. Dentro de esa 'llamada' además podemos añadirle datos, ya sean parámetros de configuración o simple información.

Según mi definición tipos de Intent hay infinitos ya que es para llamar a cualquier aplicación. Aunque un Intent se puede clasificar de dos maneras:


- Lanzar una simple llamada a otra aplicación.
 -Lanzar una llamada a otra aplicación y además recibir una respuesta después de finalizar esta.

Os voy a enseñar unos cuantos intents para que se entienda mejor:

(para utilizar estos ejemplo se podrían meter dentro de un botón para ser activado. Para esto os iría bien leer primero este tutorial http://www.tutorialeshtml5.com/2012/02/tutorial-basico-android-agregar-boton.html )

Intent para ir de un class a otro (sin respuesta) 

Creamos el Intent y de parámetros ponemos el nombre de la clase actual añadiendo el .class y de segundo parámetro la clase a donde queremos ir y con startActivity la lanzamos. Codigo:

Si quisieramos añadir información a este Intent para que lo reciva la claase destino sería de la siguiente manera:


Como vemos tenemos que crear un Bundle y en este caso le hemos añadido dos mensajes (Hola buenos dias! y Hasta otra), cada uno de ellos tiene que tener un ID, es decir, un nombre para referirnos a ellos. En nuestro caso el ID són saludo y despedida.
Con esas pocas líneas ya lanzamos otra clase y ademas añadimos información, ¿pero como leer esa informacion desde la ClaseDestino?

De esta manera tan sencilla:
Hay ue crear otro Bundle (ya en la ClaseDestino) y recivimos los extras del Intent. Para elegir un dato u otro estan sencillo como llamarlo con getString() utilizando el ID que hemos añadido antes.

Ejemplos de Intent para S.O Android

Enviar sms:

String s_text = "texto del mensaje";
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setType("vnd.android-dir/mms-sms")
intent.putExtra("sms_body", s_text)
startActivity(intent);
  

Compartir texto Share através de whatsapp o otras aplicaciones:


Llamar a un número de teléfono:


Ejemplo hacer foto con camara Intent Y obtener respuesta


Como vemos la diferencia es que en vez de usar startActivity() hay que usar startActivityForResult. Y el segundo parámetro 'Camera_PIC_REQUEST' es solo un ID por si   utilizáramos más de un Intent con respuesta y poder diferenciarlos dentro del onActivityResult através del parámetro requestCode.

Para recibir en este caso una imagen es bastante sencillo. El método onActivityResult se lanzará una vez finalice el Intent a cámara y recibiremos la información (imagen) através del parámetro Data. En nuestro caso lo meteremos dentro de un Bitmap para darle forma a la imagen.


Muchas gracias a todo el mundo, y espero vuestros comentarios!



12 comentarios:

  1. hola amigo esta muy interesante tu publicacion....te escribo por que necesito tu ayuda estoy haciendo una aplicacion con un intent que hace que me habra el navegador y me visualice la url que le doy....aqui os mando el codigo:

    String url = "http://192.168.0.10/prueba/ojoesprueba.php";
    Intent i = new Intent(Intent.ACTION_VIEW);
    i.setData(Uri.parse(url));
    startActivity(i);

    bueno el codigo funciona bien se habre el navegador en la url que le estoy dando pero lo que en realidad necesito es que la cierre en 2 segundos y me devuelva a la aplicacion que estoy haciendo...es decir que me habra el navegador y me lo cierre en 2 segundos dejandome en la aplicacion...muchas gracias amigo te agradeceria en lo que me puedas ayudar!!! =)

    ResponderEliminar
    Respuestas
    1. He añadido un nuevo tutorial, es algo más complejo pero igualmente espero que te ayude, a lo mejor te funcionaría para abrir el navegador en segundo plano o algo así, te dejo aqui el link, Gracias!

      http://www.tutorialeshtml5.com/2012/05/android-thread-hilo-y-handler-proceso.html

      Eliminar
  2. Buenas tardes, eso que pides es algo más complejo.

    He visto un ejemplo en otra página web que añadiéndolo a tu código quedaría así:

    TimerTask task = new TimerTask() {
    @Override
    public void run() {
    // TODO Auto-generated method stub
    String url = "http://192.168.0.10/prueba/ojoesprueba.php";
    Intent i = new Intent(Intent.ACTION_VIEW);
    i.setData(Uri.parse(url));
    startActivity(i);
    finishscreen();
    }
    };

    Timer t = new Timer();
    t.schedule(task, 5000);

    private void finishscreen() {
    this.finish();
    }

    Este código no lo e probado pero mirandolo bien creo que no hace lo que tu quieres. Por lo que parece cerraría a los 5 segundos la Activity (no el navegador) es decir tu aplicación.

    Lo que tu quieres hacer sería bastante más complicado ya que no tienes control sobre el navegador para obligarlo a cerrarse, se podría hacer utilizando startActivityForResult() pero igualmetne se cerraría al acabar su vida no por tiempo.
    Otro método por el cual te acercarías más sería através de Handlets. Publicare un tutorial de eso en cuanto pueda. Gracias por tu comentario! Nose si te ayudado mucho..

    ResponderEliminar
  3. muchas gracias amigo Dios te pague y estare pendiente de tu tutorial =)

    ResponderEliminar
  4. HOLA no tengo la menor idea de como hacer un codigo de fuente y mucho menos como mandarlo , y quiero aprender , se que puedo pero mi problema de aprendisaje es que solo aprendo por ejmplos , para esplicarlo mejor whatever you do I will do better pero solo ,por ejemplos tengo que verlo y asi puedo hacerlo, , quiero meterme a una computadora , o a un msn o a una pagina pwgina , solo quiero aprender a romper esas paredes virtuales , no importa cual , ALO QUE ME REFIERO ES QUE QUIERO UN INICIO DE INTERES EN ESTO ... GRACIAS esper no ofenderte por mi estupides ...

    ResponderEliminar
    Respuestas
    1. Ofender no ofendes a nadie, pero no pretendas entrar a un ordenador o a un msn buscando un tutorial, la cosa no funciona así. Primero deberías hacer un cursillo de programación básica para entender a filosofía de esto y después por tu cuenta no parar de leer para ir aprendiendo cada vez más.
      Y luego te darás cuenta que poder decir que sabes programar y que consigues los retos que te propones lleva muchos años. Lo digo por experiencia. Seguro que yo también publiqué algún comentario como el tuyo hace muchos años ;) Animo!

      Y Muchas gracias!

      Eliminar
    2. Hola wendy, entiendo como te sientes, pero si lo que quieres es hackear sistemas, te recomiendo que empieces por investigar los lenguajes de programación que te lo permiten, porque con android solo vas a poder hacer cosas limitadas ya que es un lenguaje de alto nivel, creo que debes empezar por aprender a programar a bajo nivel, yo no soy programador, pero me gusta mucho y en realidad soy electónico, y se que para entender mas a fondo la programación a nivel mas profundo, es importante saber un tanto de hardware, pero no en el sentido de capacidad ni cosas geek, sino en el sentido de estructura, la palabra clave aqui es ARQUITECTURA DE COMPUTADORES, esto se permite entender como funciona un programa a nivel de hardware, tambien debes entender sobre el modelo OSI, y en realidad esto que te digo es fundamental, ya que los computadores están creados de forma estandar, es decir que a cierto nivel, son todos iguales, por lo tanto una vez que entiendas como funciona el systemas operativo en el hardware, tendras una base mas firme para entender de mejor forma la programación, ya que un lenguaje de prorgramación tiene limites por parte del hardware y por parte del lenguaje mismo.! Por otra parte cuando hablamos de niveles de un lenguaje tienes que entender lo siguiente, los computadores no entienden con palabras, sino que solo entienden el lenguaje binario, ya que asi fueron construidos y como programar en este lenguaje es muy dificil, ya que en necesario un conocimiento muy especifico del hardware, entonces se creó otros lenguajes mas comprensibles para el hombre que son traducidos a lenguaje binario y mas tarde cargado en las maquinas.! Y así esto se repite para acercarse al lenguaje natural de las personas.! Lo que hoy vemos como lenguaje android, no es mas que un idioma sofisticadamente preparado, para luego ser traducido a lenguaje binario para que pueda ejecutarse en el hardware.! Un ejemplo real de esto seria en este orden basicamente. En el menor nivel esta en ensamblador (assembler), sobre este se construye el lenguaje en C luego C++, y de ahi en adelanteen muchos mas, como JAVA .NET y otros. Debes investigar sobre estos desarrollos anteriores para entender lo que hoy en dia significa.! Hay muchas cosas mas que contar sobre esto, ya que hay muchos lenguajes de programación y todos tienen ventajas y contras.! además de que estan enfocados para distintos propositos. Y bueno esta respuesta tan larga la hago, porque realmente vi que te apaciono el tema.! Y es dificil para algunos empezar en estos tiempos en los que hay muchas distracciones, pero solo necesitas enfocar tus energias en lo importante y verás que este conocimiento te será útil por mucho tiempo. Suerte y si tienes dudas enviame un correo. PD: Felicitaciones muy buenos los tutoriales.! a mi me gustaria conseguir un libro de android.!

      Eliminar
    3. Una corrección,con leguajes de alto nivel también se pueden romper sistemas,de echo tranquilamente en android se podria hacer una apliicacion que tome el control total del sistema,en mi opinión no seria nada limitado!

      Eliminar
  5. Hola busco información para lanzar un intent para el reconocimiento de voz y poder utilizar las cosas que contiene como usar "llamar ah ..." y que habrá la agenda o llame directamente a la persona dicha .
    Tengo este codigo
    private void startVoiceRecognitionActivity() {
    // Definición del intent para realizar en análisis del mensaje
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    // Indicamos el modelo de lenguaje para el intent
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    // Definimos el mensaje que aparecerá en la parte superior del Intent (mensaje del prompt)
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"Diga su instrucción:");
    // Lanzamos la actividad esperando resultados
    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
    }
    lanza el reconocimiento de voz pero no me reconoce la opcion de llamar a.. o enviar mensaje a..
    que puedo hacer??
    Gracias de antemano

    ResponderEliminar
    Respuestas
    1. Buenas! pues es algo más complejo ya que tu lo que haces con ese código es lanzar el reconocimiento de voz y obtener un String con el texto dicho. Como inicio está bien pero le hacen falta más cosas. Esta semana aré un tutorial de como hacer eso que pretendes. Estate atento ;)

      Muchas gracias! los +1 siempre cuentan :)

      Eliminar
    2. He creado un tutorial sobre esto que comentas, me gustaría que fuera de tu ayuda ;)

      http://www.tutorialeshtml5.com/2013/03/tutorial-simple-reconocimiento-de-voz.html

      Eliminar
  6. Como puedo crear un botón con la función intent lanzar calendario y otro horno para lanzar la alarma.

    ResponderEliminar