Tutorial de bloqueo automático de llamadas con telefonía Android

Tutorial de bloqueo automático de llamadas con telefonía Android

Este tutorial lo guiará sobre cómo bloquear todas las llamadas entrantes no deseadas a su teléfono Android mediante el uso de las API de telefonía de Android. Aprenderá a crear una aplicación de Android simple llamada «Auto Call Blocker», que almacenará los números de teléfono no deseados (spam) en la base de datos SQLite de su teléfono y desconectará automáticamente la llamada que proviene de cualquiera de dichos números de teléfono.


Tutorial

Requisitos

El código fuente adjunto es una aplicación simple de Android llamada «Auto Call Blocker». Entonces, los casos de uso de las aplicaciones son:

  1. Agregar número de teléfono a la lista de bloqueo.
  2. Ver la lista de números de teléfono no deseados almacenados en la base de datos.
  3. Elimine cualquier número de teléfono almacenado.
  4. Bloquea la llamada entrante no deseada.

Pantallas de aplicación

Hay 2 pantallas en esta aplicación como se describe a continuación:

MainActivity : pantalla de inicio de la aplicación, que muestra la lista de todos los números de teléfono no deseados agregados por el usuario.

actividad_principal.xml

<LinearLayout xmlns_android="http://schemas.android.com/apk/res/android"
    xmlns_herramientas="http://esquemas.android.com/herramientas"
    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android: orientación = "vertical"
    android_paddingBottom="@dimen/actividad_margen_vertical"
    android_paddingLeft="@dimen/actividad_margen_horizontal"
    android_paddingRight="@dimen/actividad_margen_horizontal"
    android_paddingTop="@dimen/actividad_margen_vertical" >

    <Vista de texto
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_gravity="superior|centro_horizontal"
        android_layout_marginBottom="20dip"
        android_text="Bloqueador automático de llamadas"
        android_textSize="25sp" />

    <TableLayout
        android_layout_width="fill_parent"
        android_layout_height="wrap_content"
        android: orientación = "vertical"
        android_relleno="10dip" >

        <ListView
            android_id="@+id/vista de lista"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content" />
    </TableLayout>

    <Botón
        android_id="@+id/añadir_lista_negra_btn"
        android_layout_width="match_parent"
        android_layout_height="wrap_content"
        android_layout_gravity="superior"
        android_text="Añadir número de teléfono al bloqueo automático" />

</LinearLayout>

 

list_item.xml

<LinearLayout xmlns_android="http://schemas.android.com/apk/res/android"
    xmlns_herramientas="http://esquemas.android.com/herramientas"
    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android:orientación="horizontal">

   <FilaTabla
            android_layout_width="fill_parent"
            androide_fondo="#6f6c67"
            android_layout_gravity="centro"
            android_layout_height="wrap_content" >

            <Vista de texto
                android_layout_width="fill_parent"
                android_layout_height="fill_parent"
                android_layout_marginTop="10dip"
                android_text="Número de serie"
                android_id="@+id/serial_tv"
                androide_textColor="#980000"
                androide_fondo="#e7e5d9"
                android_layout_margin="1dip"
                android_relleno="3dip"
                android_gravedad="centro"
                Android: diseño_peso = "2"
                android_textSize="15sp" />

            <Vista de texto
                android_layout_width="fill_parent"
                android_layout_height="fill_parent"
                android_layout_marginTop="10dip"
                android_text="Número de teléfono"
                android_id="@+id/phone_number_tv"
                androide_textColor="#980000"
                androide_fondo="#e7e5d9"
                android_layout_margin="1dip"
                android_relleno="3dip"
                android_gravedad="centro"
                Android: diseño_peso = "1"
                android_textSize="15sp" />
        </TableRow>

</LinearLayout>

Producción:

principal

 

AddToBlocklistActivity : para agregar un número de teléfono a la lista de bloqueo almacenada en la base de datos.

actividad_principal.xml

