46 votes

Récupérer le numéro de téléphone d'un appel entrant dans Android

J'aimerais récupérer le numéro de téléphone de l'appel entrant et faire quelque chose avec, comme le fait la procédure suivante dans http://blog.whitepages.com/2009/02/27/caller-id-by-whitepages-a-new-Android-app-that-puts-telemarketers-on-alert/

Pouvez-vous m'aider car je ne trouve aucune information à ce sujet. Par où commencer et comment obtenir le numéro de téléphone ?


Ok, actuellement mon code ressemble à ce qui suit. Lorsque je place l'appel, le CustomBroadcastReceiver l'attrape et le message du journal est imprimé. Je peux récupérer le numéro de téléphone à partir du bundle. Mais je n'arrive pas à faire fonctionner le CustomPhoneStateListener. Comme vous pouvez le voir, j'ai enregistré mon écouteur CustomPhoneState au récepteur, mais le message de journal n'est jamais imprimé par la classe CustomPhoneStateListener. Qu'est-ce que j'ai manqué ici ? Mon raisonnement est-il correct ?


<receiver android:name=".CustomBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" /> 
        </intent-filter>
</receiver>

</application>
<uses-sdk android:minSdkVersion="5" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

public class CustomPhoneStateListener extends PhoneStateListener {

private static final String TAG = "CustomPhoneStateListener";

public void onCallStateChange(int state, String incomingNumber){

    Log.v(TAG, "WE ARE INSIDE!!!!!!!!!!!");
    Log.v(TAG, incomingNumber);

    switch(state){
        case TelephonyManager.CALL_STATE_RINGING:
            Log.d(TAG, "RINGING");
            break;
    }   
}

public class CustomBroadcastReceiver extends BroadcastReceiver {

private static final String TAG = "CustomBroadcastReceiver";

@Override
public void onReceive(Context context, Intent intent) {
    Log.v(TAG, "WE ARE INSIDE!!!!!!!!!!!");
    TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener();

    telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);

    Bundle bundle = intent.getExtras();
    String phoneNr= bundle.getString("incoming_number");
    Log.v(TAG, "phoneNr: "+phoneNr);

}

0 votes

Je ne reçois pas incoming_number pour un appel entrant Dispositif POCO f1 pi et le récepteur est appelé deux fois

25voto

John Feminella Points 116878

Utilice PhoneStateListener . Il dispose d'un onCallStateChanged l'un des arguments fournis est un fichier String contenant le numéro de téléphone entrant.

0 votes

Pourriez-vous fournir un exemple de mise en œuvre ?

0 votes

Ma réponse à cette question peut vous aider lien

1 votes

Je n'ai rien dans le paramètre incomingNumber, que devrait-il être ?

8voto

Nirav Ranpara Points 5859

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 téléphonique entrant en tant que incomingNumber et également lorsque l'appel est FINISHED - 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;
            }

        }
    }
}

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);

5voto

mikeplate Points 709

Votre méthode surchargée dans CustomPhoneStateListener devrait s'appeler onCallStateChanged() (et non onCallStateChange() ).

Cela aurait été repéré par le compilateur Java si vous aviez eu l'option @Override comme pour l'annotation onReceive() .

0 votes

Vous êtes l'homme ! Merci ! J'ai une autre question à poser, à savoir comment ajouter des éléments à la vue des appels entrants ?

1 votes

Je ne suis pas sûr des détails de celle-ci. Votre faute de frappe était plus facile :) Cependant, je pense que ce que vous recherchez est un Toast. Mais il n'apparaîtra probablement pas sur l'écran des appels entrants, à moins que votre code soit un service (et non une activité). Mais comme je l'ai dit, je ne suis pas encore allé aussi loin dans le développement d'Android. developer.Android.com/guide/topics/ui/notifiers/toasts.html

4voto

Les réponses ci-dessus sont maintenant dépassées. Elles sont valables pour Android 7 et inférieur.

Pour Android 9 et les versions ultérieures, vous devez ajouter une autre permission dans la section Androidmanifest.xml avec l'autorisation

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

sans le numéro de téléphone sera nul. Pour Android 8, je ne suis pas sûr.

PhoneStateReciever.java

    package com.incomingcalls;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    import android.widget.Toast;

    public class PhoneStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        try {
            System.out.println("Receiver start");
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
            String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            Log.e("Incoming Number", "Number is ," + incomingNumber);
            Log.e("State", "State is ," + state);
            if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
                Toast.makeText(context,"Incoming Call State",Toast.LENGTH_SHORT).show();
                Toast.makeText(context,"Ringing State Number is -"+incomingNumber,Toast.LENGTH_SHORT).show();

            }
            if ((state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK))){
                Toast.makeText(context,"Call Received State",Toast.LENGTH_SHORT).show();
            }
            if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
                Toast.makeText(context,"Call Idle State",Toast.LENGTH_SHORT).show();
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

    }
}

AnroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.incomingcalls">
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".PhoneStateReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

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