Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android

Como Hacer Llamadas y Usar SMS en Apps Android

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Nadia Castelli (you can also view the original English article)

En este tutorial, aprenderás acerca de la API de Telefonía y SMS Android. Aprenderás a realizar una llamada desde tu app y cómo monitorear los eventos de llamada telefónica, así como también a enviar y recibir SMS.

1. Cómo Hacer Una Llamada

Para comenzar, te enseñaré cómo iniciar una llamada desde tu aplicación tanto mediante el uso de la app de llamada telefónica, como también directamente desde tu app, para hacerlo más sencillo para tus usuarios.

Crea un Nuevo Proyecto Android Studio

Inicia Android Studio y crea un nuevo proyecto con una activity vacía, llamada MainActivity.

Android Studio create a new Activity screenshot

Diseña la Pantalla

Por ahora, nuestro layout sólo contendrá un campo EditText y un botón Llamar:

Emulator dial screen with phone number given

Modifica la Clase MainActivity

En el código que verás aquí debajo, creamos un intent ACTION_DIAL para mostrar el marcador telefónico. El número telefónico se obtiene de nuestro esquema URI teltel:XXXXXXXX. Fíjate que no necesitas ningún permiso para que esto funcione:

Si ejecutas la app y presionas el botón de llamada, serás redirigido a la app de llamadas, y allí tendrás que marcar el teléfono tú mismo. Puedes cambiar este flujo para realizar la llamada directamente desde tu app, simplemente reemplazando el intent ACTION_DIAL por ACTION_CALL. Esto requiere el permiso android.permission.CALL_PHONE.

Emulator screen defualt phone dialer with the phone number

2. Monitoreando Eventos de Llamada Telefónica

En esta sección, aprenderemos a monitorear eventos de llamada telefónica en el sistema Android. El teléfono puede estar en alguno de tres estados:

  1. idle (cuando no está siendo usado)
  2. ringing (cuando hay una llamada entrante)
  3. off-hook (cuando la llamada es atendida)

Agrega el Permiso

Necesitamos el permiso READ_PHONE_STATE para poder monitorear el estado del teléfono. Agrégalo en AndroidManifest.xml:

Crea el Objeto PhoneStateListener

Creamos un objeto de la clase PhoneStateListener, y luego sobrescribimos su método onCallStateChanged() (en IntelliJ, esto resulta sencillo de hacer con Control-O, seleccionando o buscando luego el método a sobrescribir). Manejaremos los cambios de estado de llamada mostrando un Toast. Fíjate que también podemos acceder a los números telefónicos entrantes cuando este método se dispara:

Dependiendo de las necesidades de tu aplicación, podrías también sobrescribir alguno de estos otros métodos de evento: onCellInfoChanged()onCallForwardingIndicatorChanged()onCellLocationChanged(), u onSignalStrengthChanged().

Escuchando el Estado de Llamada Telefónica

Para poder empezar a escuchar el estado de llamada telefónica, necesitamos obtener el TelephonyManager del servicio del sistema, e inicializarlo en el onCreate().

En el método onResume(), podemos empezar a escuchar utilizando el método listen() del TelephonyManager, pasándole la instancia de PhoneStateListener y el static LISTEN_CALL_STATE. Paramos de escuchar en el método onStop(), pasando LISTEN_NONE como segundo argumento de listen().

Otras opciones posibles para escuchar al evento son LISTEN_CELL_LOCATIONLISTEN_SIGNAL_STRENGTHLISTEN_CALL_FORWARDING_INDICATOR, y LISTEN_CELL_INFO.

Finalmente, ejecuta la app y asegúrate de recibir una llamada.

Emulator incoming call states

Este monitoreo solo funcionará mientras la app se ejecute en primer plano. Para que esto funcione en segundo plano (cuando nuestra aplicación no está corriendo), necesitaríamos crear un BroadcastReceiver así cuando la app no está ejecutándose, aún podremos monitorear los estados de llamada telefónica. Dependiendo de los requerimientos de tu app, esta podría ser una manera mucho mejor de escuchar los cambios de estado de llamada telefónica. Te enseñaré a hacerlo en la próxima sección.

Ten en cuenta que solamente estamos monitoreando las llamadas entrantes. Para monitorear las salientes, requerimos permisos adicionales. Para monitorear las llamadas salientes, incluye la siguiente línea en tu archivo AndroidManifest.xml.

Cómo Usar el Emulador para Hacer Llamadas y Enviar Mensajes SMS

Puedes utilizar tu emulador para hacer un simulacro de llamada o envío de mensaje SMS, pero necesitarás configurar algunas cosas. Abre tu emulador, presiona el último botón de la barra de navegación derecha para abrir la ventana de diálogo de configuración avanzada, y luego selecciona el botón de teléfono.

Using emulator to make call and send SMS

3. Monitoreando Eventos de Llamada Telefónica en Segundo Plano

Crea un BroadcastReceiver

Al igual que en la sección anterior, necesitamos crear un event listener para monitorear los cambios de estado del teléfono. La mayor diferencia es que esta vez, extenderemos la clase base BroadcastReceiver para poder escuchar los estados de llamada telefónica aún cuando la aplicación no esté ejecutándose. ¡Asegúrate de no registrar el listener más de una vez! Esta comprobación está en la línea 36.

