How to get phone number from an incoming call?

后端 未结 7 1444
太阳男子
太阳男子 2020-11-27 13:45

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

相关标签:
7条回答
  • 2020-11-27 14:06

    This will definitely 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);
    
    0 讨论(0)
  • 2020-11-27 14:10

    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?

    0 讨论(0)
  • 2020-11-27 14:16

    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");
                    }   
                }   
            }
        }
    
    0 讨论(0)
  • 2020-11-27 14:24

    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);
        }
    }
    
    0 讨论(0)
  • 2020-11-27 14:27

    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.

    0 讨论(0)
  • 2020-11-27 14:30

    you can find solution here

    Bundle bundle = intent.getExtras();
    String phoneNr= bundle.getString("incoming_number");
    
    0 讨论(0)
提交回复
热议问题