web-dev-qa-db-fra.com

Répondre à un appel entrant à l'aide d'Android.telecom et d'InCallService

Depuis l'API 21, Google a ajouté des fonctionnalités à Android.telecom en général, en particulier en implémentant plus de membres de TelecomManager et en ajoutant InCallService . Ce dernier est censé permettre aux applications tierces non système de fournir et de remplacer les fonctionnalités de l'écran d'appel de l'application système - la fenêtre qui apparaît et permet d'agir sur EXTRA_STATE_OFFHOOK ou EXTRA_STATE_RINGING émissions (c'est-à-dire appels téléphoniques entrants et sortants).

Actuellement, seul cet écran a le contrôle total de la sonnerie et des appels actifs et des rappels système associés avec des informations à granularité fine, au moyen de la racine restreinte MODIFY_PHONE_STATE autorisation et beaucoup de code AOSP sécurisé, même pas accessible par réflexion. C'est notamment l'un des morceaux de code les plus modifiés dans les différentes versions de ROM ROM, avec le lanceur, les contacts et la caméra).

Tout cela est très joli mais ...

Comment développez-vous réellement un InCallService tiers?

À savoir:

  1. Comment êtes-vous informé et obtenez-vous des instances d'appels GSM?
  2. Comment répond-on à ces appels
  3. Quel est le cycle de vie des rappels sur cette classe
  4. Google fournit-il un didacticiel réel pour cela que je n'ai pas trouvé

Je ne demanderai pas de réponses à toutes ces questions à la fois, mais toute réponse est probablement associée aux autres questions. C'est large mais intrinsèquement cela doit être: il n'y a pas d'exemple sur le web que je suis tombé sur autre que le code AOSP, et ce code est basé sur l'hypothèse de privilèges root, ce qui le rend inutilisable pour le développement d'applications tierces fins.

16
leRobot

Comment êtes-vous informé et obtenez-vous des instances d'appels GSM?

Tout d'abord, l'utilisateur devra sélectionner votre application comme application par défaut pour le téléphone. Reportez-vous à Remplacement de l'application de téléphone par défaut sur Android 6 et 7 avec InCallService pour un moyen de le faire.

Vous devez également définir une implémentation InCallService à laquelle le système se liera et vous informera de l'appel:

<service
    Android:name=".CallService"
    Android:permission="Android.permission.BIND_INCALL_SERVICE">
    <meta-data
        Android:name="Android.telecom.IN_CALL_SERVICE_UI"
        Android:value="true" />
    <intent-filter>
        <action Android:name="Android.telecom.InCallService" />
    </intent-filter>
</service>

Là, vous devez gérer au moins onCallAdded (configurer des écouteurs sur Call, démarrer votre interface utilisateur - activité - pour l'appel) et onCallRemoved (supprimer les écouteurs).

Comment répond-on à ces appels

Si l'utilisateur veut répondre à l'appel, vous devez invoquer la méthode Call#answer(int) avec VideoProfile.STATE_AUDIO_ONLY par exemple.

Quel est le cycle de vie des rappels sur cette classe

Consultez Call.Callback pour les événements qui peuvent se produire avec un seul appel.

Google fournit-il un didacticiel réel pour cela que je n'ai pas trouvé

Je ne connais pas Google, mais vous pouvez consulter mon exemple simplifié https://github.com/arekolek/simple-phone

6
arekolek

Suivez les conseils du deuxième commentaire de Remplacement dans l'application d'appel . De plus, vous avez besoin d'un service qui implémente l'interface InCallService. Lorsqu'un appel arrive, la méthode onCallAdded (Call call) sera appelée, vous donnant une référence à l'objet d'appel.

<service
  Android:name=".InCallServiceImplementation"
  Android:enabled="true"
  Android:exported="true"
  Android:permission="Android.permission.BIND_INCALL_SERVICE">

  <meta-data
    Android:name="Android.telecom.IN_CALL_SERVICE_UI"
    Android:value="true" />

  <intent-filter>
    <action Android:name="Android.telecom.InCallService" />
  </intent-filter>
</service>

Une fois que vous avez l'objet d'appel, répondre est aussi simple que call.answer (). Je suggère que lorsque vous obtenez le travail ci-dessus, exécutez quelques appels de test pour savoir quand les différents rappels sont appelés.

En ce qui concerne les didacticiels, je n'en ai trouvé aucun lorsque j'examinais cela, mais c'était il y a plus d'un an ...

J'espère que cela t'aides!

5
user5806139

Je suppose que Google a dû lire cette question, car apparemment sur Android 8, une nouvelle autorisation enfin permet de répondre aux appels via une autorisation de développement tiers .

Android.permission. ANSWER_PHONE_CALLS (...) permet aux applications de répondre aux appels téléphoniques entrants par programme

Pas encore de détails, car la documentation de l'API 26 n'a pas encore été publiée. Je m'assurerai de mettre à jour cette réponse quand ils le feront.

EDIT: l'utilisateur arekolek a fourni une réponse qui fonctionne parfaitement sur la version API originale de cette question (au moment de la demande, l'API était de 23, même si le question mentionne l'API 21), il obtient donc la coche pour la bonne réponse. Reportez-vous à sa réponse si vous souhaitez implémenter un écran d'appel qui cible un SDK minimum de 23. Notez que vous pourriez avoir besoin de code dépendant de l'API ou de modifications de bibliothèque compat si vous voulez qu'il fonctionne sur des API plus récentes qui déconseillent (ou restreignent) l'utilisation de la fourni un exemple de code. le dépôt github fonctionne comme je l'avais initialement prévu.

3
leRobot