2011-04-27 13 views
6

Queremos interceptar el estado de desconexión de llamada saliente en un receptor de difusión. Estamos escuchando android.intent.action.PHONE_STATE y recibimos una notificación en el estado IDLE, es decir, cuando finaliza la llamada.Interceptar llamadas salientes al colgar

Desafortunadamente, no obtenemos el número llamado del proveedor de contenido del registro de llamadas. Siempre devuelve la última llamada. Curiosamente, la llamada entrante envía un número en el intento pero nada para la llamada saliente.

Si usamos android.intent.action.NEW_OUTGOING_CALL, el número de teléfono viene con la intención cuando se inicia la llamada, pero esta etapa es demasiado temprana para que podamos hacer cualquier procesamiento, ya que queremos esperar a que se complete la llamada.

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

gato Entrar

* Cuando se inicia la llamada, se NEW_OUTGOING_CALL emisión *

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 

datos de Resultados

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

registros de llamadas última llamada

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

* A continuación, PHONE_STATE es la difusión, ningún número en extras *

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

No hay datos de Resultados

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

cuando la llamada se ha completado, ningún número en extras

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

Call última entrada es el número anteriormente llamado

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 

Respuesta

0

Usted puede el número de llamadas salientes, como a continuación:

número de secuencia = intent.getStringExtra (Intent.EXTRA_PHONE_NUMBER);

Creo que puede almacenar el número usando la variable pública estática y luego referirlo.

2

Utilice un detector de difusión con un parametro de cadena android.intent.action.NEW_OUTGOING_CALL para IntentFilter y no olvide dar permiso en AndroidMenifest a PROCESS_OUTGOING_CALLS. Esto funcionará

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