<LinearLayout xmlns_android="http://schemas.android.com/apk/res/android"
    xmlns_herramientas="http://esquemas.android.com/herramientas"
    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android: orientación = "vertical"
    android_paddingBottom="@dimen/actividad_margen_vertical"
    android_paddingLeft="@dimen/actividad_margen_horizontal"
    android_paddingRight="@dimen/actividad_margen_horizontal"
    android_paddingTop="@dimen/actividad_margen_vertical"
    >

    <Vista de texto
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_gravity="superior|centro_horizontal"
        android_text="Añadir número de teléfono"
        android_textSize="22sp" />

    <TableLayout
        android_layout_width="fill_parent"
        android_layout_height="wrap_content"
        android_layout_gravity="izquierda"
        android: orientación = "vertical"
        android_relleno="10dip" >

        <FilaTabla
            android_layout_width="match_parent"
            android_layout_height="wrap_content" >

            <Vista de texto
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_layout_marginTop="10dip"
                android_text="Código de país"
                android_textSize="15sp" />

            <Editar Texto
                android_layout_width="fill_parent"
                android_layout_height="wrap_content"
                android_layout_marginLeft="0dip"
                Android: diseño_peso = "1"
                android_id="@+id/código_país_et"
                Android: tipo de entrada = "número" />
        </TableRow>

        <FilaTabla
            android_layout_width="match_parent"
            android_layout_height="wrap_content" >

            <Vista de texto
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_layout_marginTop="10dip"
                android_text="Número de teléfono"
                android_textSize="15sp" />

            <Editar Texto
                android_layout_width="fill_parent"
                android_layout_height="wrap_content"
                android_layout_marginLeft="0dip"
                Android: diseño_peso = "1"
                android_id="@+id/teléfono_et"
                Android: tipo de entrada = "número" />
        </TableRow>
    </TableLayout>

    <LinearLayout
        android_layout_width="match_parent"
        android_layout_height="wrap_content"
        android: orientación = "horizontal"
        Android: relleno = "20dip"
        >

        <Botón
            android_id="@+id/reset_btn"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            android_layout_gravity="superior"
            Android: diseño_peso = "1"
            android_texto="Restablecer" />

        <Botón
            android_id="@+id/submit_btn"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            android_layout_gravity="superior"
            Android: diseño_peso = "1"
            android_text="Enviar" />
    </LinearLayout>

</LinearLayout>

Producción:

agregar el número de teléfono

Pasos para el desarrollo

1. Crear la clase ITelephony.aidl

Cree un paquete en su directorio src/ de la aplicación de Android y asígnele el nombre «com.android.internal.telephony».

Cree una clase en ese paquete llamada: ITelephony.aidl y copie la siguiente fuente en ella.

ITelephony.aidl

paquete com.android.internal.telephony;

// Necesidad de telefonía Android
// Mantenga los nombres de los paquetes, clases y métodos tal como están.

  interfaz ITelefonía {

    booleano terminar llamada();

  }

2. Definir la estructura de la tabla de la base de datos

Solo tenemos una tabla en nuestra aplicación: es decir, una lista negra con la siguiente estructura:

lista negra
identificación int (automático) – PK
número de teléfono Cuerda

3. Crear modelo de datos

Solo hay una clase de modelo de datos: Lista negra

lista negra.java

paquete com.androidbegin.callblocker;

// Clase de modelo para la lista negra de la tabla de la base de datos
lista negra de clase pública {

	// Dos campos de mapeo para la lista negra de la tabla de la base de datos
	identificación larga pública;
	número de teléfono de cadena pública;
	
	// Constructor predeterminado
	Lista negra pública () {
		 
	}
	
	// Para crear fácilmente el objeto Blacklist, un constructor alternativo
	lista negra pública (número de teléfono de cadena final) {
		 this.phoneNumber = phoneNumber;
	}
	
	// Anulando el método predeterminado para comparar entre los dos objetos bu número de teléfono
	@Anular
	public boolean equals(final Object obj) {
		
		// Si el objeto pasado es una instancia de Blacklist, compare los números de teléfono; de lo contrario, devuelva falso ya que no son iguales
		if(obj.getClass().isInstance(nueva lista negra()))
		{
			// Enviar el objeto a la lista negra
			Lista negra final bl = (Lista negra) obj;
			
			// Compara si los números de teléfono son iguales, si es así, define que los objetos son iguales
			if(bl.phoneNumber.equalsIgnoreCase(this.phoneNumber))
				devolver verdadero;
		}
		falso retorno;
	}
}

 4. Crear ayudante de base de datos

Esta clase realiza la creación de la base de datos, la creación de tablas, etc.

