Get phone number of present incoming and outgoing call

后端 未结 2 1303
长发绾君心
长发绾君心 2020-12-19 18:05

I am making an app in which I have to retrieve the phone number and I am able to retrieve it but my problem is that I am getting phone number of las

相关标签:
2条回答
  • 2020-12-19 18:07

    As suggested by Krutix, the call LOG, is a LOG of finished phone calls which is written to by the dialer app after a call is finished. As such you will not find which number is currently dialing in the content provider.

    Here is an implementation which will allow you to retrieve the phone number if it is an incoming phone call as incomingNumber 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-12-19 18:12

    please modify your query with

     cur = context.getContentResolver().query(Calls.CONTENT_URI,
                            projection, null, null, Calls.DATE +" desc");
      cur.moveToFirst();
      s = cur.getString(numberColumn);
    

    it will give last call's phone number and there is no need requery so many times

    0 讨论(0)
提交回复
热议问题