如何在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) 

你能告诉我如何解决我的问题吗?

谢谢。

Solutions Collecting From Web of "如何在android中以编程方式删除联系人"

要删除所有联系人,请使用以下代码:

 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之前,你需要android.permission.READ_CONTACTSandroid.permission.WRITE_CONTACTS使用权限标签,让你把联系人提供者弄得乱七八糟:

 <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的源代码并search“matcher.addURI”( 如果中途停止加载,请不要感到惊讶…在一两分钟后恢复加载 ),那么您会看到它有一个它可以处理的有限的URIscheme集。 它有一个“手机/#”处理程序,但不是“手机”,这是你所需要的。

这意味着,只有没有代码可以删除所有的电话号码,你必须先得到所有号码的ID,然后删除每一个。 当然这需要更多的CPU和内存资源,但至less可以工作。

以下代码删除特定的数字。 请注意,我没有testing这个代码,但它与我用来删除给定人的所有号码的代码有90%的相同,需要类似的处理,因为Android不能删除“people /#/ phones”,而是“人/#/手机/#”

编辑: 我只是意识到,我误解了这个问题。 我以为你想删除我的代码的电话号码。 但是现在我看到你想删除这个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然后删除来处理的。

您也可以考虑规范化您search的号码,并使用Column People.Phones.NUMBER_KEY ,因为它包含规范化forms的数字。

 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卡的联系人以及手机通讯录或只存储在手机存储的联系人。

删除联系人的更好方法是使用联系人ID删除所有原始联系人

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