2012-03-05 21 views
5

Estoy intentando identificar y transferirme a una actividad después de que se inicia una llamada saliente. Usé ACTION_NEW_OUTGOING_CALL en el filtro de intención. Sin embargo, cómo csn identifico que la llamada es extrovertida. Hice esto para una llamada entrante (como se ve a continuación), pero ¿qué puedo usar en lugar de EXTRA_STATE_RINGING?Cómo recibe una llamada saliente en el receptor de difusión

public class OutgoingBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
     if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) 
     { 
      Intent i = new Intent(context, OutgoingCallScreenDisplay.class); 
      i.putExtras(intent); 
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(i); 
     } 
    } 
} 

enter image description here

Respuesta

4
public class OutgoingBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { 
      // If it is to call (outgoing) 
      Intent i = new Intent(context, OutgoingCallScreenDisplay.class); 
      i.putExtras(intent); 
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(i); 
     } 
    } 
} 

ACTION_NEW_OUTGOING_CALL es una reclamación constante en la clase Intent, no en TelephonyManager. Cuando aparece una llamada saliente, el sistema emite un intento con esta constante. Si realmente se desea capturar una llamada saliente mediante el uso de TelephonyManager continuación, hacer esto:

TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE); 
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); 
PhoneStateListener listener = new PhoneStateListener() { 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     // TODO Auto-generated method stub 

     super.onCallStateChanged(state, incomingNumber); 
     switch(state) { 
      case TelephonyManager.CALL_STATE_IDLE: 
       break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       if(incomingNumber==null) { 
        //outgoing call 
       } else { 
        //incoming call 
       } 
       break; 
      case TelephonyManager.CALL_STATE_RINGING: 
       if(incomingNumber==null) { 
        //outgoing call 
       } else { 
        //incoming call 
       } 
       break; 
     } 
    } 
}; 
+0

Gracias funcionó bien! Pero ahora estoy recibiendo la pantalla predeterminada del sistema (ver la captura de pantalla anterior) y solo después de obtener mi actividad personalizada. ¿Cómo puedo ocultar/anular la pantalla con mi actividad? – user1163234

+0

@ si desea reemplazar esta pantalla, solo es posible utilizando el archivo AIDL de telefonía .. –

+0

OK ¡Tanques otra vez! ¿Algún buen ejemplo? – user1163234

3

Detectar saliente evento llamada telefónica

1. Crear OutgoingCallBroadcastReceiver

public class OutgoingCallReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(OutgoingCallReceiver.class.getSimpleName(), intent.toString()); 
     Toast.makeText(context, "Outgoing call catched!", Toast.LENGTH_LONG).show(); 
     //TODO: Handle outgoing call event here 
    } 
} 

2. Registre OutgoingCallBroadcastReceiver en AndroidManifest.xml

<receiver android:name=".OutgoingCallReceiver" > 
    <intent-filter> 
     <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
    </intent-filter> 
</receiver> 

3. Agregar el permiso por AndroidManifest.xml

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> 
+0

¿para qué es el permiso? Logré recuperar la llamada saliente sin ella. –

+0

, consulte el paso 3. – Satya

+0

@Satya No funciona para mí. Probado en un ASUS Zenfone 2 con Android 6.0.1 –

Cuestiones relacionadas