2011-04-27 2 views
6

Nous souhaitons intercepter l'état de raccrochage des appels sortants dans un récepteur de diffusion. Nous écoutons android.intent.action.PHONE_STATE et nous sommes informés sur l'état IDLE, c'est-à-dire quand l'appel se termine.Interception des appels sortants lors du raccrochage

Malheureusement, nous n'obtenons pas le numéro appelé du fournisseur de contenu du journal des appels. Il renvoie toujours le dernier appel. Fait intéressant, l'appel entrant envoie un numéro dans l'intention mais rien pour l'appel sortant. Si nous utilisons android.intent.action.NEW_OUTGOING_CALL, le numéro de téléphone vient à l'esprit lorsque l'appel commence, mais cette étape est trop tôt pour que nous puissions effectuer un traitement car nous voulons attendre la fin de l'appel.

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

Connexion chat

* Lorsque l'appel démarre, NEW_OUTGOING_CALL est diffusé *

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 

données de résultat

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

journaux d'appels dernier appel

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

* Ensuite, PHONE_STATE est diffusé, aucun numéro extras *

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

Aucune donnée de résultat

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

Lorsque l'appel est terminé, aucun numéro extras

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

journal des appels dernière entrée est le numéro appelé précédemment

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 

Répondre

0

Vous pouvez le numéro d'appel sortant comme ci-dessous:

Numéro String = intent.getStringExtra (Intent.EXTRA_PHONE_NUMBER);

Je pense que vous pouvez stocker le nombre en utilisant une variable statique publique, puis le renvoyer.

2

Utilisez un programme d'écoute de diffusion avec un paramètre de chaîne de caractères android.intent.action.NEW_OUTGOING_CALL intentionnel pour IntentFilter et n'oubliez pas d'autoriser AndroidMenifest à PROCESS_OUTGOING_CALLS. Cela fonctionnera.

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