Reemplazar la aplicación de teléfono predeterminada en Android 6 y 7 con InCallService

Android API nivel 23 agregó InCallService para proporcionar la interfaz de usuario para la gestión de llamadas telefónicas . La documentación proporciona un registro de manifiesto de ejemplo, pero no pude hacer que funcione. La aplicación comstack bien, pero las aplicaciones predeterminadas en la configuración no muestran mi aplicación.

El único lugar donde encontré información sobre el tema fue una pregunta de StackOverflow que se cerró hace un año. Comente sobre la pregunta propuesta para agregar la actividad android.intent.action.DIAL , pero eso tampoco me ayudó. También he probado varias combinaciones de otras intenciones ( android.intent.action.CALL_DIAL y android.intent.action.ANSWER ) en mi actividad.

¿Hay algún ejemplo de código de trabajo necesario para reemplazar la aplicación del teléfono? ¿Las clases deben proporcionar algunos métodos de trabajo para que se muestre la aplicación?

La aplicación comstack bien, pero las aplicaciones predeterminadas en la configuración no muestran mi aplicación.

Para que su aplicación aparezca como una aplicación de teléfono, debe tener una actividad con al menos esos filtros de intención (para manejar ambos casos mencionados en la documentación de ACTION_DIAL , también mencionada en la clase oculta DefaultDialerManager ):

        

Y para ser sincero, eso es un poco contrario a la intuición, porque configurar la aplicación de teléfono predeterminada es independiente de establecer un marcador predeterminado: el primero solo controla la interfaz de usuario de llamada en curso, mientras que el último controla solo la interfaz de usuario de marcado.

El mínimo anterior se puede mejorar un poco, para permitir el ajuste de su marcador como predeterminado, y el inicio desde el navegador web, utilizando estos filtros de intención en su lugar:

               

La aplicación Dialer en AOSP tiene aún más filtros declarados.

Puede facilitar que el usuario configure su aplicación como la aplicación de teléfono predeterminada con la ayuda de TelecomManager :

 if (getSystemService(TelecomManager::class.java).defaultDialerPackage != packageName) { Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER) .putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName) .let(::startActivity) } 

Esto mostrará un diálogo similar a esto:

cambiar el diálogo del marcador predeterminado

Consulte Responder llamadas entrantes usando android.telecom e InCallService para lo que necesita hacer para manejar realmente las llamadas.

Aquí está el código de una aplicación que implementa el mínimo necesario para manejar la marcación y aceptar / rechazar / finalizar llamadas en su propia IU:

https://github.com/arekolek/simple-phone