solo - eliminar contactos de gmail en android
Cómo eliminar un contacto mediante programación en Android (6)
¿Tiene los permisos apropiados declarados en su manifiesto?
Necesitará las etiquetas 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:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.app.myapp" >
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
</manifest>
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.
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<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 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.
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!
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.
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
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
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
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>