在挂断时拦截传出呼叫

时间:2011-04-27 07:51:08

标签: android

我们希望拦截广播接收器中的呼出挂断状态。我们正在收听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

2 个答案:

答案 0 :(得分:2)

为IntentFilter使用具有意图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);

答案 1 :(得分:0)

您可以拨打以下电话号码:

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

我认为您可以使用公共静态变量存储该数字,然后引用它。