android Contacts删除

时间:2015-07-04 07:02:49

标签: android android-contacts

我有一种方法可以从联系人而不是整个联系人中删除特定号码。 (例如,如果名称有2个联系人,我让用户只删除一个号码,而不是整个号码)。 因此,对于包含单个号码的联系人,在删除单个号码后,联系人仅保留名称而不保留相关联的号码。 要使用下面给出的方法删除此类im,该方法可以正常工作,并且删除空的联系人,但它始终不起作用。 它有时行为不端,空洞的接触仍然存在。 有时候它有效。 它始终适用于包含多个数字的名称(删除数字时,使用以下方法删除空联系人)。 对于包含单个号码的姓名(联系人),它可以正常工作并删除空联系人(删除号码后),但有时只会删除。

以下是我如何从联系人中删除“只是一个号码”。

 public void updateContact(String contactId, String type) {
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();


   /* String selectPhone = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" +
            ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'" + " AND " + ContactsContract.CommonDataKinds.Phone.TYPE + "=?";
    String[] phoneArgs = new String[]{contactId, type};

    ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).withSelection(selectPhone, phoneArgs).build());

*/
            ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
            .withSelection(ContactsContract.RawContacts.Data._ID + "=? and " + ContactsContract.RawContacts.Data.MIMETYPE + "=?", new String[]{String.valueOf(contactId), ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE})
            .build());



    try {
        getApplicationContext().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (RemoteException e) {
        e.printStackTrace();
    } catch (OperationApplicationException e) {
        e.printStackTrace();
    }
} 

这是我用来删除空联系人的方法,我在使用asynTask中的上述联系人删除号码后调用此方法。

   public void emptyRemover(String s, String name) {
    ContentResolver contentResolver = this.getContentResolver();
    Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    while (cursor.moveToNext()) {
        if (cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)).equalsIgnoreCase(name)
                /*||cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)).equalsIgnoreCase(s)*/){
            if (cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))==0) {
                String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
                Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
                contentResolver.delete(uri, null, null);
            }
        }
    }
    cursor.close();

}

1 个答案:

答案 0 :(得分:2)

ContactsContract.RawContacts删除原始联系人时,您必须考虑到:

  

调用resolver.delete(...),不会立即删除a   原始联系人行。相反,它在原始联系人上设置DELETED标志   并从其聚合接触中移除原始接触。同步   然后,适配器从服务器中删除原始联系人并完成   通过再次调用resolver.delete(...)并传递来删除电话端   CALLER_IS_SYNCADAPTER查询参数。   某些同步适配器是只读的,这意味着它们只是同步   服务器端对手机的更改,但不是相反的。如果其中之一   原始联系人被标记为删除,它将保留在手机上。   然而,它将是有效的隐形,因为它不会成为其中的一部分   任何总联系人。

这就是为什么有时你会看到它被有效删除,有时候不会删除。因此,您必须调用两次删除操作,如下所示:

Uri rawUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build();    

ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI).
    withSelection(ContactsContract.RawContacts._ID + "=? AND "
                  +ContactsContract.RawContacts.ACCOUNT_TYPE+ "=? AND "
                  +ContactsContract.RawContacts.ACCOUNT_NAME+ "=?"
                  ,params).build()); //sets deleted flag to 1

ops.add(ContentProviderOperation.newDelete(rawUri).
    withSelection(ContactsContract.RawContacts._ID + "=? AND "
                 +ContactsContract.RawContacts.ACCOUNT_TYPE+ "=? AND "
                 +ContactsContract.RawContacts.ACCOUNT_NAME+ "=?"
                 ,params).build()); //erases

希望它有所帮助!