2011-04-27 7 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

इरादाफिल्टर के लिए एक इरादा android.intent.action.NEW_OUTGOING_CALL स्ट्रिंग पैरामीटर के साथ एक प्रसारण श्रोता का उपयोग करें और AndroidCenifest में 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);