Interceptar llamadas entrantes en android

Uno de los usos de un smartphone, aunque parezca increible, es recibir llamadas. En algunas ocasiones esas llamadas no se pueden atender ya que estamos realizando alguna tarea que requiere que estemos enfocados. Aun así no podemos eliminar todas las llamadas, ya que podriamos recibir una llamada urgente.

Para evitar estas llamadas he creado una pequeña aplicación que intercepta las llamadas entrantes y mira si la llamada la realiza una persona que esté marcada como favorita en nuestros contactos.

 

Hacer esta aplicación es muy sencillo ya que únicamente se tendrá que modificar el fichero manifest de android y crear una clase que se encargará de gestionar las llamadas entrantes.

Crearemos la clase MyCallReceiver que extiende de BroadcastReceiver. En el método onReceive utilizando las propiedades de la clase TelephonyManager se podrá saber que evento ha producido la llamada a nuestra clase.

De la clase Intent, se puede obtener el número de teléfono que está realizando la llamada.

Para recuperar la información de la lista de contactos, se trata desde la clase ContentResolver.

Una vez se tiene el número de teléfono se consulta la lista de contactos y se recupera la propiedad STARRED, que es la que marca si el contacto pertenece a los favoritos.


package es.example.incomingcall;

import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.media.AudioManager;
import android.net.Uri;
import android.provider.ContactsContract.PhoneLookup;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

/**
 * Created by dcrespi on 19/09/2015.
 */
public class MyCallReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {

ContentResolver resolver = context.getContentResolver();
 AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);

if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)){
 String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
 Uri.encode(incomingNumber));

Cursor cursor = resolver.query(lookupUri, new String[]{PhoneLookup.STARRED}, null, null, null);

String starred = "NO";
 if (cursor == null) {

} else {
 if (cursor.moveToFirst()) {
 // Si encuentra, cambia el valor de retorno.
 int isStarred = cursor.getInt(cursor
 .getColumnIndex(PhoneLookup.STARRED));

if (isStarred==0){
 Log.i("MyCallReceiver", "VIBRATE mode");
 am.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
 }
 else {
 Log.i("MyCallReceiver", "NORMAL mode");
 am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
 }

starred = isStarred==1?"FAVORITO":"NO";
 }

if (cursor != null && !cursor.isClosed()) {
 cursor.close();
 }
 }

Toast.makeText(context, "Call from: "+incomingNumber + " " + starred, Toast.LENGTH_LONG).show();
 } else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE) || intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
 Toast.makeText(context, "Detected call hangup event",Toast.LENGTH_LONG).show();
 }
 }
}

Luego se deben hacer dos modificaciones en el fichero AndroidManifest.xml.

Primero se darán dos permisos, el de leer el estado del teléfono:

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

y el de leer contactos:

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

Y por último añadir el tag receiver en el tag application.

 <application
 android:allowBackup="true"
 android:icon="@mipmap/ic_launcher"
 android:label="@string/app_name"
 android:theme="@style/AppTheme" >
 <activity
 android:name=".MainActivity"
 android:label="@string/app_name" >
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />

 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>
 <receiver android:name=".MyCallReceiver">
 <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>
 </application></pre>
<pre>

Se puede descargar el código desde mi repositorio de github.

Espero que os sirva y os sea útil.

img_ccTodo el material publicado en este Blog, salvo las obras que no pertenecen a su autor, se difunden bajo licencia CC by-SA de Creative Commons, por lo que eres libre de copiar, distribuir y comunicar este contenido de forma publica, hacer un uso comercial del mismo, etc., siempre que lo hagas bajo las condiciones de la licencia indicada, y que reconozcas a su autor e indiques un enlace al contenido original o en su defecto a la pagina principal de este blog.

Anuncios
    • Felix A.
    • 25/03/17

    hola como pudiera mostrar la notificacion en ves de con un toast con un alert dialg

  1. 28/10/15

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: