Interceptar llamadas con BroadCast Receiver
Broadcast es una clase de android que se ejecuta en segundo plano siempre, esta clase lee todo lo entrante y saliente del teléfono (interceptar llamadas), es decir no solo son llamadas, también lee los mensajes, conexión a internet y un largo etc.
una de las aplicaciones más comunes es como la siguiente:
Call out Express o bloqueador de llamadas express es un app para bloquear esas llamadas molestas pero tenemos la idea de que sea más que un bloqueador de llamadas (si pueden descargarlo seria de ayuda), pero en otro post abordaremos más.
Permisos en manifest
los permisos que debemos usar para interceptar llamadas son siguientes:
<uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
y cuando creen la actividad de broadcast receiver les debe aparecer algo así dentro de las etiquetas application:
<receiver android:name=".InterceptorCall" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> </intent-filter> </receiver>
Creando la clase broadcast
vamos a ir a nuestro proyecto y vamos a tocar dar click derecho y vamos a colocarlo hasta donde nos muestra la siguiente imagen (new > other > Broadcast Receiver) :
Interceptar una llamada y saber que número nos marca
para esto necesitamos centrarse en el método onReceive, vamos a evaluar que nuestro intent no este vacío, cada vez que entra al método del broadcast android nos envía un intent con información detallada.
Bundle extras = intent.getExtras(); if(extras != null){}
y vamos a evaluar que el estado sea el correcto, en este caso quiero saber si están llamado
if ( extras.getString("state").equals(TelephonyManager.EXTRA_STATE_RINGING)) { //codigo }
en la documentación de android TelephonyManager tiene 3 estados para las llamadas:
- CALL_STATE_IDLE : estado inactivo
- CALL_STATE_OFFHOOK: contesto llamada
- CALL_STATE_RINGING: llamando
Aquí podemos echar andar la imaginación, y para terminar cómo obtener el número entrante de la llamada se hace de la siguiente manera:
String phoneNumber = extras.getString("incoming_number");
de esta manera podemos interceptar llamadas y hacer alguna acción en nuestra app ya sea en llamadas entrantes, llamadas contestadas, o llamadas terminadas.
Cesar como estas esta funcionnde broadcast funciona en android 9 ?
German
Hola germam, si aun funciona en android 9 , solo que partir de Android 9 (nivel API 28), la NETWORK_STATE_CHANGED_ACTION no recibe información sobre la ubicación del usuario o los datos de identificación personal.