Android 9 proporciona APIs para mejorar la compatibilidad con las apps de llamadas de terceros. Por lo general, las apps de llamadas de terceros dependen de las APIs de Telephony, como la transmisión PHONE_STATE, para coexistir junto con las llamadas telefónicas de los proveedores. Como consecuencia, las apps de llamadas de terceros deben dar prioridad a las llamadas de los proveedores 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 proveedor.
Las APIs de Android 9 admiten situaciones de llamadas simultáneas entre apps de terceros y llamadas de proveedores. Esto permite, por ejemplo, recibir una llamada entrante de terceros mientras se está en una llamada mediante 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 clase ConnectionService autoadministrada. Para obtener más información sobre cómo compilar una
app de llamadas con esta clase, consulta Cómo compilar una app de llamadas con la biblioteca Core-Telecom
library.
La clase autoadministrada ConnectionService 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 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 teléfono de 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 retener una llamada en algunas circunstancias. El framework incluye disposiciones para resolver estos tipos 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 móvil (por ejemplo, con su proveedor FooCom), tu app de teléfono o marcador debe indicarle al usuario que, si responde la llamada de la red móvil, 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 retener. Si se responde una nueva llamada móvil, 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 con el nombre de la app
cuya llamada se desconecta cuando se responde la llamada móvil 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 móviles.
Cuando la app de teléfono de 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 la clase PhoneAccount. Para determinar si una entrada del registro de llamadas es
de una app de llamadas de terceros, verifica las capacidades de PhoneAccount para ver
si CAPABILITY_SELF_MANAGED está configurado.
El método getLabel del PhoneAccount que se muestra muestra el nombre de
la app asociada con una entrada del registro de llamadas de la app de llamadas de terceros.
Controles de integración del registro de llamadas de VoIP
A partir de Android 17 (nivel de API 37), las apps de llamadas de VoIP de terceros que se integran con Core-Telecom y CallsManager pueden escribir su historial de llamadas directamente en el registro de llamadas nativo del sistema Android (CallLog.Calls).
Para garantizar la privacidad del usuario y la higiene de los datos coherentes en todo el ecosistema de Android,
todos los dispositivos con Android 17 (nivel de API 37) y versiones posteriores que declaren el indicador de función de telecomunicaciones (android.software.telecom) y tengan el rol android.app.role.DIALER
deben admitir controles de integración del registro de llamadas de VoIP por app según el Documento de definición de compatibilidad (CDD) de Android.
Requisitos de implementación del dispositivo
Los dispositivos deben proporcionar una pantalla de Configuración accesible para el usuario (que suele ubicarse en Configuración > Cuentas de llamadas > Registros de llamadas integrados) que permita a los usuarios ver y activar o desactivar la integración del registro de llamadas para apps de VoIP de terceros individuales.
Para cumplir con este requisito, debes integrar el valor predeterminado de la plataforma de stock:
- Integración de la configuración de la plataforma: Asegúrate de que tu dispositivo incluya
com.android.phone.settings.PhoneAccountSettingsActivityque proporciona la plataforma de Android lista para usar (com.android.phone). - Requisito de resolución de intents: Tu dispositivo debe resolver el intent
TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION(android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) en la pantalla de administración de la plataforma de stock.
Cuando una app, un mensaje del sistema o un vínculo directo invocan lo siguiente, el intent debe iniciar correctamente PhoneAccountSettingsActivity y no debe arrojar una ActivityNotFoundException:
Intent intent = new Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION);
context.startActivity(intent);
Validación
Para probar que tu dispositivo admite apps de llamadas de terceros, usa la app de prueba de Telecomm, que implementa la clase 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 clase 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 le 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 aparece en el registro de llamadas del sistema.
Controles de integración del registro de llamadas de VoIP
Para verificar el cumplimiento del requisito de intent de integración del registro de llamadas de VoIP en Android 17 y versiones posteriores, ejecuta la prueba CtsTelecomTestCases del Conjunto de pruebas de compatibilidad (CTS). Esta prueba verifica en los límites del paquete que el envío de TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION (android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) se resuelva en el dispositivo en un controlador de actividad exportado válido (verificación resolveActivity).