DatabaseHelper.java

paquete com.androidbegin.callblocker;

importar android.content.Context;
importar android.database.sqlite.SQLiteDatabase;
importar android.database.sqlite.SQLiteOpenHelper;

clase pública DatabaseHelper extiende SQLiteOpenHelper {
	
	// Definir el nombre de la base de datos SQLite
	Cadena final estática privada DATABASE_NAME = "call_blocker.db";
	
	// Definir la versión de la base de datos SQLite
	privado estático final int DATABASE_VERSION = 1;
	
	// Definir el nombre de la tabla SQLite para crear
	public static final String TABLE_BLACKLIST = "lista negra";
	
	// Declaración SQL de creación de tabla
	  Cadena final estática privada TABLE_CREATE = "crear tabla" + TABLE_BLACKLIST + "( id "
	      + "autoincremento de clave principal de entero, texto de número de teléfono no nulo);";

	Public DatabaseHelper (contexto contextual) {
		super(contexto, DATABASE_NAME, nulo, DATABASE_VERSION);
	}

	// Este método se ejecutará una vez en el ciclo de vida completo de la aplicación
	// Todo el código de creación de tablas debe ponerse aquí
	@Anular
	vacío público en Crear (SQLiteDatabase db) {
		db.execSQL(TABLE_CREATE);	
	}

	@Anular
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO stub de método generado automáticamente
	}

}

5. Crear BlacklistDAO.java

Esta clase actúa como fuente de datos para la tabla de la base de datos de la lista negra. Contiene métodos CRUD para acceder al mismo.

Lista negra.DAO

paquete com.androidbegin.callblocker;

importar java.util.ArrayList;
importar java.util.List;

importar android.content.ContentValues;
importar android.content.Context;
importar android.database.Cursor;
importar android.database.SQLException;
importar android.database.sqlite.SQLiteDatabase;

clase pública BlacklistDAO {

	// Objetos SQLiteDatabase y DatabaseHelper para acceder a la base de datos SQLite
	base de datos SQLiteDatabase privada;
	ayudante de base de datos privado dbHelper;

	// Constructor inicia DatabaseHelper para asegurarse de que se haya creado la base de datos
	lista negra públicaDAO (contexto contextual) {
		dbHelper = new DatabaseHelper(contexto);
		abierto();
	}

	privado vacío abierto () lanza SQLException {
		
		// Abre la conexión a la base de datos para proporcionar el acceso
		base de datos = dbHelper.getWritableDatabase();
	}

	cierre de vacío público () {
		
		// Cerrarlo, una vez hecho
		dbHelper.cerrar();
	}
	
	creación de lista negra pública (lista negra de lista negra final) {
		
		// Pasos para insertar datos en db (en lugar de usar una consulta SQL sin procesar)
		// primero, crea un objeto de ContentValues
		valores finales de ContentValues ​​= nuevos ContentValues();
		
		// segundo, coloca el par clave-valor en él
		valores.put("phone_number", blackList.phoneNumber);
		
		// sed. insertar el objeto en la base de datos
		identificación larga final = base de datos.insertar(DatabaseHelper.TABLE_BLACKLIST, nulo, valores);
		
		// establecer la clave principal en objeto y regresar
		listanegra.id = id;
		volver lista negra;
	}

	eliminación de anulación pública (lista negra final de la lista negra) {
		
		// Forma de eliminar un registro de la base de datos
		base de datos.delete(DatabaseHelper.TABLE_BLACKLIST, "phone_number = '" + blackList.phoneNumber + "'", null);
	}
	
	public List<Lista negra> getAllBlacklist() {
		
		// Pasos para obtener todos los registros de una tabla de base de datos
		// primero, crea el objeto deseado
		final List<Blacklist> blacklistNumbers = new ArrayList<Blacklist>();
		
		// segundo, consulta la base de datos y establece el resultado en Cursor
		Cursor final cursor = base de datos.consulta(DatabaseHelper.TABLE_BLACKLIST, new String[]{"id","phone_number"}, null, null, null, null, null);
		
		// Mueve el puntero del Cursor al primero
		cursor.moverAlPrimero();
		
		// iterar sobre el cursor
	    while (!cursor.isAfterLast()) {
			número final de la lista negra = nueva lista negra ();
			
			// Obtener el valor deseado del Cursor por índice de columna
			numero.id = cursor.getLong(0);
			número.phoneNumber = cursor.getString(1);
			
			// Agrega el objeto lleno con los datos apropiados a la lista
			blacklistNumbers.add(número);
			
			// Mueva el puntero del cursor al siguiente para obtener el siguiente registro
			cursor.moveToNext();
	    }
		devuelve los números de la lista negra;
	}
}

