web-dev-qa-db-fra.com

Détection des appels sortants et des événements de raccrochage dans android

J'ai une exigence selon laquelle je souhaite détecter deux types d'événements liés aux appels dans Android

  1. Chaque fois qu'un appel sortant est effectué, ma demande doit apprendre à le connaître avec le numéro appelé
  2. Lorsque l'appel est raccroché (en raison de la réussite/de l'échec), mon application doit en savoir plus sur la raison du raccrochage

Est-ce possible sur Android?

32
user669231

Vous devez créer un BroadcastReceiver:

public class CallReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                TelephonyManager.EXTRA_STATE_RINGING)) {

                // Phone number 
                String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

                // Ringing state
                // This code will execute when the phone has an incoming call
        } else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                TelephonyManager.EXTRA_STATE_IDLE)
                || intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
                        TelephonyManager.EXTRA_STATE_OFFHOOK)) {

            // This code will execute when the call is answered or disconnected
        }

    }
}

Vous devez enregistrer votre application pour écouter ces intentions dans le manifeste:

<receiver Android:name=".CallReciever" >
            <intent-filter>
                <action Android:name="Android.intent.action.PHONE_STATE" />
            </intent-filter>
 </receiver>
29
vendor

Il existe une solution plus simple utilisant uniquement TelephonyManager et PhoneStateListener. Vous n’avez même pas besoin d’enregistrer un BroadcastReceiver.

public class MyPhoneStateListener extends PhoneStateListener {

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        switch (state) {
            //Hangup
            case TelephonyManager.CALL_STATE_IDLE:
                break;
            //Outgoing
            case TelephonyManager.CALL_STATE_OFFHOOK:
                break;
            //Incoming
            case TelephonyManager.CALL_STATE_RINGING:
                break;
        }
    }
}

Et pour l'enregistrer:

public static void registerListener(Context context) {
    ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).listen(new MyPhoneStateListener(),
            PhoneStateListener.LISTEN_CALL_STATE);
}
7

Vous devez créer un récepteur pour les actions d'intention suivantes:

  1. Appel sortant - ACTION_NEW_OUTGOING_CALL
  2. Raccrochage d'appel - ACTION_PHONE_STATE_CHANGED
4
Nic Strong