Descripción general del marco de trabajo de Telecom

El marco de trabajo de Telecom de Android administra las llamadas de audio y video en un dispositivo Android. Eso incluye las llamadas basadas en la SIM (es decir, las que usan el marco de trabajo de telefonía) y las llamadas de VOIP suministradas por los implementadores de la API de ConnectionService.

Los dos componentes principales con los que trabaja Telecom son ConnectionService e InCallService. Una implementación de ConnectionService está a cargo de conectar llamadas a otra parte usando determinados medios (por ejemplo, VOIP). La implementación de ConnectionService más habitual es el ConnectionService de telefonía, que está a cargo de conectar llamadas de empresas telefónicas. Una implementación de InCallService está a cargo de suministrar una interfaz de usuario a las llamadas administradas por Telecom y de ofrecer al usuario una manera de interactuar con esas llamadas y controlarlas. La app de teléfono incorporada al dispositivo es el ejemplo más habitual de una implementación de un InCallService.

Telecom actúa como conmutador: enruta las llamadas suministradas por las implementaciones de ConnectionService a la interfaz de usuario de llamada suministrada por las implementaciones de InCallService.

Es recomendable que implementes las API de Telecom si:

  1. Quieres crear un reemplazo para la app de teléfono del sistema.
  2. Quieres crear una solución de llamadas que se integre a la experiencia de llamada de Android.

Crear una app de teléfono de reemplazo

Si quieres crear un reemplazo para la app de teléfono predeterminada de un dispositivo Android, implementa la API de InCallService. Es importante advertir que un InCallService no debe tener ninguna capacidad de realizar llamadas: debe comprender únicamente la interfaz de usuario de las llamadas. Un InCallService debe manejar todas las llamadas que reconozca el marco de trabajo de Telecom. No debe hacer suposiciones sobre el carácter de las llamadas (por ejemplo, suponer que son llamadas telefónicas basadas en SIM) y no debe implementar restricciones a las llamadas sobre la base de cualquier ConnectionService (por ejemplo, no debe aplicar restricciones de telefonía para las videollamadas).

Para obtener más información, consulta InCallService.

Integrar una solución de llamadas

Si quieres integrar tu solución de llamadas en Android, tienes las siguientes opciones:

  1. Implementar la API de ConnectionService autoadministrada: Esto es ideal para los desarrolladores de apps de llamadas independientes que no desean mostrar sus llamadas dentro de la app de teléfono predeterminada ni que otras llamadas aparezcan en su interfaz de usuario. Tradicionalmente, las apps de llamadas independientes recurrían a reconocer el estado del teléfono para tratar de determinar cuándo se estaban realizando otras llamadas. Eso resulta problemático, ya que el estado del teléfono no tiene en cuenta otras apps de llamadas que el usuario puede haber instalado. Usar un ConnectionService autoadministrado te ayuda a asegurarte de que tu app funcionará no solo con las llamadas de telefonía nativas del dispositivo, sino también con otras apps de llamadas independientes que implementen la API. La API de Self-Managed ConnectionService también administra el enrutamiento de audio y el foco por ti. Para obtener más información, consulta Self-Managed ConnectionServices
  2. Implementar la API de ConnectionService administrada: Esto facilita el desarrollo de una solución de llamadas que use la aplicación de teléfono existente en el dispositivo (consulta getDefaultDialerPackage()) para suministrar la interfaz de usuario de las llamadas. Un ejemplo podría ser una implementación de terceros de llamadas SIP o un servicio de llamadas VOIP. Un ConnectionService por sí solo ofrece los medios para conectar llamadas, pero no tiene una interfaz de usuario asociada. Para obtener información detallada, consulta ConnectionService.
  3. Implementar tanto la API de InCallService como la API de ConnectionService. Esto es ideal si quieres crear tu propia solución de llamadas basada en ConnectionService, con su propia interfaz de usuario, sin dejar de mostrar todas las demás llamadas de Android en la misma interfaz de usuario. Con este enfoque, sigue siendo necesario que te asegures de que tu InCallService no haga suposiciones sobre el origen de las llamadas que muestra. También debes asegurarte de que tu implementación de ConnectionService pueda funcionar sin que la app de teléfono determinada se envíe a tu InCallService personalizado.

Filtrar llamadas

Los dispositivos con Android 10 (nivel de API 29) y versiones posteriores permiten que tu app identifique llamadas de números que no estén en la libreta de direcciones del usuario como posibles llamadas de spam y que esas llamadas se rechacen silenciosamente en nombre del usuario. La información sobre estas llamadas bloqueadas se registra como llamadas bloqueadas en el registro de llamadas a fin de suministrar transparencia al usuario en caso de que pierda llamadas. El uso de esta nueva API elimina los requisitos de obtener permisos READ_CALL_LOG del usuario para ofrecer funciones de filtrado de llamadas e identificador de llamada

Redireccionar una llamada

En dispositivos con Android 10 (nivel de API 29) y versiones posteriores, los intents de llamadas se manejan de forma distinta que en los dispositivos con Android 9 o versiones anteriores. La transmisión NEW_OUTGOING_CALL quedó obsoleta y se reemplazó con la CallRedirectionService API. La API de CallRedirectionService ofrece interfaces que te permiten modificar las llamadas salientes realizadas por la plataforma de Android. Por ejemplo, tienes la opción de que las apps de terceros cancelen llamadas y las enruten por VOIP.