Android elimina un contacto específico mediante programación

En este momento, este código está funcionando. ops.add(ContentProviderOperation .newDelete(ContactsContract.Data.CONTENT_URI) .withSelection(ContactsContract.Data.RAW_CONTACT_ID+"=?",new String[] {sid}).build());

Sin embargo, crea un registro desconocido y parece que es el contacto eliminado. ¿Necesito algo para que funcione correctamente?

preguntado el 12 de junio de 12 a las 17:06

3 Respuestas

Lo hice funcionar de esta manera:

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());
    }
    return false;
}

respondido 15 nov., 12:07

Como se explica en

http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html

El campo CONTACT_ID en RawContacts es un enlace al contacto agregado. Eliminación de RawContact a través de ContentProviderOperation.newDelete hará que este campo sea nulo (como lo he encontrado). Cuando RawContact se elimina realmente depende de la sincronización y agregación de Android. Necesitaba eliminar un contacto específico de una cuenta específica, por lo que la eliminación a través de RawContacts, no los contactos agregados, funcionó para mí. Para verificar si RawContact se había eliminado, utilicé:

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

    ContentResolver contentResolver = getContentResolver();

    Cursor curRawContacts = contentResolver.query(ContactsContract.RawContacts.CONTENT_URI, null,
            ContactsContract.RawContacts.ACCOUNT_TYPE + " = ? AND " + ContactsContract.RawContacts.ACCOUNT_NAME
                    + " = ?", new String[]{"MYTYPE", MyAccount}, null);

    int size = curRawContacts.getCount();


    for (int i = 0; i < size; i++) {

        curRawContacts.moveToPosition(i);

        //getColumnIndexOrThrow(String columnName)
        //Returns the zero-based index for the given column name, or throws IlleidRawContactgalArgumentException if the column doesn 't exist.
        String idRawContact = curRawContacts.getString(curRawContacts.getColumnIndexOrThrow(ContactsContract.RawContacts._ID));
        String idContact = curRawContacts.getString(curRawContacts.getColumnIndexOrThrow(ContactsContract.RawContacts.CONTACT_ID));

        // if link to aggregated contact is null, than raw contact had already been deleted
        if (idContact != null) {

Respondido el 14 de diciembre de 15 a las 12:12

newDelete método con ContentProvider no me funciona. Borra todas las informaciones del contacto pero deja un vacío (nulo nulo) contacto en su directorio telefónico.

Es por eso que tuve que usar ContentResolver con delete método.

Quería eliminar los contactos creados con mi aplicación con específicos SOURCE_ID.

Yo he puesto CALLER_IS_SYNCADAPTER a true.

Así es como lo he logrado:

Uri contactUri = RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build();
String whereClause = RawContacts.SOURCE_ID + " = ?";
String[] args = new String[]{contactId};

int deletedRawContacts = context.getContentResolver().delete(contactUri, whereClause, args);

if (deletedRawContacts > 0) {
    Log.d(TAG, "Delete OK");
} else {
    Log.d(TAG, "Nothing to delete");
}

Respondido el 24 de enero de 17 a las 10:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.