6. Actividad principal

Es la pantalla de inicio de la aplicación que muestra una lista de todos los números móviles de la ‘lista negra’ almacenados por el usuario.

El usuario puede agregar un nuevo número de teléfono a la lista negra tocando el botón «Agregar número de teléfono».

El usuario puede eliminar un número existente de la lista manteniendo presionado el mismo.

MainActivity.java

paquete com.androidbegin.callblocker;

importar java.util.List;

importar android.app.AlertDialog;
importar android.content.Context;
importar android.content.DialogInterface;
importar android.content.Intent;
importar android.os.Bundle;
importar android.support.v7.app.ActionBarActivity;
importar android.view.LayoutInflater;
importar android.view.View;
importar android.view.View.OnClickListener;
importar android.view.ViewGroup;
importar android.widget.AdapterView;
importar android.widget.AdapterView.OnItemLongClickListener;
importar android.widget.ArrayAdapter;
importar android.widget.Button;
importar android.widget.ListView;
importar android.widget.TextView;

clase pública MainActivity extiende ActionBarActivity implementa OnClickListener, OnItemLongClickListener {

	// Declaración de todos los componentes en pantalla de la pantalla principal
	Botón privado add_blacklist_btn;
	vista de lista pública ListView;
	
	// Objeto de BlacklistDAO para consultar a la base de datos
	BlackListDAO privada BlackListDao;
	
	// Contiene la lista de objetos de la lista negra obtenidos de la base de datos
	public static List<Blacklist> blockList;
	
	
	// Esto contiene el valor del número de fila, que el usuario ha seleccionado para acciones posteriores
	privado int seleccionadoRecordPosition = -1;

	@Anular
	Vacío protegido onCreate (Paquete de estado de instancia guardado) {
		super.onCreate(estadoDeInstanciaGuardado);
		setContentView(R.diseño.actividad_principal);

		// Inicialización del botón de la pantalla Principal
		add_blacklist_btn = (Botón) findViewById(R.id.add_blacklist_btn);

		// Adjunto de onClickListner para ello
		add_blacklist_btn.setOnClickListener(esto);
		
		// Inicialización de la vista de lista de la pantalla principal para mostrar los números de teléfono en la lista negra
		listview = (ListView) findViewById(R.id.listview);
		
		// Establecer el encabezado de ListView
		inflador LayoutInflater final = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		vista final rowView = inflater.inflate(R.layout.list_item, listview, false);
		vista de lista.addHeaderView (vista de fila);
		
		// Adjunte OnItemLongClickListener para rastrear la acción del usuario y actuar en consecuencia
		listview.setOnItemLongClickListener(esto);
	}
	
	vacío privado populateNoRecordMsg()
	{
		// Si no se encuentra ningún registro en la base de datos, se debe mostrar el mensaje correspondiente.
		if(listadebloques.tamaño() == 0)
		{
			TextView final tv = new TextView(esto);
			tv.setPadding(5, 5, 5, 5);
			tv.establecerTamañoTexto(15);
			tv.setText("¡No se encontraron registros!!");
			vista de lista.addFooterView (tv);
		}
	}

	@Anular
	public void onClick(Ver v) {
		// Mostrar la pantalla AddToBlocklistActivity una vez que haga clic en el botón "Agregar"
		if (v == agregar_lista_negra_btn) {
			startActivity(new Intent(this, AddToBlocklistActivity.class));
		}
	}
	
	@Anular
	public boolean onItemLongClick(AdapterView<?> padre, vista de vista, posición int, id largo) {
		// Si la fila presionada no es un encabezado, actualice selectedRecordPosition y
		// muestra el diálogo para una mayor selección
		si (posición > 0) {
			seleccionóRecordPosition = posición - 1;
			mostrarDiálogo();
		}
		devolver verdadero;
	}
	
	@Anular
	vacío protegido en el currículum () {
		super.onReanudar();
		
		// Inicializar el objeto DAO
		blackListDao = new BlacklistDAO(esto);
		
		// Obtenga la lista de números de la lista negra de la base de datos usando el objeto DAO
		blockList = blackListDao.getAllBlacklist();
		
		// Eliminar la vista de pie de página
		if(vista de lista.getChildCount() > 1)
			listview.removeFooterView(listview.getChildAt(listview.getChildCount() - 1));
		
		// Ahora, vincule CustomArrayAdapter con ListView
		listview.setAdapter(nuevo CustomArrayAdapter(this, R.layout.list_item, blockList));
		
		// Si no se encuentra ningún registro en la base de datos, se debe mostrar el mensaje correspondiente.
		poblarNoRecordMsg();
	}
	
	showDialog vacío privado ()
	{
		// Antes de eliminar el registro presionado durante mucho tiempo, debe confirmar con el usuario. Entonces, construya el AlartBox primero
		AlertDialog.Builder final alertDialogBuilder = new AlertDialog.Builder(esto);
		
		// Establezca el mensaje apropiado en él.
		alertDialogBuilder.setMessage("¿Realmente desea eliminar el registro seleccionado?");
		
		// Agregue un botón positivo y su acción. En nuestro caso la acción sería la eliminación de los datos
		alertDialogBuilder.setPositiveButton("Eliminar",
				nueva DialogInterface.OnClickListener() {
					@Anular
					onClick public void (DialogInterface arg0, int arg1) {
						intentar {
							
							blackListDao.delete(blockList.get(selectedRecordPosition));
							
							// Eliminando lo mismo de la Lista para eliminarlo también de la pantalla
							blockList.remove(selectedRecordPosition);
							vista de lista.invalidarVistas();
							
							// Restablecer el valor de selectedRecordPosition
							posición de registro seleccionado = -1;
							poblarNoRecordMsg();
						} captura (Excepción e) {
							e.printStackTrace();
						}
					}
				});
		
		// Agrega un botón negativo y su acción. En nuestro caso, simplemente oculte el cuadro de diálogo.
		alertDialogBuilder.setNegativeButton("Cancelar",
				nueva DialogInterface.OnClickListener() {

					@Anular
					public void onClick(DialogInterface dialog, int cual) {
					}
				});

		// Ahora, crea el Diálogo y muéstralo.
		AlertDialog final alertDialog = alertDialogBuilder.create();
		alertaDialog.show();
	}
	
	clase pública CustomArrayAdapter extiende ArrayAdapter<String> {

		inflador LayoutInflater privado;
		
		// Esto mantendría los objetos de la base de datos, es decir, la lista negra
		registros privados List<Blacklist>;
		
		@SuppressWarnings("desmarcado")
		public CustomArrayAdapter(Contexto de contexto, recurso int, @SuppressWarnings("rawtypes") Objetos de lista) {
			super(contexto, recurso, objetos);
			
			this.records = objetos;
			inflador = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}
		
		@Anular
		public View getView (posición int, View convertView, ViewGroup parent) {
			
			//Reutilizar la vista para suavizar el efecto de desplazamiento
			si (convertirVista == nulo)
				convertView = inflater.inflate(R.layout.list_item, parent, false);
			
			// Obtener el número de teléfono del objeto de la base de datos
			número de teléfono de la lista negra final = registros.get (posición);
			
			// Establecer en el componente de pantalla para mostrar los resultados
			((TextView)convertView.findViewById(R.id.serial_tv)).setText("" + (posición +1));
			((TextView)convertView.findViewById(R.id.phone_number_tv)).setText(phoneNumber.phoneNumber);
			volver convertView;
		}
	
	}
}

