Una respuesta tardía, pero tal vez le ayuda de todos modos:
Si mira el source code of ContactsProvider y busca "matcher.addURI" (no te sorprendas si deja de cargar en el medio ... se reanuda la carga después de un minuto o dos), entonces ves que tiene un 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<String> idsToDelete = new ArrayList<String>();
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 prolijo, ya que hace dos suposiciones:
- podría haber múltiples líneas de eliminar (por ejemplo, el número se almacena en dos ocasiones)
- que podría no ser seguro para llegar un cursor, borrar una fila, y seguir usando el cursor
Ambos supuestos son manejados por primera almacenar el idsToDelete
en un ArrayList
y luego eliminar.
También puede considerar para normalizar el número que busca y, en su lugar, utilice la columna People.Phones.NUMBER_KEY
, porque contiene los números en forma normalizada.
problemas de permisos son lo que me matan a la mayoría. Hubo una vez que fui una semana tratando de descubrir por qué mi código de vibración seguía cayendo hasta que descubrí que necesitabas un permiso para vibrar ... – num1