Android 9 proporciona APIs para mejorar la compatibilidad con las apps de llamadas de terceros. Por lo general, las apps de llamadas de terceros se basan en las APIs de Telephony, como la transmisión 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 los operadores y, a menudo, rechazan silenciosamente las llamadas entrantes en la app o finalizan una llamada en curso para dar paso a una llamada de un operador.
Las APIs de Android 9 admiten situaciones de llamadas simultáneas entre apps de terceros y llamadas de operadores. Esto permite, por ejemplo, recibir una llamada entrante de terceros mientras se realiza una llamada de un operador. El framework asume la responsabilidad de garantizar que se mantenga la llamada mediante 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 autoadministrada ConnectionService también 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 obtener un ejemplo de cómo la app de teléfono AOSP cumple con este
requisito, consulta
Entradas del registro de llamadas de apps de llamadas de terceros).
Las apps son responsables de configurar
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 framework incluye disposiciones para resolver este tipo de casos.
Situaciones
Debes modificar tu app de teléfono para controlar las siguientes situaciones.
Controla 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 retención y el usuario recibe una llamada de celular (por ejemplo, con su operador FooCom), tu app de teléfono o marcador debe indicarle al usuario que, si responde la llamada de la red de telefonía celular, 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: Llamada entrante que desconecta una llamada de terceros en curso
Tu app de teléfono puede verificar si una llamada entrante hace que se
desconecte otra llamada. Para ello, verifica 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 de celular entrante.
Entradas del registro de llamadas de apps de llamadas de terceros
Los desarrolladores de apps de llamadas de terceros pueden habilitar el registro de llamadas en 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 de telefonía celular.
Cuando la app de teléfono 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 figura:
Figura 2: Entrada del registro de llamadas con el nombre de la app de llamadas de terceros en la app de teléfono
Para determinar el nombre de una app asociada con una entrada del registro de llamadas, usa las
PHONE_ACCOUNT_COMPONENT_NAME
y
PHONE_ACCOUNT_ID
columnas en el 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
PhoneAccount capacidades
para ver si
CAPABILITY_SELF_MANAGED
está configurado.
El
getLabel
método del PhoneAccount que se muestra devuelve 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 lo siguiente:
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.
Controla 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 implementaciones de muestra de la API de ConnectionService
- Borra la opción Holdable.
- Presiona OUTGOING para iniciar una nueva llamada saliente de muestra.
- Presiona el botón ACTIVE para activar la llamada.
- Llama al número de teléfono del dispositivo en prueba con otro teléfono. Esto invoca la situación en la que se proporciona a tu teléfono 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 en el registro de llamadas del sistema. Para confirmar que el dispositivo registra llamadas de apps de llamadas de terceros, abre tu app de teléfono y confirma que la llamada aparezca en el registro de llamadas del sistema.