Android 9 proporciona APIs para admitir mejor las apps de llamadas de terceros. Por lo general, las apps de llamadas de terceros dependen de las APIs de telefonía, como la transmisión de PHONE_STATE
, para coexistir junto con las llamadas telefónicas de las empresas de telecomunicaciones. En consecuencia, las apps de llamadas de terceros deben dar prioridad a las llamadas del operador y, a menudo, deben rechazar de forma silenciosa las llamadas entrantes en la app o finalizar una llamada en curso para dar lugar a una llamada mediante operador.
Las APIs de Android 9 admiten situaciones de llamadas simultáneas entre apps de terceros y llamadas del operador. Esto permite, por ejemplo, recibir una llamada entrante de terceros mientras se está en una llamada del operador. El framework asume la responsabilidad de garantizar que la llamada del operador se mantenga 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 Cómo compilar una app de llamadas.
La API de ConnectionService
autoadministrada también les brinda a los desarrolladores la oportunidad de habilitar que las llamadas de su app se registren 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 marcación 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 marcación 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 marco de trabajo incluye disposiciones para resolver estos tipos de casos.
Situaciones
Deberías modificar tu app de Teléfono 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 poner en espera, y el usuario recibe una llamada móvil (por ejemplo, con su operador FooCom), la app de Teléfono o Teléfono con teclado debe indicarle al usuario que, si contesta 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 respondes una nueva llamada móvil, se desconecta la llamada en curso de terceros.
Consulta la interfaz de usuario en la figura para ver un ejemplo:
Figura 1: La llamada entrante desconecta una llamada de terceros en curso.
La app de Teléfono puede revisar los extras de llamadas para comprobar si una llamada entrante provoca la desconexión de otra.
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 del dispositivo móvil.
Entradas del registro de llamadas de apps de llamadas de terceros
Los desarrolladores de apps de llamadas de terceros pueden habilitar que las llamadas de su app se registren 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 de llamadas de red móvil.
Cuando la app de Teléfono del AOSP muestra entradas de registro de llamadas relacionadas con una app de llamadas de terceros, el nombre de la app donde 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 una app de llamadas de terceros en la app del teléfono
Para determinar el nombre de una app asociada con una entrada de registro de llamadas, usa las columnas PHONE_ACCOUNT_COMPONENT_NAME
y PHONE_ACCOUNT_ID
del proveedor de registros de llamadas para crear una instancia de PhoneAccountHandle
, que identifique 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 funciones de PhoneAccount
para ver si está configurado CAPABILITY_SELF_MANAGED
.
El método getLabel
de la PhoneAccount
que se muestra muestra el nombre de la app asociada con una entrada de registro de llamadas de la app de terceros que realiza la llamada.
Validación
Para probar que tu dispositivo admita 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 ejemplo administrado por el cliente a tu 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: Prueba la app con implementaciones de ejemplo de la API de ConnectionService.
- Borra la opción Holdable.
- Presiona SALIDA para iniciar una nueva llamada saliente de muestra.
- Presiona el botón ACTIVO 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 el nombre de una app al marcador, 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 del teléfono y confirma que la llamada aparezca en el registro de llamadas del sistema.