我尝试以下代码删除指定号码的联系人:
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; }
并提醒添加读/写联系人权限
您是否在清单中声明了相应的权限?
Android之前你需要使用android.permission.READ_CONTACTS
和android.permission.WRITE_CONTACTS
使用权限标签才能让你搞乱联系人提供商:
一个迟到的答案,但也许它有帮助:
如果您查看ContactsProvider的源代码并搜索"matcher.addURI"(如果它在中间停止加载,请不要感到惊讶......它会在一两分钟后恢复加载),然后您会看到它有一个它可以处理的有限URI方案集.它有一个"电话/#"的处理程序,但不是"电话",这是你需要的.
这意味着,没有代码可以删除所有电话号码,您必须先获取所有号码的ID,然后一次删除每个号码.当然,这需要更多的CPU和内存资源,但至少它可以工作.
以下代码删除特定数字.请注意,我没有测试此代码,但它与我用来删除给定人员的所有数字的代码完全相同,这需要类似的处理,因为Android无法删除"people /#/ phones"但是"人/#/手机/#"
编辑: 我刚才意识到我误解了这个问题.我以为你想删除我的代码所用的电话号码.但现在我看到你要删除该联系人.
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); ArrayListidsToDelete = new ArrayList (); 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
,因为它包含标准化形式的数字.