Android 9 proporciona APIs para mejorar la compatibilidad con las apps de llamadas de terceros. Las apps de llamadas de terceros suelen depender de las APIs de Telephony, como la transmisión de PHONE_STATE
, para coexistir junto con las llamadas telefónicas de los operadores. Como consecuencia, las apps de llamadas de terceros deben dar prioridad a las llamadas de operadores y, a menudo, rechazan de forma silenciosa las llamadas entrantes en la app o finalizan una llamada en curso para dar paso a una llamada de operador.
Las APIs en Android 9 admiten situaciones de llamadas simultáneas entre apps de terceros y llamadas de operadores. Esto permite, por ejemplo, recibir una llamada externa entrante mientras se está en una llamada de operador. El framework asume la responsabilidad de garantizar que se mantenga la llamada del operador cuando el usuario participa en la llamada de terceros.
En Android 9, se recomienda que las apps de llamadas de terceros implementen la API de ConnectionService
autoadministrada. Para obtener más información sobre cómo compilar una app de llamadas con esta API, consulta Compila una app de llamadas.
La API de ConnectionService
autoadministrada también les brinda a los desarrolladores la oportunidad de habilitar el registro de llamadas en su app en el registro de llamadas del sistema (consulta EXTRA_LOG_SELF_MANAGED_CALLS
). Según los requisitos del Documento de Definición de Compatibilidad (CDD) de Android (sección 7.4.1.2), debes asegurarte de que tu app de teléfono o marcador muestre estas entradas del registro de llamadas y muestre el nombre de la app de llamadas de terceros desde la que se originó la llamada (para ver un ejemplo de cómo la app de marcador del AOSP cumple con este requisito, consulta Entradas del registro de llamadas de apps de llamadas de terceros).
Las apps son responsables de establecer CAPABILITY_SUPPORT_HOLD
y CAPABILITY_HOLD
en las conexiones de sus apps. Sin embargo, es posible que una app no pueda mantener una llamada en algunas circunstancias. El marco de trabajo incluye disposiciones para resolver este tipo de casos.
Situaciones
Debes modificar tu app de marcador para que controle las siguientes situaciones.
Cómo controlar las llamadas entrantes que desconectan una llamada en curso
En una situación en la que hay una llamada de terceros en curso (p.ej., en una llamada de SuperCaller) que no admite la función de espera y el usuario recibe una llamada móvil (por ejemplo, con su operador FooCom), la app de Teléfono o Marcador debe indicarle al usuario que, si contesta la llamada de la red móvil, se finalizará la llamada de terceros en curso.
Esta experiencia del usuario es importante, ya que una app de llamadas de terceros puede tener una llamada en curso que el framework no puede mantener. Si respondes una nueva llamada de celular, se desconectará la llamada de terceros en curso.
Consulta la interfaz de usuario en la figura para ver un ejemplo:
Figura 1: La llamada entrante desconecta una llamada de terceros en curso.
Tu app de marcado puede verificar si una llamada entrante provoca que se desconecte otra llamada. Para ello, debe consultar los extras de la llamada.
Asegúrate de que EXTRA_ANSWERING_DROPS_FG_CALL
esté configurado como TRUE
y que EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME
esté configurado como el nombre de la app cuya llamada se desconecta cuando se responde la llamada entrante al celular.
Entradas del registro de llamadas de apps de llamadas de terceros
Los desarrolladores de apps de llamadas de terceros pueden habilitar el registro de las llamadas de su app en el registro de llamadas del sistema (consulta EXTRA_LOG_SELF_MANAGED_CALLS
). Esto significa que es posible tener entradas en el registro de llamadas que no sean para llamadas de redes móviles.
Cuando la app de Teléfono del AOSP muestra entradas del registro de llamadas relacionadas con una app de llamadas de terceros, el nombre de la app en la que se realizó la llamada se muestra en el registro de llamadas, como se ilustra en la siguiente figura:
Figura 2: Entrada del registro de llamadas con el nombre de la app de llamadas de terceros en la app del marcador.
Para determinar el nombre de una app asociada a una entrada del registro de llamadas, usa las columnas PHONE_ACCOUNT_COMPONENT_NAME
y PHONE_ACCOUNT_ID
del proveedor del registro de llamadas para crear una instancia de PhoneAccountHandle
, que identifica la fuente de una entrada del registro de llamadas. Consulta TelecomManager
para obtener los detalles de PhoneAccount.
Para determinar si una entrada del registro de llamadas proviene de una app de llamadas de terceros, verifica las capacidades de PhoneAccount
para ver si se configuró CAPABILITY_SELF_MANAGED
.
El método getLabel
del objeto PhoneAccount
devuelto muestra el nombre de la app asociada con una entrada del registro de llamadas de la app de llamadas de terceros.
Validación
Para probar que tu dispositivo admite apps de llamadas de terceros, usa la app de prueba de Telecomm, que implementa la API de ConnectionService autoadministrada. La app se encuentra en /packages/services/Telecomm/testapps/
.
Compila la app de prueba desde la raíz de tu repositorio de código fuente de Android con el siguiente comando:
mmma packages/services/Telecomm/testapps/
Instala el APK de compilación con
adb install -g -r <apk path>
. Luego, se agrega un ícono de muestra autoadministrada al selector.Presiona el ícono para abrir la app de prueba.
Cómo controlar las llamadas entrantes que desconectan una llamada en curso
Sigue estos pasos para verificar que una llamada entrante desconecte una llamada de terceros en curso.
Figura 3: App de prueba con muestras de implementaciones de la API de ConnectionService.
- Desmarca la opción Holdable.
- Presiona SALIENTE para iniciar una nueva llamada saliente de muestra.
- Presiona el botón ACTIVA para activar la llamada.
- Llama al número de teléfono del dispositivo que se está probando con otro teléfono. Esto invoca la situación en la que se le proporciona a tu marcador el nombre de una app, cuya llamada se desconectará.
- Cuando termines, presiona el botón DISCONNECT en la app de prueba.
Entradas del registro de llamadas de apps de llamadas de terceros
Después de completar los pasos anteriores, la app de prueba debería haber registrado una llamada al registro de llamadas del sistema. Para confirmar que el dispositivo registra llamadas de apps de llamadas de terceros, abre la app de marcador y confirma que la llamada aparezca en el registro de llamadas del sistema.