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
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.
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.
Vous n'avez qu'une solution, utilisez un service de premier plan et enregistrez le récepteur de radiodiffusion dans le service.
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.
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.
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.