web-dev-qa-db-fra.com

Remplacement dans l'application d'appel

Contexte

J'essaie de développer une application très simple dans l'appel pour remplacer la version stock. Fondamentalement, je veux juste répondre aux appels entrants et présenter à l'utilisateur une interface utilisateur personnalisée très simple. Il n’ya pas besoin d’appels sortants ni d’éléments fantaisistes.

En recherchant sur le Web, j'ai trouvé package Android.telecom.incallservice (disponible dans l'API 23). Ce service est mis en œuvre par toute application souhaitant fournir l'interface utilisateur permettant de gérer les appels téléphoniques.

Cela semble prometteur mais j'ai du mal à le faire fonctionner. J'ai créé un service simple étendant InCallService et l'ai déclaré dans mon manifeste, comme décrit dans la documentation. Cependant, je m'attendrais à pouvoir modifier l'application de téléphone par défaut dans les paramètres, mais je ne trouve que l'application de téléphone standard.

Code

Ceci est la déclaration du manifeste de la documentation. J'ai remplacé BIND_IN_CALL_SERVICE par BIND_INCALL_SERVICE car je suppose que c'est une faute de frappe.

<service Android:name="your.package.YourInCallServiceImplementation" 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>

Des questions

  1. Est-il même possible pour une application tierce de remplacer l'application par défaut dans l'application d'appel?

  2. Existe-t-il des exemples d'implémentation utilisant cette API que je pourrais utiliser comme référence? J'ai trouvé l'implémentation google , mais il s'agit d'une application système qui utilise certaines autorisations qui ne sont pas disponibles pour d'autres applications (ex: Android.permission.MODIFY_PHONE_STATE).

  3. Ai-je raison de supposer qu'après avoir fourni un enregistrement correct du manifeste InCallService et une implémentation de stub, je peux m'attendre à trouver mon application sous Default Apps -> Phone? Dois-je déclarer autre chose?

Merci.

24
user5806139

Selon les docs et au fur et à mesure que vous vous commentez, vous devez ajouter ceci dans votre manifest :

<service Android:name="your.package.YourInCallServiceImplementation"
          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>

Android:name doit être remplacé par la classe qui implémente ce service.


 <activity Android:name="your.package.YourDialerActivity">
      <intent-filter>
           <action Android:name="Android.intent.action.DIAL" />
           <category Android:name="Android.intent.category.DEFAULT" />
      </intent-filter>
 </activity>

Android:name doit être remplacé par la classe qui implémente l'activité principale pour votre propre implémentation de numéroteur.

Vous trouverez ici plus d’informations à ce sujet: https://developer.Android.com/guide/topics/connectivity/telecom/selfManaged

Et voici un exemple de projet que vous pouvez utiliser comme guide: https://github.com/arekolek/simple-phone

Et ceci: https://stackoverflow.com/a/49835987/1916449

0
  1. Est-il même possible pour une application tierce de remplacer l'application par défaut dans l'application d'appel?

Oui, à partir de l'API 23, c'est possible.

  1. Existe-t-il des exemples d'implémentation utilisant cette API que je pourrais utiliser comme référence? J'ai trouvé l'implémentation google , mais il s'agit d'une application système qui utilise certaines autorisations qui ne sont pas disponibles pour d'autres applications (ex: Android.permission.MODIFY_PHONE_STATE).

Le seul que je connaisse, est l'exemple que j'ai créé https://github.com/arekolek/simple-phone et qui a déjà été mentionné dans l'autre réponse.

  1. Ai-je raison de supposer qu'après avoir fourni un enregistrement correct du manifeste InCallService et une implémentation de stub, je peux m'attendre à trouver mon application sous Default Apps -> Phone? Dois-je déclarer autre chose?

En fait non.

Comme mentionné dans une autre réponse sur le sujet , vous n'avez pas besoin de InCallService du tout pour figurer sur cette liste.

Cependant, vous devez enregistrer une activité avec deux filtres d'intention, l'un avec un schéma tel Uri et l'autre avec un schéma vide (un seul d'entre eux ne suffit pas):

<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>

Il est mentionné de manière vague dans la documentation , et indiqué explicitement dans le code AOSP .

Cela suffit pour apparaître sur cette liste. Alors seulement, pour fournir l’UI pour l’appel , aurez-vous réellement besoin de la variable InCallService.

0
arekolek