2011-04-27 55 views
6

我们想拦截广播接收者的呼出挂断状态。我们正在收听android.intent.action.PHONE_STATE,并通知IDLE状态,即通话结束时。在挂断时拦截呼出

不幸的是,我们没有从通话记录内容提供商处获得被叫号码。它总是返回最后的呼叫。有趣的是,来电确实在意图上发送了一个号码,但没有任何传出呼叫。

如果我们使用android.intent.action.NEW_OUTGOING_CALL,电话号码正在通过呼叫开始时的意图,但由于我们希望等待呼叫完成,因此这个阶段对于我们做任何处理都为时尚早。

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

登录猫

*当呼叫开始,NEW_OUTGOING_CALL广播*

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 

结果数据

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

通话记录最后一次通话

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

*接下来,PHONE_STATE是广播,在演员没有号码*

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

没有结果数据

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

当通话结束后,在演员无号

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

通话记录中最后一项之前被叫号码

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 

回答

0

您可以像下面的呼出号码:

串号= intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);

我想你可以使用公共静态变量存储数字,然后引用它。

2

针对IntentFilter使用具有intent android.intent.action.NEW_OUTGOING_CALL字符串参数的广播侦听器,并且不要忘记将AndroidMenifest的权限授予PROCESS_OUTGOING_CALLS。这将工作。

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