web-dev-qa-db-fra.com

Comment obtenir le numéro de téléphone d'un appel entrant?

Comment obtenir le numéro de téléphone en cas d'appel entrant sur Android?

18
Saqib Abbasi

Faire un Broadcast receiver Dire ServiceReceiver assigner son action dans Manifest.

<receiver Android:name=".ServiceReceiver" >
    <intent-filter>
        <action Android:name="Android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

Ajoutez un PhoneStateListener à votre TelephonyManager, PhoneStateListener ayant la priorité onCallStateChanged() avec le paramètre Numéro entrant. C'est tout.

ServiceReceiver.Java

public class ServiceReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, Intent intent) {
        TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        telephony.listen(new PhoneStateListener(){
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                super.onCallStateChanged(state, incomingNumber);
                System.out.println("incomingNumber : "+incomingNumber);
            }
        },PhoneStateListener.LISTEN_CALL_STATE);
    }
}
33
Azhar Shaikh

La solution suivante m'a aidé à récupérer les numéros de téléphone entrants et sortants.

Éléments à inclure dans le manifeste :

1) Autorisation:

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

2) Un récepteur de diffusion:

<receiver Android:name=".AnswerCallBroadcastReceiver">
        <intent-filter> 
            <action Android:name="Android.intent.action.PHONE_STATE" />
            <action Android:name="Android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
</receiver>

Éléments à inclure dans la classe BroadcastReceiver :

    public class AnswerCallBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context arg0, Intent arg1) {

            if(arg1.getAction().equals("Android.intent.action.PHONE_STATE")){

                String state = arg1.getStringExtra(TelephonyManager.EXTRA_STATE);

                if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
                    Log.d(TAG, "Inside Extra state off hook");
                    String number = arg1.getStringExtra(TelephonyManager.EXTRA_PHONE_NUMBER);
                    Log.e(TAG, "outgoing number : " + number);              
                }       

                else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)){   
                    Log.e(TAG, "Inside EXTRA_STATE_RINGING");
                    String number = arg1.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                    Log.e(TAG, "incoming number : " + number);
                }
                else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
                    Log.d(TAG, "Inside EXTRA_STATE_IDLE");
                }   
            }   
        }
    }
4
Basher51

Cela vous aidera certainement.

Voici une implémentation, qui vous permettra de récupérer le numéro de téléphone s'il s'agit d'un appel entrant en tant que numéro entrant, et également lorsque l'appel est TERMINÉ - notez le code Handler ().

private class PhoneCallListener extends PhoneStateListener {

private boolean isPhoneCalling = false;

@Override
public void onCallStateChanged(int state, String incomingNumber) {

    if (TelephonyManager.CALL_STATE_RINGING == state) {
        // phone ringing
        Log.i(LOG_TAG, "RINGING, number: " + incomingNumber);
    }

    if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
        // active
        Log.i(LOG_TAG, "OFFHOOK");

        isPhoneCalling = true;
    }

    if (TelephonyManager.CALL_STATE_IDLE == state) {
        // run when class initial and phone call ended, need detect flag
        // from CALL_STATE_OFFHOOK
        Log.i(LOG_TAG, "IDLE number");

        if (isPhoneCalling) {

            Handler handler = new Handler();

            //Put in delay because call log is not updated immediately when state changed
            // The dialler takes a little bit of time to write to it 500ms seems to be enough
            handler.postDelayed(new Runnable() {

                @Override
                public void run() {
                    // get start of cursor
                      Log.i("CallLogDetailsActivity", "Getting Log activity...");
                        String[] projection = new String[]{Calls.NUMBER};
                        Cursor cur = getContentResolver().query(Calls.CONTENT_URI, projection, null, null, Calls.DATE +" desc");
                        cur.moveToFirst();
                        String lastCallnumber = cur.getString(0);
                }
            },500);

            isPhoneCalling = false;
        }

    }
} 

Et puis ajoutez et initialisez l'écouteur dans votre code onCreate ou onStartCommand:

  PhoneCallListener phoneListener = new PhoneCallListener();
TelephonyManager telephonyManager = (TelephonyManager) this
        .getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(phoneListener,
        PhoneStateListener.LISTEN_CALL_STATE);
2
Chintan Khetiya

vous pouvez trouver une solution ici

Bundle bundle = intent.getExtras();
String phoneNr= bundle.getString("incoming_number");
1
Trần Sĩ Long

En utilisant la réponse acceptée, vous enregistrerez un nouvel auditeur à chaque changement de l'état de l'appel. Il en résultera plusieurs appels onCallStateChanged pour le même événement.

1
user1770426
1