160 votes

Comment détecter les appels entrants, dans un appareil Android ?

J'essaie de faire une application comme, quand un appel arrive sur le téléphone, je veux détecter le numéro. Voici ce que j'ai essayé, mais ça ne détecte pas les appels entrants.

Je veux diriger mon MainActivity en arrière-plan, comment puis-je faire ?

J'avais donné la permission en manifest archivo.

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

Y a-t-il autre chose que je dois fournir 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;
           }
       }
   }
}

1voto

FarshidABZ Points 1121

Vous avez besoin d'un BroadcastReceiver pour ACTION_PHONE_STATE_CHANGED Cette fonction appellera votre correspondant chaque fois que l'état du téléphone changera : inactif, sonnerie, décrochage. Ainsi, à partir de la valeur précédente et de la nouvelle valeur, vous pouvez détecter s'il s'agit d'un appel entrant ou sortant.

L'autorisation requise serait :

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

Mais si vous souhaitez également recevoir le numéro 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 :

val receiver: BroadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Log.d(TAG, "onReceive")
    }
}

override fun onResume() {
    val filter = IntentFilter()
    filter.addAction("android.intent.action.PHONE_STATE")
    registerReceiver(receiver, filter)
    super.onResume()
}

override fun onPause() {
    unregisterReceiver(receiver)
    super.onPause()
}

et dans la classe de récepteur, nous pouvons obtenir l'état actuel en lisant l'intention comme ceci :

intent.extras["state"]

le résultat des extras pourrait être :

SONNERIE -> Si votre téléphone sonne

OFFHOOK -> Si vous êtes en train de parler avec quelqu'un (entrant ou sortant) appel)

IDLE -> si l'appel est terminé (appel entrant ou sortant)

Avec la diffusion de PHONE_STATE, il n'est pas nécessaire d'utiliser l'autorisation PROCESS_OUTGOING_CALLS ou l'action NEW_OUTGOING_CALL, désormais obsolète.

0voto

Reportez-vous à la réponse de Gabe Sechan . Comme mentionné, dans le cas d'un appel sortant, nous avons le changement d'état suivant : IDLE -> OFFHOOK -> IDLE. Dans la réponse originale de Gabe, savedNumber n'est activé que si l'état du téléphone devient SONNERIE, ce qui ne sera pas le cas pour un appel sortant. Un petit correctif pour activer également savedNumber lorsque l'état du téléphone devient OFFHOOK :

case TelephonyManager.CALL_STATE_OFFHOOK:
    if(lastState != TelephonyManager.CALL_STATE_RINGING){
        //IDLE to OFFHOOK for example.
        isIncoming = false;
        callStartTime = new Date();
        savedNumber = number;
        onOutgoingCallStarted(context, savedNumber, callStartTime);
    }
...

Cette correction permet de transmettre le numéro composé aux méthodes d'appel sortant de la même manière que le numéro entrant est transmis aux méthodes d'appel entrant ou d'appel manqué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X