7. AddToBlocklistActivity

Esta pantalla realiza la adición de un nuevo número de teléfono a la lista negra

AddToBlocklistActivity.java

paquete com.androidbegin.callblocker;

importar android.app.Actividad;
importar android.app.AlertDialog;
importar android.content.DialogInterface;
importar android.os.Bundle;
importar android.view.View;
importar android.view.View.OnClickListener;
importar android.widget.Button;
importar android.widget.EditText;

la clase pública AddToBlocklistActivity extiende la actividad implementa OnClickListener {

	// Declaración de todos los componentes en pantalla
	privado EditText country_code_et, phone_et;
	Botón privado reset_btn, submit_btn;
	
	// Declaración de BlacklistDAO para interactuar con la base de datos SQLite
	BlackListDAO privada BlackListDao;

	@Anular
	Vacío protegido onCreate (Paquete de estado de instancia guardado) {
		super.onCreate(estadoDeInstanciaGuardado);
		setContentView(R.layout.activity_add_to_blocklist);
		
		// Inicialización del objeto DAO.
		blackListDao = new BlacklistDAO(esto);

		country_code_et = (EditText) findViewById(R.id.country_code_et);
		phone_et = (EditText) findViewById(R.id.phone_et);
		reset_btn = (Botón) findViewById(R.id.reset_btn);
		enviar_btn = (Botón) findViewById(R.id.submit_btn);
		
		reset_btn.setOnClickListener(esto);
		enviar_btn.setOnClickListener(esto);
	}
	
	@Anular
	public void onClick(Ver v) {

		si (v == enviar_btn)
		{
			// Todos los campos de entrada son obligatorios, así que hizo una verificación
			if(country_code_et.getText().toString().trim().length() > 0 &&
					phone_et.getText().toString().trim().length() > 0)
			{
				// Una vez que haga clic en "Enviar", primero crea el objeto Blacklist
				teléfono de la lista negra final = nueva lista negra ();
				
				// Luego, establece todos los valores de la entrada del usuario
				phone.phoneNumber = "+" + country_code_et.getText().toString() + phone_et.getText().toString();
				
				//Insertar el objeto en la base de datos
				blackListDao.create (teléfono);
				
				// Mostrar el mensaje de éxito al usuario
				mostrarDiálogo();
			}
			// Mostrar un cuadro de diálogo con el mensaje apropiado en caso de que los campos de entrada estén en blanco
			más
			{
				showMessageDialog("¡¡Todos los campos son obligatorios!!");
			}
		}
		más si (v == reset_btn)
		{
			Reiniciar();
		}
	}
	
	// Limpiar el texto ingresado
	reinicio de vacío privado ()
	{
		código_país_et.setText("");
		teléfono_et.setText("");
	}
	
	showDialog vacío privado ()
	{
		// Después del envío, se abre Diálogo con el mensaje "Éxito". Entonces, construya el AlartBox primero
		AlertDialog.Builder final alertDialogBuilder = new AlertDialog.Builder(esto);
		
		// Establezca el mensaje apropiado en él.
		alertDialogBuilder.setMessage("¡¡Número de teléfono agregado a la lista de bloqueo con éxito!!");
		
		// Agregue un botón positivo y su acción. En nuestro caso, la acción sería simplemente ocultar el cuadro de diálogo,
		// y borra las entradas del usuario.
		alertDialogBuilder.setPositiveButton("Agregar más",
				nueva DialogInterface.OnClickListener() {

					@Anular
					onClick public void (DialogInterface arg0, int arg1) {
						Reiniciar();
					}
				});
		
		// Agrega un botón negativo y su acción. En nuestro caso, cerrar la pantalla actual
		alertDialogBuilder.setNegativeButton("Cancelar",
				nueva DialogInterface.OnClickListener() {
					@Anular
					public void onClick(DialogInterface dialog, int cual) {
						terminar();
					}
				});

		// Ahora, crea el Diálogo y muéstralo.
		AlertDialog final alertDialog = alertDialogBuilder.create();
		alertaDialog.show();
	}
	
	privado void showMessageDialog (mensaje de cadena final)
	{
		AlertDialog.Builder final alertDialogBuilder = new AlertDialog.Builder(esto);
		alertDialogBuilder.setMessage(mensaje);
		AlertDialog final alertDialog = alertDialogBuilder.create();
		alertaDialog.show();
	}
}

