Android 9 fournit des API pour une meilleure compatibilité avec les applications d'appel tierces. Les applications d'appel tierces s'appuient généralement sur des API de téléphonie telles que la diffusion PHONE_STATE pour coexister avec les appels téléphoniques des opérateurs. Par conséquent, les applications d'appel tierces doivent donner la priorité aux appels des opérateurs et ont souvent recours au rejet silencieux des appels entrants dans l'application ou à la fin d'un appel en cours pour laisser la place à un appel d'opérateur.
Les API d'Android 9 sont compatibles avec les scénarios d'appel simultanés entre les applications tierces et les appels d'opérateur. Cela permet, par exemple, de recevoir un appel entrant d'un tiers tout en étant en communication avec un opérateur. Le framework est responsable de la mise en attente de l'appel d'opérateur lorsque l'utilisateur participe à l'appel tiers.
Dans Android 9, les applications d'appel tierces sont encouragées à implémenter la classe ConnectionService autogérée. Pour en savoir plus sur la création d'une
application d'appel à l'aide de cette classe, consultez Créer une application d'appel à l'aide de la bibliothèque Core-Telecom.
La classe autogérée ConnectionService permet également aux développeurs de choisir d'enregistrer les appels de leur application dans le journal d'appels du système (voir EXTRA_LOG_SELF_MANAGED_CALLS). Conformément aux exigences du document de définition de compatibilité Android (CDD) (section 7.4.1.2), vous devez vous assurer que votre application de numérotation ou application Téléphone affiche ces entrées du journal d'appels et indique le nom de l'application d'appel tierce à l'origine de l'appel (pour obtenir un exemple de la manière dont l'application Téléphone AOSP répond à cette exigence, consultez Entrées du journal d'appels provenant d'applications d'appel tierces).
Les applications sont responsables de la définition de CAPABILITY_SUPPORT_HOLD et
CAPABILITY_HOLD sur les connexions de leurs applications. Toutefois, il est possible qu'une application ne puisse pas mettre un appel en attente dans certaines circonstances. Le framework comprend des dispositions pour résoudre ces types de cas.
Scénarios
Vous devez modifier votre application de numérotation pour gérer les scénarios suivants.
Gérer les appels entrants qui interrompent un appel en cours
Dans un scénario où un appel tiers est en cours (par exemple, dans un appel SuperCaller) qui ne prend pas en charge la mise en attente et où l'utilisateur reçoit un appel mobile (par exemple, à l'aide de son opérateur FooCom), votre application Téléphone doit indiquer à l'utilisateur que répondre à l'appel du réseau mobile mettra fin à l'appel tiers en cours.
Cette expérience utilisateur est importante, car une application d'appel tierce peut avoir un appel en cours qui ne peut pas être mis en attente par le framework. Répondre à un nouvel appel mobile entraîne la déconnexion de l'appel tiers en cours.
Consultez l'interface utilisateur de la figure pour obtenir un exemple :
Figure 1. Appel entrant interrompant un appel tiers en cours.
Votre application de numérotation peut vérifier si un appel entrant entraîne la déconnexion d'un autre appel en vérifiant les extras de l'appel. Assurez-vous que
EXTRA_ANSWERING_DROPS_FG_CALL est défini sur TRUE, et
EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME est défini sur le nom de l'application
dont l'appel est déconnecté lorsque vous répondez à l'appel mobile entrant.
Entrées du journal d'appels provenant d'applications d'appel tierces
Les développeurs d'applications d'appel tierces peuvent choisir d'enregistrer les appels de leur application
dans le journal d'appels du système (voir EXTRA_LOG_SELF_MANAGED_CALLS). Cela
signifie qu'il est possible d'avoir des entrées dans le journal d'appels qui ne concernent pas les appels du
réseau mobile.
Lorsque l'application de numérotation AOSP affiche des entrées du journal d'appels liées à une application d'appel tierce, le nom de l'application dans laquelle l'appel a eu lieu s'affiche dans le journal d'appels, comme illustré dans la figure :
Figure 2. Entrée de journal d'appels avec le nom de l'application d'appel tierce dans l'application Téléphone.
Pour déterminer le nom d'une application associée à une entrée de journal d'appels, utilisez les
PHONE_ACCOUNT_COMPONENT_NAME et PHONE_ACCOUNT_ID colonnes dans le
fournisseur du journal d'appels pour créer une instance de PhoneAccountHandle, qui
identifie la source d'une entrée de journal d'appels. Interrogez TelecomManager pour obtenir
les détails de la classe PhoneAccount. Pour déterminer si une entrée de journal d'appels provient
d'une application d'appel tierce, vérifiez les fonctionnalités de PhoneAccount capabilities pour voir
si CAPABILITY_SELF_MANAGED est défini.
La méthode getLabel de l'élément PhoneAccount renvoyé renvoie le nom de
l'application associée à une entrée de journal d'appels provenant de l'application d'appel tierce.
Contrôles d'intégration du journal d'appels VoIP
À partir d'Android 17 (niveau d'API 37), les applications d'appel VoIP tierces qui s'intègrent à Core-Telecom et CallsManager peuvent écrire leur historique d'appels directement dans le journal d'appels du système Android natif (CallLog.Calls).
Pour garantir la confidentialité des utilisateurs et l'hygiène des données dans l'écosystème Android,
tous les appareils Android 17 (niveau d'API 37) et versions ultérieures qui déclarent le flag de fonctionnalité de télécommunications (android.software.telecom) et qui disposent du rôle android.app.role.DIALER
doivent prendre en charge les contrôles d'intégration du journal d'appels VoIP par application, conformément au document de définition de compatibilité Android (CDD).
Exigences d'implémentation de l'appareil
Les appareils doivent fournir un écran Paramètres accessible à l'utilisateur (généralement situé sous Paramètres > Comptes d'appel > Journaux d'appels intégrés) qui permet aux utilisateurs d'afficher et d'activer/désactiver l'intégration du journal d'appels pour les applications VoIP tierces individuelles.
Pour répondre à cette exigence, vous devez intégrer la valeur par défaut de la plate-forme :
- Intégration des paramètres de la plate-forme : assurez-vous que votre appareil inclut
com.android.phone.settings.PhoneAccountSettingsActivityfourni par la plate-forme Android prête à l'emploi (com.android.phone). - Exigence de résolution d'intent : votre appareil doit résoudre l'intent
TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION(android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) sur l'écran de gestion de la plate-forme.
Lorsqu'une application, une invite système ou un lien profond appelle les éléments suivants, l'intent doit lancer PhoneAccountSettingsActivity et ne doit pas générer d'exception ActivityNotFoundException :
Intent intent = new Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION);
context.startActivity(intent);
Validation
Pour tester si votre appareil est compatible avec les applications d'appel tierces, utilisez l'application de test Telecomm, qui implémente la classe ConnectionService autogérée. L'application
se trouve dans
/packages/services/Telecomm/testapps/.
Créez l'application de test à partir de la racine de votre dépôt source Android à l'aide de :
mmma packages/services/Telecomm/testapps/Installez l'APK de compilation à l'aide de
adb install -g -r <apk path>. Une icône d'exemple autogéré est ensuite ajoutée à votre lanceur.Appuyez sur l'icône pour ouvrir l'application de test.
Gérer les appels entrants qui interrompent un appel en cours
Procédez comme suit pour vérifier qu'un appel entrant interrompt un appel tiers en cours.
Figure 3. Application de test avec des exemples d'implémentations de la classe ConnectionService.
- Effacez l'option Holdable (Mise en attente possible).
- Appuyez sur OUTGOING (Sortant) pour démarrer un nouvel exemple d'appel sortant.
- Appuyez sur le bouton ACTIVE (Actif) pour activer l'appel.
- Appelez le numéro de téléphone de l'appareil testé avec un autre téléphone. Cela appelle le scénario dans lequel le nom d'une application est fourni à votre application de numérotation, dont l'appel sera déconnecté.
- Lorsque vous avez terminé, appuyez sur le bouton DISCONNECT (Déconnecter) dans l'application de test.
Entrées du journal d'appels provenant d'applications d'appel tierces
Une fois les étapes ci-dessus effectuées, l'application de test doit avoir enregistré un appel dans le journal d'appels du système. Pour vérifier que l'appareil enregistre les appels provenant d'applications d'appel tierces, ouvrez votre application de numérotation et vérifiez que l'appel apparaît dans le journal d'appels du système.
Contrôles d'intégration du journal d'appels VoIP
Pour vérifier la conformité avec l'exigence d'intent d'intégration du journal d'appels VoIP sur Android 17 et versions ultérieures, exécutez le test CtsTelecomTestCases de la suite de tests de compatibilité (CTS). Ce test vérifie, au-delà des limites des packages, que l'envoi de TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION (android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) est résolu sur l'appareil en un gestionnaire d'activités exporté valide (vérification resolveActivity).