Deleting contacts from phonebook which is linked to my app

Viewed 73

I am fetching nearly 1000 contacts from server and creating all the contacts in phonebook. below is the code to add the contacts,

ContentResolver resolver = context.getContentResolver();
    ArrayList<ContentProviderOperation> ops = new ArrayList<>();
    int rawContactInsertIndex = ops.size();
    ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(ContactsContract.RawContacts.CONTENT_URI, true))
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, AccountGeneral.ACCOUNT_NAME)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, AccountGeneral.ACCOUNT_TYPE)
            .withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DEFAULT)
            .withValue(ContactsContract.RawContacts.SOURCE_ID, sourceId)
            .build());
    //for (String phone : numbers) {
    //ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI))
    ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Data.CONTENT_URI, true))
            .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
            .withValue(RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, numbers) // Number of the person
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
            .build()); // Type of mobile number

    ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Data.CONTENT_URI, true))
            .withValueBackReference(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactInsertIndex)
            .withValue(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
            .build());
    ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Data.CONTENT_URI, true))
            .withValueBackReference(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactInsertIndex)
            .withValue(ContactsContract.RawContacts.Data.MIMETYPE, MIMETYPE)
            .withValue(Data.DATA1, sourceId)
            .withValue(Data.DATA3, Data4)
            .build());

    try {
        ContentProviderResult[] results = resolver.applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (Exception e) {
        e.printStackTrace();
    }

Adding contacts is working fine, If i unistall the application then all the contacts which i added from the server and linked to my application is deleting successfully.

But when i tried programatically, to Delete contacts which i added to phonebook is taking lot of time (say more than 5 min for nearly 1000 contacts)

I have used the code shown in below link (Case 3)

CALLER_IS_SYNCADAPTER uses in Insert,Update and Delete URI Android Contacts, Provide direction

ContentResolver resolver = context.getContentResolver();
    ArrayList<ContentProviderOperation> ops =
            new ArrayList<>();
    ops.add(ContentProviderOperation.newDelete(addCallerIsSyncAdapterParameter(RawContacts.CONTENT_URI,true)).
            withSelection(
                    ContactsContract.Groups.ACCOUNT_NAME + "=?",
                    new String[]{AccountGeneral.ACCOUNT_NAME}).build());
    try {
        resolver.applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (Exception e) {
        e.printStackTrace();
    }

private static Uri addCallerIsSyncAdapterParameter(Uri uri, boolean isSyncOperation) {
    if (isSyncOperation) {
        return uri.buildUpon()
                .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true")
                .build();
    }
    return uri;
}

Is there any better way to delete contacts.

Thanks in advance.

1 Answers

I'm not entirely sure, but if I remember correctly, deleting the account programatically should also removing associated contacts:

AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccountsByType(AccountGeneral.ACCOUNT_TYPE);
for (Account a : accounts) {
    am.removeAccountExplicitly(a);
}

if removeAccountExplicitly is not working, try am.removeAccount(a, activity, callback, handler); instead and supply a callback to be notified when the action is completed

Related