2011-03-31 17 views
25

Ho un requisito in cui voglio rilevare due tipi di eventi connessi a richieste in AndroidRilevamento chiamata in uscita e chiamare evento hangup in Android

  1. Ogni volta che una chiamata in uscita è fatta, la mia domanda dovrebbe arrivare a conoscere questo insieme con il numero chiamato
  2. Quando la chiamata è appeso fino (a causa di successo/insuccesso), la mia domanda dovrebbe conoscere questo insieme con la ragione di hangup

questo è possibile in Android?

risposta

24

È necessario creare un BroadcastReceiver:

public class CallReciever extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
       TelephonyManager.EXTRA_STATE_RINGING)) { 

       // Phone number 
       String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 

       // Ringing state 
       // This code will execute when the phone has an incoming call 
     } else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
       TelephonyManager.EXTRA_STATE_IDLE) 
       || intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
         TelephonyManager.EXTRA_STATE_OFFHOOK)) { 

      // This code will execute when the call is answered or disconnected 
     } 

    } 
} 

Dovresti registrarti pplicazione per ascoltare questi intenti nel manifesto:

<receiver android:name=".CallReciever" > 
      <intent-filter> 
       <action android:name="android.intent.action.PHONE_STATE" /> 
      </intent-filter> 
</receiver> 
+0

Grazie per il codice di esempio C'è un modo per catturare la chiamata in uscita e molto simile al modo in cui viene acquisita la chiamata in entrata? – user669231

+0

@ user669231 Sì, è necessario modificare il controllo nello stato if. Puoi vedere questo argomento: http://stackoverflow.com/questions/2668445/detect-outgoing-calls-and-problem-with-a-real-device – vendor

+1

Funziona come un fascino. Inoltre devi dichiarare la seguente autorizzazione nel file manifest.xml: altrimenti non funzionerà. Sede API di classe TelephonyManager: http://developer.android.com/reference/android/telephony/TelephonyManager.html – qupera

4

È necessario creare un ricevitore per le seguenti azioni intenti:

  1. uscita Chiamata - ACTION_NEW_OUTGOING_CALL
  2. chiamata hangup - ACTION_PHONE_STATE_CHANGED
+0

Mi potete dare un esempio per questo, mio ​​bisogno di chiamata in uscita –

+0

La soluzione sopra descritta ha funzionato perfettamente per me.but il ricevitore sta ricevendo lo stesso stato per più volte. Come possiamo risolvere questo ?. Esiste comunque la possibilità di rilevare l'ID di ricezione o altri modi? –

8

c'è una soluzione più semplice utilizzando solo TelephonyManager e PhoneStateListener.You Non tiratevi nemmeno bisogno di registrare un BroadcastReceiver.

public class MyPhoneStateListener extends PhoneStateListener { 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     switch (state) { 
      //Hangup 
      case TelephonyManager.CALL_STATE_IDLE: 
       break; 
      //Outgoing 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       break; 
      //Incoming 
      case TelephonyManager.CALL_STATE_RINGING: 
       break; 
     } 
    } 
} 

E per registrarlo:

public static void registerListener(Context context) { 
    ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).listen(new MyPhoneStateListener(), 
      PhoneStateListener.LISTEN_CALL_STATE); 
} 
+0

questo non funziona per le chiamate in uscita. – ralphgabb

Problemi correlati