Вопрос:

Как удалить контакт программно в Android

android android-contacts android-contentresolver

38885 просмотра

7 ответа

1078 Репутация автора

Я пытаюсь следующий код, чтобы удалить контакт с указанным номером:

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});
}

Но я получаю это исключение:

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)

Подскажите пожалуйста, как исправить мою проблему?

Спасибо.

Автор: yinglcs Источник Размещён: 09.02.2009 06:01

Ответы (7)


9 плюса

88273 Репутация автора

У вас есть соответствующие разрешения, заявленные в вашем манифесте?

Вам понадобятся теги android.permission.READ_CONTACTSи android.permission.WRITE_CONTACTSиспользование-разрешения, прежде чем Android позволит вам связываться с поставщиком контактов:

<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>
Автор: Reto Meier Размещён: 09.02.2009 08:59

7 плюса

5042 Репутация автора

Поздний ответ, но, возможно, это все равно поможет:

Если вы посмотрите на исходный код ContactsProvider и поищите «matcher.addURI» ( не удивляйтесь, если он перестанет загружаться посередине ... он возобновит загрузку через минуту или две ), то вы увидите, что он имеет конечный набор схем URI, которые он может обрабатывать. Он имеет обработчик для «телефонов / #», но не для «телефонов», который вам нужен.

Это означает, что просто нет кода для удаления всех телефонных номеров, вы должны сначала получить идентификаторы всех номеров, а затем удалять каждый из них за раз. Конечно, это требует гораздо больше ресурсов процессора и памяти, но по крайней мере это работает.

Следующий код удаляет конкретный номер. Помните, что я не тестировал этот код, но он на 90% идентичен коду, который я использую для удаления всех номеров данного человека, который нуждается в аналогичной обработке, поскольку Android не может удалить «люди / # / телефоны», но » люди / # / телефоны / #»

РЕДАКТИРОВАТЬ: Я только что понял, что я неправильно понял вопрос. Я думал, что вы хотели бы удалить номер телефона, что мой код делает. Но теперь я вижу, что вы хотите удалить контакт.

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);
    }
}

Код немного многословен, потому что он делает два предположения:

  • может быть несколько строк для удаления (например, номер сохраняется дважды)
  • может быть небезопасно получить курсор, удалить строку и продолжать использовать курсор

Оба предположения обрабатываются сначала сохранением idsToDeleteв, ArrayListа затем удалением.

Вы также можете подумать о нормализации искомого числа и использовать People.Phones.NUMBER_KEYвместо него столбец , поскольку он содержит числа в нормализованном виде.

Автор: Lena Schimmel Размещён: 25.05.2009 05:51

21 плюса

1069 Репутация автора

Чтобы удалить все контакты, используйте следующий код:

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

Чтобы удалить любой конкретный контакт, измените запрос

cr.delete(uri, null, null);

Надеюсь, поможет!

Автор: Prateek Jain Размещён: 22.11.2010 10:59

19 плюса

2501 Репутация автора

Это все, что нам нужно. Удалить контакт с указанным номером телефона и именем

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;
}

И напомнить добавить разрешение на чтение / запись контакта

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
Автор: khaintt Размещён: 07.04.2012 10:09

0 плюса

178 Репутация автора

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

Я использовал этот код для удаления контактов. Он будет удалять как сим-контакты, так и телефонные контакты или только контакты, хранящиеся в памяти телефона.

Автор: Tirtha Размещён: 07.08.2012 11:26

1 плюс

19 Репутация автора

Лучший способ удалить контакт - удалить все необработанные контакты, используя идентификатор контакта.

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

и не забудьте добавить разрешения

        <uses-permission android:name="android.permission.READ_CONTACTS"/>
        <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
Автор: Anish Bhandari Размещён: 23.06.2017 10:57

0 плюса

651 Репутация автора

Этот код идеально подходит для удаления контакта из его идентификатора ( ContactsContract.Contacts._ID )

Регистрация по телефону для всех номеров этого контакта должна быть удалена независимо

  fun deleteContactById(id: String) {
      val cr = context.contentResolver
      val cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                    null, null, null, null)
      cur?.let {
          try {
                    if (it.moveToFirst()) {
                        do {
                            if (cur.getString(cur.getColumnIndex(ContactsContract.PhoneLookup._ID)) == id) {
                                val lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY))
                                val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey)
                                cr.delete(uri, null, null)
                                break
                            }

                        } while (it.moveToNext())
                    }

                } catch (e: Exception) {
                    println(e.stackTrace)
                } finally {
                    it.close()
                }
            }
}
Автор: Sergio Sánchez Sánchez Размещён: 23.03.2019 02:01
Вопросы из категории :
32x32