android android-intent android-6.0-marshmallow android-7.0-nougat android-7.1-nougat

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



android-intent android-6.0-marshmallow (1)

El nivel 23 de la API de Android agregó InCallService para proporcionar la interfaz de usuario para administrar las llamadas telefónicas . La documentación proporciona un registro de manifiesto de ejemplo, pero no pude hacerlo funcionar. La aplicación se compila 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 esa 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 funcional de código necesario para reemplazar la aplicación del teléfono? ¿Las clases necesitan proporcionar algunos métodos de trabajo para que se muestre la aplicación?


La aplicación se compila 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 ):

<intent-filter> <action android:name="android.intent.action.DIAL" /> <data android:scheme="tel" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.DIAL" /> </intent-filter>

Y para ser honesto, eso es un poco contradictorio, porque configurar la aplicación de teléfono predeterminada es independiente de configurar un marcador predeterminado: el primero controla solo la interfaz de usuario de la llamada en curso, mientras que el segundo controla solo la interfaz de marcado.

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

<intent-filter> <!-- Handle links from other applications --> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.DIAL" /> <!-- Populate the system chooser --> <category android:name="android.intent.category.DEFAULT" /> <!-- Handle links in browsers --> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="tel" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.DIAL" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>

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

Puede hacer que sea más fácil para el usuario configurar 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 cuadro de diálogo similar a este:

Consulte Responder llamadas entrantes usando android.telecom e InCallService para saber qué debe hacer para manejar las llamadas.

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

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