Modifica el AndroidManifest.xml

Un broadcast receiver funciona sólo si está registrado. Necesitamos informarle al sistema Android sobre nuestro broadcast receiver registrándolo en el archivo AndroidManifest.xml, conectando nuestra clase PhoneCallStateReceiver al <intent-filter>l que describe el broadcast que deseamos recibir—en este caso, PHONE_STATE.

Monitoreando Llamadas Salientes

Para las llamadas salientes, necesitas incluir el intent de acción NEW_OUTGOING_CALL <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> en el <intent-filter> del receiver en el AndroidManifest.xml.

Para obtener el número telefónico de la llamada saliente, dentro del método onReceive(Context, Intent), podemos ver el número en el intent, como un extra. Para prevenir que la llamada prospere, podemos invocar setResultData() y pasarle un argumento nulo. resultData se usa como el número real a llamar.

Puedes aprender más acerca de los broadcasts y broadcast receivers en nuestro tutorial, aquí en Envato Tuts+:

4. Enviando Mensajes SMS

Tienes dos opciones principales al momento de enviar SMS: usar la aplicación cliente de SMS del dispositivo, o saltearte el cliente enviando el SMS directamente desde tu app. Veremos ambos escenarios, y puedes decidir cuál es mejor para tu caso de uso. Comencemos enviando un SMS utilizando el cliente de SMS del dispositivo.

Diseña el Layout

Primero, necesitamos modificar nuestro layout principal para que tenga un campo EditText para el mensaje, y un botón Enviar Mensaje.

Modifica la MainActivity

Dentro de nuestro método onCreate() en la clase MainActivity, crea un intent con ACTION_SENDTO como primer argumento y una URI smsto:<phone number> como segundo argumento. El mensaje de texto será el valor del extra sms_body:

Aquí, el cliente SMS hará el monitoreo del estado de la entrega del mensaje.

Ejecuta la App

Cuando todos los campos requeridos hayan sido completados, al tocar el botón Enviar SMS se abrirá el cliente de SMS del usuario, o se darán opciones al usuario para que seleccione una app si no ha seleccionado alguna anteriormente.

Send SMS flow

5. Enviando Mensajes SMS Directamente

A continuación veremos cómo enviar el SMS directamente desde nuestra aplicación en lugar de utilizar el cliente SMS del dispositivo.

Agrega el Permiso en AndroidManifest.xml

Como de costumbre, necesitamos registrar el permiso en el AndroidManifest.xml.

Modifica la clase MainActivity

A continuación, para Android 6.0 (API nivel 23) y superiores, necesitamos pedir el permiso SEND_SMS en tiempo de ejecución.

Para aprender más acerca de los permisos en tiempo de ejecución en Android, y cómo han cambiado a partir de la versión 6.0, lee nuestro tutorial aquí, en Envato Tuts+:

Para enviar un SMS, obtenemos la instancia SmsManager por defecto y luego invocamos su método sendTextMessage(), pasándole el número telefónico como primer argumento, y el mensaje como segundo argumento:

Para monitorear el estado de entrega, el método sendTextMessage() del SmsManager tiene dos parámetros opcionales de tipo PendingIntent: sentIntent y deliveryIntent.

Si deseas utilizar sentIntent, observa el código resultante Activity.RESULT_OK si es exitoso, o, en caso contrario, RESULT_ERROR_GENERIC_FAILURERESULT_ERROR_RADIO_OFF, y RESULT_ERROR_NULL_PDU para indicar un error.

6. Recibiendo un Mensaje SMS

Para que tu app comience a recibir mensajes SMS en el teléfono del usuario, lo mejor es tener registrado un broadcast receiver para que pueda recibir una alerta cuando llegue un nuevo SMS, aún cuando tu app no esté corriendo en primer plano.

Agrega el Permiso

Agrega el permiso RECEIVE_SMS al AndroidManifest.xml:

A continuación, necesitamos corroborar que la app tenga permiso para recibir mensajes SMS en tiempo de ejecución. Entonces, en la clase MainActivity, comprueba que esté el permiso RECEIVE_SMS. En caso negativo, pídelo.

Crea un Broadcast Receiver

Recuperamos cada objeto de la clase SmsMessage mediante el uso del método createFromPdu(byte[] pdu), pasándole un PDU (unidad de datos de protocolo). Luego, lo agregamos a nuestro array de mensajes.

Para poder soportar API 23 y superiores, debes incluir el String extra "format" (tanto "3gpp" para mensajes GSM/UMTS/LTE en formato 3GPP, o "3gpp2" para mensajes CDMA/LTE en formato 3GPP2).

Ahora, ejecuta la app, ciérrala, y envía un SMS a tu emulador.

Emulator showing a toast when it receives an SMS in the background

Conclusión

En este tutorial, aprendiste a:

  • hacer una llamada desde tu app
  • monitorear eventos de llamada telefónica
  • enviar mensajes SMS usando tanto la app de mensajería del dispositivo, como así también tu propia aplicación directamente
  • recibir mensajes SMS en segundo plano

Puedes hacer mucho más con llamadas telefónicas y mensajes SMS en Android. Visita la documentación de la API de Telefonía y la SMSManager API de Android para aprender más.

Mientras tanto, ¡revisa algunos de nuestros otros posts acerca de desarrollo Android!

Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.