8. Restricción de llamadas.java

Esta clase de Java en realidad hace la desconexión automática. Extiende el «android.content.BroadcastReceiver» y cada vez que hay una llamada entrante al teléfono, obtiene el número de teléfono a través de BroadcastReceiver y si el número coincide con alguno de los números de teléfono almacenados en la base de datos, se desconecta automáticamente.

Restricción de llamadas.java

paquete com.androidbegin.callblocker;

importar java.lang.reflect.Method;

importar android.content.BroadcastReceiver;
importar android.content.Context;
importar android.content.Intent;
importar android.telephony.TelephonyManager;

importar com.android.internal.telephony.ITelephony;

// Ampliar la clase de BroadcastReceiver para escuchar cuando hay una llamada entrante
clase pública CallBarring extiende BroadcastReceiver
{
	// Esta cadena contendrá el número de teléfono entrante
	número de cadena privado;
	
	@Anular
	public void onReceive(Contexto contexto, Intención intención)
	{
		// Si la acción recibida no es del tipo "Phone_State", ignórela
	     if (!intent.getAction().equals("android.intent.action.PHONE_STATE"))
	         retorno;
	     
	    // Si no, trata de hacer alguna acción
	     más
	     {
	    	 // Obtener el número de llamada entrante
	         número = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
	         
	         // Verifique si este es un miembro de los números de teléfono de la "lista negra" almacenados en la base de datos
	         if(MainActivity.blockList.contains(nueva Lista negra(número)))
	         {
	        	 // En caso afirmativo, invocar el método
	        	 desconectarTeléfonoItelefonía(contexto);
	             retorno;
	         }
	     }  
	 }

	// Método para desconectar el teléfono de forma automática y mediante programación
	// Mantener este método como está
	 @SuppressWarnings({ "tipos sin procesar", "desmarcado" })
	 privado vacío desconectarPhoneItelephony(contexto contexto)
	 {
		 Servicio de telefonía ITelefonía;
		 TelephonyManager telefonía = (TelephonyManager)
		 context.getSystemService(Context.TELEPHONY_SERVICE);  
		 intentar
		 {
			 Clase c = Class.forName(telefonía.getClass().getName());
			 Método m = c.getDeclaredMethod("getITelephony");
			 m.setAccesible(verdadero);
			 servicio_telefonia = (ITelefonía) m.invoke(telefonía);
		     serviciotelefónico.finalizarllamada();
		 }
		 captura (Excepción e)
		 {
			 e.printStackTrace();
		 }
	 }
}

