web-dev-qa-db-fra.com

Android O: limitation de diffusion PHONE_STATE

J'ai essayé de faire quelque chose de similaire à l'application TrueCaller, où mon application est censée afficher un écran après qu'un appel a été raccroché. Cela a été réalisé en enregistrant la diffusion implicite Android.intent.action.PHONE_STATE dans le fichier manifest

Mais cela ne fonctionne pas si je modifie l'application pour cibler Android O, en raison de la limitation de diffusion de Android O , et j'essaie de trouver une solution alternative à ce cas d'utilisation. 

Solutions alternatives suggérées dans les documents Android: Job scheduler ou enregistrez une service avec context.

Planificateur de travaux: En raison des optimisations de Job scheduler, il y aura un certain délai pour recevoir le rappel. Cela affectera donc l'expérience de l'utilisateur si l'écran de notre application s'affiche quelques minutes après l'appel téléphonique et que l'interrogation vérifie la présence de nouveaux journaux d'appels toutes les quelques secondes, ce qui entraîne un problème d'épuisement de la batterie.

Enregistrer le service avec le contexte en Java: je souhaite que le comportement fonctionne même si l'application n'est pas active ou active. Cela ne fonctionnera pas si le système supprime la Service.

Enregistrer un service d'avant-plan: Cela nécessite d'afficher à tout moment une notification à l'utilisateur, ce qui constituerait un courrier indésirable. Exécuter un service 24 heures sur 24, 7 jours sur 7 consomme beaucoup de ressources, ce qui va à l'encontre de l'objectif de limitation des émissions. 

Veuillez suggérer une autre solution pour que l'expérience utilisateur reste la même. 

Merci d'avance 

34
Praveen Kumar C

Comme il n’existe AUCUNE solution appropriée pour lire PHONE_STATE à partir d’Android O. La meilleure alternative que nous puissions choisir est de déclencher une tâche sur la nouvelle entrée du journal des appels du fournisseur de contenu . De ce fait, le comportement de l'affichage d'un écran (avec quelques secondes de retard) après la fin de l'appel est maintenu.

REMARQUE: l’inconvénient est que nous ne pouvons pas obtenir l’état de l’appel téléphonique (Sonnerie ou décroché, etc.). Le rappel ne sera reçu qu'après l'ajout du nouveau journal des appels à la base de données système. 

2
Praveen Kumar C

Finalement, l'action a été ajoutée à la liste "Exceptions de diffusion implicites" afin que vous puissiez ajouter ACTION_PHONE_STATE_CHANGED à votre manifeste et cela fonctionnera:

https://developer.Android.com/guide/components/broadcast-exceptions

ACTION_CARRIER_CONFIG_CHANGED, TelephonyIntents.ACTION _ * _ SUBSCRIPTION_CHANGED, "TelephonyIntents.SECRET_CODE_ACTION", ACTION_PHONE_STATE_CHANGED, ACTION_PHONE_ACCOUNT_REGISTRÉ, ACTION_PHONE_ACCOUNT_UNREGISTRÉ 

OEM les applications de téléphonie peuvent avoir besoin de recevoir ces émissions.

4
Gaket

Vous n'avez qu'une solution, utilisez un service de premier plan et enregistrez le récepteur de radiodiffusion dans le service.

3
greywolf82

Il semble y avoir une exception broadcast pour ACTION_NEW_OUTGOING_CALL mais pas une pour un appel entrant (ou lorsque l'appel est terminé). Cela ressemble à un bogue pour en avoir un pour le courrier sortant, mais pas un pour le courrier entrant. Il y a eu un rapport de bogue filed dans le suivi des problèmes de Google. Espérons que leur réponse clarifiera ce que nous devrions faire.

Je mettrai à jour cette réponse si/lorsque le suivi des bogues est mis à jour.

0
Jon

Comme mentionné ici: https://issuetracker.google.com/37273064#comment4 , ACTION_PHONE_STATE_CHANGED (Android.intent.action.PHONE_STATE) sera ajouté à la liste blanche pour la version Android O. Bien qu'ils puissent être remplacés par un mécanisme différent dans une prochaine version.

0
shmakova

Pour moi et mon application de production, la solution serait d'éviter de cibler les API 25 et supérieures, jusqu'à ce qu'une meilleure solution de contournement/API apparaisse.

Si votre application cible le niveau 24 ou inférieur, vous n'êtes pas concerné par le nouveau - Limites de diffusion implicites et votre application peut toujours écouter les émissions PHONE_STATE même lorsque votre application n'est pas en cours d'exécution.

Une application ciblant des API inférieures peut toujours être téléchargée et installée normalement sur les nouvelles versions d'Android. La seule raison de mettre à jour votre valeur sdkTarget est si votre application nécessite l'utilisation de nouvelles API.

0
marmor