Cómo eliminar un contacto mediante progtwigción en Android

Intento el siguiente código para eliminar el contacto con un número específico:

private void removeContact(Context context, String phone) { //context.getContentResolver().delete(Contacts.Phones.CONTENT_URI, phone, null); context.getContentResolver().delete(Contacts.Phones.CONTENT_URI, Contacts.PhonesColumns.NUMBER+"=?", new String[] {phone}); } 

Pero tengo esta excepción:

 java.lang.UnsupportedOperationException: Cannot delete that URL: content://contacts/phones at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:130) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:110) at android.content.ContentProviderProxy.delete(ContentProviderNative.java:362) at android.content.ContentResolver.delete(ContentResolver.java:386) 

¿Puedes decirme cómo solucionar mi problema?

Gracias.

Para borrar todos los contactos use el siguiente código:

 ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); while (cur.moveToNext()) { try{ String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey); System.out.println("The uri is " + uri.toString()); cr.delete(uri, null, null); } catch(Exception e) { System.out.println(e.getStackTrace()); } } 

Para eliminar cualquier contacto específico, modifique la consulta

 cr.delete(uri, null, null); 

¡Espero eso ayude!

Esto es todo lo que necesitamos. Para eliminar contacto con el número de teléfono y el nombre dado

 public static boolean deleteContact(Context ctx, String phone, String name) { Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phone)); Cursor cur = ctx.getContentResolver().query(contactUri, null, null, null, null); try { if (cur.moveToFirst()) { do { if (cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME)).equalsIgnoreCase(name)) { String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey); ctx.getContentResolver().delete(uri, null, null); return true; } } while (cur.moveToNext()); } } catch (Exception e) { System.out.println(e.getStackTrace()); } finally { cur.close(); } return false; } 

Y recuerde agregar permiso de contacto de lectura / escritura

   

¿Tiene los permisos apropiados declarados en su manifiesto?

Necesitará las tags de autorización de android.permission.READ_CONTACTS y android.permission.WRITE_CONTACTS antes de que Android le permita jugar con el proveedor de contactos:

     

Una respuesta tardía, pero tal vez ayuda de todos modos:

Si mira el código fuente de ContactsProvider y busca “matcher.addURI” ( no se sorprenda si deja de cargar en el medio … se reanuda la carga después de un minuto o dos ), entonces verá que tiene una conjunto finito de esquemas de URI que puede manejar. Tiene un controlador para “teléfonos / #” pero no para “teléfonos”, que es lo que necesitaría.

Esto significa que simplemente no hay un código para eliminar todos los números de teléfono, primero debe obtener los ID de todos los números y luego eliminar cada uno a la vez. Por supuesto, esto requiere mucho más recursos de CPU y memoria, pero al menos funciona.

El siguiente código elimina un número específico. Tenga en cuenta que no probé este código, pero es 90% idéntico al código que uso para eliminar todos los números de una persona determinada, que necesita un tratamiento similar porque Android no puede eliminar “personas / # / teléfonos”, pero ” personas / # / teléfonos / # ”

EDITAR: Me acabo de dar cuenta de que he entendido mal la pregunta. Pensé que le gustaría eliminar el número de teléfono, que mi código hace. Pero ahora veo que quieres eliminar el contactante.

 private void deletePhoneNumber(Uri peopleUri, String numberToDelete) { Uri.Builder builder = peopleUri.buildUpon(); builder.appendEncodedPath(People.Phones.CONTENT_DIRECTORY); Uri phoneNumbersUri = builder.build(); String[] mPhoneNumberProjection = { People.Phones._ID, People.Phones.NUMBER }; Cursor cur = resolver.query(phoneNumbersUri, mPhoneNumberProjection, null, null, null); ArrayList idsToDelete = new ArrayList(); if (cur.moveToFirst()) { final int colId = cur.getColumnIndex(People.Phones._ID); final int colNumber = cur.getColumnIndex(People.Phones.NUMBER); do { String id = cur.getString(colId); String number = cur.getString(colNumber); if(number.equals(numberToDelete)) idsToDelete.add(id); } while (cur.moveToNext()); } cur.close(); for (String id : idsToDelete) { builder.encodedPath(People.Phones.CONTENT_DIRECTORY + "/" + id); phoneNumbersUri = builder.build(); resolver.delete(phoneNumbersUri, "1 = 1", null); } } 

El código es un poco detallado porque hace dos suposiciones:

  • podría haber varias líneas para eliminar (por ejemplo, el número se almacena dos veces)
  • podría no ser seguro obtener un cursor, eliminar una fila y seguir usando el cursor

Ambas suposiciones se manejan primero almacenando el idsToDelete en un ArrayList y luego borrando.

También puede considerar normalizar el número que busca y, en su lugar, usar Column People.Phones.NUMBER_KEY porque contiene los números en forma normalizada.

 ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); while (cur.moveToNext()) { try{ String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey); System.out.println("The uri is " + uri.toString()); cr.delete(uri, null, null); } catch(Exception e) { System.out.println(e.getStackTrace()); } } 

He usado este código para eliminar contactos. Eliminará los contactos SIM, así como los contactos telefónicos o solo los contactos almacenados en el almacenamiento del teléfono.

Una mejor forma de eliminar un contacto es eliminar todos los contactos brutos usando el ID de contacto

  final ArrayList ops = new ArrayList(); final ContentResolver cr = getContentResolver(); ops.add(ContentProviderOperation .newDelete(ContactsContract.RawContacts.CONTENT_URI) .withSelection( ContactsContract.RawContacts.CONTACT_ID + " = ?", new String[] { allId.get(i) }) .build()); try { cr.applyBatch(ContactsContract.AUTHORITY, ops); int deletecontact = serialList.get(allId.get(i)); } catch (RemoteException e) { e.printStackTrace(); } catch (OperationApplicationException e) { e.printStackTrace(); } //background_process(); ops.clear(); } 

y no te olvides de agregar permisos