从Android联系人中删除联系人 [英] Delete contact from android contacts

查看:600
本文介绍了从Android联系人中删除联系人的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从电话联系人中删除联系人.该联系人已从电话联系人中删除,但并未从服务器端(Google联系人)中删除,并且当Google联系人同步触发时,该删除的联系人会重新出现.下面是我的代码.

I am trying to delete a contact from phone contacts. The contact gets deleted from phone contacts but it's not getting deleted from the server-side (Google contacts) and when the Google contact sync triggers then that deleted contact re-appears. Below is my code.

public static void deleteContact(long rawid, ContentResolver contentResolver) {
    ArrayList<ContentProviderOperation> ops = new ArrayList<>();
    Uri uri = ContactsContract.RawContacts.CONTENT_URI
            .buildUpon()
            .appendQueryParameter(
                    ContactsContract.CALLER_IS_SYNCADAPTER,
                    "true")
            .build();
    ops.add(ContentProviderOperation
            .newDelete(uri)
            .withSelection(
                    ContactsContract.RawContacts._ID + " = ?",
                    new String[]{Long.toString(rawid)})
            .build());

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

推荐答案

您应该在代码中尝试将ContactsContract.CALLER_IS_SYNCADAPTER用作false.设置为true时,联系人将从数据库中永久删除.但是,当下一次同步发生时,联系人将被同步回去. Google同步如何检查已删除的联系人,使用的是已删除标志,只有将ContactsContract.CALLER_IS_SYNCADAPTER设置为false时才设置.下面是ContactsProvider类(contacts数据存储的contentprovider)中的代码片段

You should try with ContactsContract.CALLER_IS_SYNCADAPTER as false in your code. While set to true, the contact is permanently deleted from the database. But when the next sync happens the contact is synched back. How Google sync checks for deleted contacts, is using a deleted flag which is set only if you set ContactsContract.CALLER_IS_SYNCADAPTER as false. Below is a snippet of code from the ContactsProvider class (contentprovider for contacts datastore)

if (callerIsSyncAdapter || rawContactIsLocal(rawContactId)) {
    // When a raw contact is deleted, a SQLite trigger deletes the parent contact.
    // TODO: all contact deletes was consolidated into ContactTableUtil but this one can't
    // because it's in a trigger.  Consider removing trigger and replacing with java code.
    // This has to happen before the raw contact is deleted since it relies on the number
    // of raw contacts.
    db.delete(Tables.PRESENCE, PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null);
    count = db.delete(Tables.RAW_CONTACTS, RawContacts._ID + "=" + rawContactId, null);
    mTransactionContext.get().markRawContactChangedOrDeletedOrInserted(rawContactId);
} else {
    count = markRawContactAsDeleted(db, rawContactId, callerIsSyncAdapter);
}

这篇关于从Android联系人中删除联系人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