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.
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:
- Agregar número de teléfono a la lista de bloqueo.
- Ver la lista de números de teléfono no deseados almacenados en la base de datos.
- Elimine cualquier número de teléfono almacenado.
- 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:
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>
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”]