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

голоса
20

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

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)

Можете ли вы сказать мне, как решить мою проблему?

Спасибо.

Задан 09/02/2009 в 07:01
источник пользователем
На других языках...                            


6 ответов

голоса
19

Для удаления всех контактов используйте следующий код:

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

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

Ответил 22/11/2010 d 11:59
источник пользователем

голоса
15

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

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" />
Ответил 07/04/2012 d 23:09
источник пользователем

голоса
9

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

Вы будете нуждаться в 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>
Ответил 09/02/2009 d 09:59
источник пользователем

голоса
7

Поздний ответ, но, возможно, это помогает в любом случае:

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

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

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

EDIT: Я просто понял , что я неправильно понял вопрос. Я думал , что вы хотели бы, чтобы удалить номер телефона, который мой код делает. Но теперь я вижу , что вы хотите удалить contanct.

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вместо этого, потому что она содержит число в нормализованной форме.

Ответил 25/05/2009 d 18:51
источник пользователем

голоса
0

Лучший способ удаления контакта является удаление всех сырых контактов с помощью контактного идентификатора

    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"/>
Ответил 23/06/2017 d 10:57
источник пользователем

голоса
0
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());
    }
}

Я использовал этот код для удаления contacts.It удалит контакты SIM, а также телефонные контакты или только контактов, сохраненных в памяти телефона.

Ответил 07/08/2012 d 12:26
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more