How to get phone number from an incoming call?

How do I get the phone number when there is an incoming call in Android?

  • Connect to password protected wifi network using adb shell
  • ListPreference dependency
  • How to programatically animate an ImageView
  • How to configure proguard to ONLY remove android logging calls
  • How to test Bluetooth Based Application on Androidx86 on top of VirtualBox with inbuilt laptop bluetooth
  • Send private message to my friend(s) using my android application
  • Related posts:

    How to remove all the polylines from a map
    Android - Which one to use Active Android or Realm
    ViewSwitcher and layout height in Android
    Why is onKey() called twice?
    Setting the size of a DialogFragment
    OutOfMemoryError at AbstractStringBuilder enlargeBuffer
  • Android listSelector still partly visible when the item is scrolled out
  • Galaxy S5 Lollipop - not all breakpoints stop execution under Android Studio debugger
  • Phonegap camera android kills cordova
  • Can I hang up a call programmatically in android?
  • How to disable the home key
  • Android comprehensive failproof music service across multiple activites
  • 6 Solutions collect form web for “How to get phone number from an incoming call?”

    Make a Broadcast receiver say ServiceReceiver assign its action in Manifest.

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

    Add a PhoneStateListener to your TelephonyManager, PhoneStateListener having override onCallStateChanged() with Incoming number parameter. Thats it.

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

    Following solution helped me retrieve the incoming and outgoing phone numbers.

    Things to include in manifest :

    1) Permission :

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

    2) A broadcast receiver:

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

    Things to include in BroadcastReceiver class :

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

    Please refer to this question: Retrieve incoming call’s phone number in Android

    And also have a look at this answer too: how do I get the phone number from incoming call?

    you can find solution here

    Bundle bundle = intent.getExtras();
    String phoneNr= bundle.getString("incoming_number");
    

    This will defiantly help you .

    Here is an implementation which will allow you to retrieve the phone number if it is an incoming phone call as incoming Number and also when the call is FINISHED – note the Handler() code.

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

    And then add and initialise the listener in your onCreate or onStartCommand code:

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

    By using the accepted answer, you will register a new listener with every change of the call state. It will result in multiple onCallStateChanged calls for same event.

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.