2014-04-14 5 views
8

Ho letto Detecting outgoing call and call hangup event in androidCosa devo scegliere tra BroadcastReceiver e PhoneStateListener quando devo rilevare l'evento di chiamata in Android?

voglio fare un app per rilevare evento chiamata in background come servizio, penso che dovrei scegliere BroadcastReceiver, in quanto l'applicazione manterrà rilevare chiamata anche se esco l'applicazione. Penso che l'unico modo per smettere di rilevare la chiamata sia disinstallare l'app quando utilizzo BroadcastReceiver.

Se scelgo PhoneStateListener, penso che l'app smetterà di rilevare la chiamata se esco dall'app.

Giusto?

Grazie!

risposta

8

A mio parere, il modo migliore è utilizzare la soluzione più semplice. Detto questo, PhoneStateListener farà esattamente quello che vuoi - rilevare evento chiamata in background:

public class IncomingCallReciever extends BroadcastReceiver { 

    private Context mContext; 
    private Intent mIntent; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     mContext = context; 
     mIntent = intent; 
     TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
     int events = PhoneStateListener.LISTEN_CALL_STATE; 
     tm.listen(phoneStateListener, events); 
    } 

    private final PhoneStateListener phoneStateListener = new PhoneStateListener() { 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
      String callState = "UNKNOWN"; 
      switch (state) { 
      case TelephonyManager.CALL_STATE_IDLE: 
       callState = "IDLE"; 
       break; 
      case TelephonyManager.CALL_STATE_RINGING: 
       // -- check international call or not. 
       if (incomingNumber.startsWith("00")) { 
        Toast.makeText(mContext,"International Call- " + incomingNumber,Toast.LENGTH_LONG).show(); 
        callState = "International - Ringing (" + incomingNumber+ ")"; 
       } else { 
        Toast.makeText(mContext, "Local Call - " + incomingNumber, Toast.LENGTH_LONG).show(); 
        callState = "Local - Ringing (" + incomingNumber + ")"; 
       } 
       break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       String dialingNumber = mIntent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
       if (dialingNumber.startsWith("00")) { 
        Toast.makeText(mContext,"International - " + dialingNumber,Toast.LENGTH_LONG).show(); 
        callState = "International - Dialing (" + dialingNumber+ ")"; 
       } else { 
        Toast.makeText(mContext, "Local Call - " + dialingNumber,Toast.LENGTH_LONG).show(); 
        callState = "Local - Dialing (" + dialingNumber + ")"; 
       } 
       break; 
      } 
      Log.i(">>>Broadcast", "onCallStateChanged " + callState); 
      super.onCallStateChanged(state, incomingNumber); 
     } 
    }; 

} 

Per accedere gli stati, è necessario dichiarare i permessi in manifest file:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

E 'abbastanza incredibile quello che PhoneStateListener.LISTEN_CALL_STATE lo rende, in pratica, molto più semplice di quanto si pensi a prima vista, perché fornisce tutto ciò che è necessario per monitorare gli eventi di chiamata.

Problemi correlati