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