J'essaie de créer une application comme, lorsqu'un appel arrive sur le téléphone, je veux détecter le numéro. Voici ce que j'ai essayé, mais cela ne détecte pas les appels entrants.
Je veux exécuter mon MainActivity
en arrière-plan, comment puis-je faire cela?
J'avais donné l'autorisation dans le manifest
dossier.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Dois-je fournir autre chose dans le manifeste?
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_layout);
}
public class myPhoneStateChangeListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if (state == TelephonyManager.CALL_STATE_RINGING) {
String phoneNumber = incomingNumber;
}
}
}
}
Réponses:
Voici ce que j'utilise pour faire ceci:
Manifeste:
Mon détecteur d'appels réutilisable de base
Ensuite, pour l'utiliser, dérivez simplement une classe et implémentez quelques fonctions simples, quels que soient les types d'appels qui vous intéressent:
De plus, vous pouvez voir un article que j'ai fait sur les raisons pour lesquelles le code est comme il est sur mon blog . Lien principal: https://gist.github.com/ftvs/e61ccb039f511eb288ee
EDIT: mis à jour pour un code plus simple, car j'ai retravaillé la classe pour mon propre usage
la source
lastState
ne doit pas être initialisé àCALL_STATE_IDLE
. Je manque quelques appels lorsque mon application est tuée alors que l'état actuel estRINGING
. Parce que quand il redevientIDLE
à la fin de l'appel, la variable statique est réinitialiséeCALL_STATE_IDLE
et elle déborde sans rien faire. Nous perdons donc la référence àlastState
.enregistrer
et se désinscrire
la source
Avec Android P - Api Level 28: vous devez obtenir l'autorisation READ_CALL_LOG
Accès restreint aux journaux d'appels
Android P déplace les
CALL_LOG
,READ_CALL_LOG
,WRITE_CALL_LOG
etPROCESS_OUTGOING_CALLS
autorisations duPHONE
groupe d'autorisation au nouveauCALL_LOG
groupe d'autorisation. Ce groupe offre aux utilisateurs un meilleur contrôle et une meilleure visibilité des applications qui ont besoin d'accéder à des informations sensibles sur les appels téléphoniques, telles que la lecture des enregistrements d'appels téléphoniques et l'identification des numéros de téléphone.Pour lire les numéros de l'action d'intention PHONE_STATE, vous avez besoin à la fois de l'
READ_CALL_LOG
autorisation et de l'READ_PHONE_STATE
autorisation . Pour lire les numéros à partir deonCallStateChanged()
, vous n'avez plus besoin que de l'READ_CALL_LOG
autorisation. Vous n'avez plus besoin de l'READ_PHONE_STATE
autorisation.la source
READ_CALL_LOG
à seAndroidManifest.xml
concentrer sur l' ajout d' une demande d'autorisation enMainActivity
.MISE À JOUR: Le code vraiment génial publié par Gabe Sechan ne fonctionne plus à moins que vous ne demandiez explicitement à l'utilisateur d'accorder les autorisations nécessaires. Voici un code que vous pouvez placer dans votre activité principale pour demander ces autorisations:
AUSSI: Comme quelqu'un l'a mentionné dans un commentaire sous la publication de Gabe , vous devez ajouter un petit extrait de code,,
android:enabled="true
au récepteur afin de détecter les appels entrants lorsque l'application n'est pas actuellement en cours d'exécution au premier plan:la source
cela peut vous aider et ajouter une autorisation requise
la source
Juste pour mettre à jour la réponse de Gabe Sechan. Si votre manifeste demande des autorisations pour READ_CALL_LOG et READ_PHONE_STATE, onReceive appellera TWICE . Dont l'un contient EXTRA_INCOMING_NUMBER et l'autre pas. Vous devez tester qui l'a et cela peut se produire dans n'importe quel ordre.
https://developer.android.com/reference/android/telephony/TelephonyManager.html#ACTION_PHONE_STATE_CHANGED
la source
Voici une méthode simple qui peut éviter l'utilisation
PhonestateListener
et d'autres complications.Nous recevons donc ici les 3 événements d'Android tels que
RINGING
,OFFHOOK
etIDLE
. Et pour obtenir le nous devons définir nos propres états comme tous les états possibles d' un appel,RINGING
,OFFHOOK
,IDLE
,FIRST_CALL_RINGING
,SECOND_CALL_RINGING
. Il peut gérer tous les états d'un appel téléphonique.Veuillez penser d'une manière que nous recevons des événements d'Android et nous définirons nos états sur appel. Voir le code.
la source
@Gabe Sechan, merci pour votre code. Cela fonctionne bien sauf le
onOutgoingCallEnded()
. Il n'est jamais exécuté. Les téléphones de test sont Samsung S5 et Trendy. Il y a 2 bugs je pense.1: il manque une paire de crochets.
2:
lastState
n'est pas mis à jour par lestate
s'il est à la fin de la fonction. Il doit être remplacé à la première ligne de cette fonction parSupplémentaire j'ai mis
lastState
etsavedNumber
partagé les préférences comme vous l'avez suggéré.Je viens de le tester avec les modifications ci-dessus. Bug corrigé au moins sur mes téléphones.
la source
Veuillez utiliser le code ci-dessous. Cela vous aidera à obtenir le numéro entrant avec d'autres détails de l'appel.
activity_main.xml
MainActivity.java
et dans votre demande manifeste pour les autorisations suivantes:
la source
Vous avez besoin d'un BroadcastReceiver pour
ACTION_PHONE_STATE_CHANGED
Cela appellera votre reçu chaque fois que l'état du téléphone change de veille, de sonnerie, de décroché, donc de la valeur précédente et de la nouvelle valeur, vous pouvez détecter s'il s'agit d'un appel entrant / sortant.L'autorisation requise serait:
Mais si vous souhaitez également recevoir le EXTRA_INCOMING_NUMBER dans cette diffusion, vous aurez besoin d'une autre autorisation: "android.permission.READ_CALL_LOG"
Et le code quelque chose comme ça:
et dans la classe de récepteur, nous pouvons obtenir l'état actuel en lisant l'intention comme ceci:
le résultat des extras pourrait être:
Avec la diffusion PHONE_STATE, nous n'avons pas besoin d'utiliser l'autorisation PROCESS_OUTGOING_CALLS ou l'action NEW_OUTGOING_CALL obsolète.
la source