Outgoing Call Pickup

We want to intercept the hang state of an outgoing call in a broadcast receiver. We listen to android.intent.action.PHONE_STATE and receive a notification in IDLE state, that is, when the call ends.

Unfortunately, we are not getting the called number from the call log content provider. It always returns the last call. Interestingly, an incoming call does send the number in intent, but does not give anything for an outgoing call.

If we use android.intent.action.NEW_OUTGOING_CALL , the phone number comes when the call starts, but this stage is too early for us to do any processing, since we want to wait for the call to complete.

 public class InterceptOutgoingCall extends BroadcastReceiver { Boolean isOutGoingCall = true; private static final String LOG_TAG = "InterceptOutgoingCall"; @Override public void onReceive(Context context, Intent intent) { //1. Logging the intent params String state = null; StringBuffer buf = new StringBuffer(); if (intent.getAction() != null) buf.append("Intent action: " + intent.getAction()); if (intent.getCategories() != null) { Set<String> categories = intent.getCategories(); if (categories != null) { Iterator<String> it = categories.iterator(); buf.append("; categories: "); int ctr = 0; for (; it.hasNext();) { String category = (String) it.next(); if (ctr != 0) buf.append("/"); buf.append(category); ++ctr; } } } if (intent.getData() != null) { buf.append("; intent data: " + intent.getData().toString()); } Bundle extras = intent.getExtras(); if (extras != null) { buf.append("; extras: "); int ctr = 0; Set keys = extras.keySet(); for (Iterator it = keys.iterator(); it.hasNext();) { String key = (String) it.next(); Object value = extras.get(key); if (ctr != 0) buf.append("/"); String strvalue = value == null ? "null" : value.toString(); if (key.equals("state")) state = strvalue; buf.append(key + "=" + strvalue); ++ctr; } Log.i(LOG_TAG, buf.toString()); if ("IDLE".equals(state)) { Log.i(LOG_TAG, "Number of the other party: " + getLastCallLogEntry(context)); } } String outgoingCall = CallLog.Calls.getLastOutgoingCall(context); Log.i(LOG_TAG, "Last call:" + outgoingCall); } private String getLastCallLogEntry(Context context) { String[] projection = new String[] { BaseColumns._ID, CallLog.Calls.NUMBER, CallLog.Calls.TYPE }; ContentResolver resolver = context.getContentResolver(); Cursor cur = resolver.query(CallLog.Calls.CONTENT_URI, projection, null, null, CallLog.Calls.DEFAULT_SORT_ORDER); int numberColumn = cur.getColumnIndex(CallLog.Calls.NUMBER); int typeColumn = cur.getColumnIndex(CallLog.Calls.TYPE); if (!cur.moveToNext()) { cur.close(); return ""; } String number = cur.getString(numberColumn); String type = cur.getString(typeColumn); String dir = null; try { int dircode = Integer.parseInt(type); switch (dircode) { case CallLog.Calls.OUTGOING_TYPE: dir = "OUTGOING"; break; case CallLog.Calls.INCOMING_TYPE: dir = "INCOMING"; break; case CallLog.Calls.MISSED_TYPE: dir = "MISSED"; break; } } catch (NumberFormatException ex) { } if (dir == null) dir = "Unknown, code: " + type; cur.close(); return dir + "," + number; } 

Log code

* When you start a call, the message NEW_OUTGOING_CALL is displayed *

 04-27 13:07:16.756: INFO/InterceptOutgoingCall(775): Intent action: android.intent.action.NEW_OUTGOING_CALL; extras: android.phone.extra.ALREADY_CALLED=false/android.intent.extra.PHONE_NUMBER=999222/android.phone.extra.ORIGINAL_URI=tel:999-222 

Result Data

 04-27 13:07:16.876: INFO/InterceptOutgoingCall(775): Result Data:999222 

Last call calls

 04-27 13:07:17.156: INFO/InterceptOutgoingCall(775): Last call:809090 

* Next, PHONE_STATE is broadcast, there is no number in the advanced settings *

 04-27 13:07:19.495: INFO/InterceptOutgoingCall(775): Intent action: android.intent.action.PHONE_STATE; extras: state=OFFHOOK 

No result data

 04-27 13:07:19.636: INFO/InterceptOutgoingCall(775): No result data 

When the call is completed, the number in the advanced settings

 04-27 13:08:09.306: INFO/InterceptOutgoingCall(775): Intent action: android.intent.action.PHONE_STATE; extras: state=IDLE 

The last call log entry is the called number

 04-27 13:08:09.627: INFO/InterceptOutgoingCall(775): Number of the other party: OUTGOING,809090 04-27 13:08:09.675: INFO/InterceptOutgoingCall(775): No result data 04-27 13:08:10.336: INFO/InterceptOutgoingCall(775): Last call:809090 
+6
source share
2 answers

Use a broadcast listener with the string parameter and introid.action.NEW_OUTGOING_CALL for IntentFilter and remember to give permission in AndroidMenifest to PROCESS_OUTGOING_CALLS. It will work.

 public static final String outgoing = "android.intent.action.NEW_OUTGOING_CALL" ; IntentFilter intentFilter = new IntentFilter(outgoing); BroadcastReceiver OutGoingCallReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String outgoingno = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); Toast.makeText(context, "outgoingnum =" + outgoingno,Toast.LENGTH_LONG).show(); } }; registerReceiver(brForOutgoingCall, intentFilter); 
+2
source

You can specify the number of the outgoing call, as shown below:

String number = aim.getStringExtra (Intent.EXTRA_PHONE_NUMBER);

I think you can save this number using a public static variable and then refer to it.

0
source

Source: https://habr.com/ru/post/886774/


All Articles