9. Manifiesto de Android

Abra su AndroidManifest.xml y declare las actividades requeridas:

AndroidManifest.xml

<?versión xml="1.0" codificación="utf-8"?>
<manifiesto xmlns_android="http://schemas.android.com/apk/res/android"
    paquete="com.androidbegin.bloqueador de llamadas"
    android_versionCode="1"
    android_versionName="1.0" >

    <usos-sdk
        android_minSdkVersion="14"
        android_targetSdkVersion="21" />

    <aplicación
        Android: permitir copia de seguridad = "verdadero"
        android_icono="@dibujable/ic_launcher"
        android_etiqueta="@cadena/nombre_aplicación"
        android_tema="@estilo/AppTheme" >
        <actividad
            android_nombre=".Actividad principal"
            android_etiqueta="@cadena/nombre_aplicación" >
            <intent-filter>
                <acción android_name="android.intent.action.MAIN" />

                <categoría android_name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </actividad>
        
        <receptor android_name=".CallBarring">
            <intent-filter android_priority="100" >
                <acción android_name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receptor>
        
        <actividad
            android_name=".AddToBlocklistActivity"
            android_etiqueta="@cadena/nombre_aplicación"
            />
    </aplicación>

    <usos-permiso android_name="android.permission.CALL_PHONE" />
    <usos-permiso android_name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <usos-permiso android_name="android.permission.READ_PHONE_STATE" />
</manifiesto>

 

Prueba la aplicación

Ahora, para probar la funcionalidad, agregue un número de teléfono a la lista negra e intente hacer una llamada telefónica desde el mismo número. Verá que el teléfono se desconecta en silencio (o probablemente después de un pequeño sonido de timbre).

Problemas conocidos

  • Como esta funcionalidad depende únicamente del hardware del teléfono y de las API de telefonía de Android, hay pocos teléfonos que no responden como se esperaba y no desconectan la llamada entrante.
  • Para teléfonos con SIM dual, no funciona para las llamadas entrantes de la tarjeta SIM secundaria (aunque funciona bien para la tarjeta SIM principal).

Código fuente

[purchase_link id=”8044″ text=”Comprar para descargar el código fuente” style=”button” color=”green”]