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

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

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) 

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

Спасибо.

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

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

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

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

 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" /> 

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

Вам понадобится 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> 

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

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

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

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

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 а затем удаляя.

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

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

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

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

  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"/>