¿Qué debo elegir entre BroadcastReceiver y PhoneStateListener cuando necesito detectar un evento de llamada en android?

He leído Detectando la llamada saliente y el evento de interrumpir llamadas en android

Quiero hacer una aplicación para detectar evento de llamada en segundo plano como un servicio, creo que debo elegir BroadcastReceiver, porque la aplicación mantendrá la detección de llamada, incluso si salgo de la aplicación. Creo que la única manera de detener la detección de llamadas es desinstalar la aplicación cuando utilizo BroadcastReceiver.

Si elijo PhoneStateListener, creo que la aplicación dejará de detectar la llamada si salgo de la aplicación.

¿Derecha?

¡Gracias!

One Solution collect form web for “¿Qué debo elegir entre BroadcastReceiver y PhoneStateListener cuando necesito detectar un evento de llamada en android?”

En mi opinión la mejor manera de ir es utilizando la solución más simple. Dicho esto, PhoneStateListener hará exactamente lo que desea – Detectar evento de llamada en el fondo:

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

Para acceder a los estados, debe declarar los permisos en el archivo de manifiesto :

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

Es bastante sorprendente lo que PhoneStateListener.LISTEN_CALL_STATE hacer, prácticamente lo que es mucho más fácil de lo que pensaba a primera vista, ya que le proporciona todo lo que necesita para supervisar los eventos de llamadas.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.