2017-02-01 3 views
2

Я пытаюсь удалить контакт из телефонных контактов. Контакт удаляется из телефонных контактов, но он не удаляется с серверной стороны (контакты Google), и когда синхронизация контактов Google запускается, то удаленный контакт снова появляется. Ниже мой код.Удалить контакт с контактами android

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(); 
    } 
} 
+0

Вашего код удаляет контакт из контактов дб в мобильном телефоне, если мобильные имеет синхронизацию активного аккаунта Google, в несколько минут он снова появится. –

+0

Затем, как навсегда удалить контакт? – MaxTycoon

ответ

1

Вы должны попробовать с ContactsContract.CALLER_IS_SYNCADAPTER, как false в вашем коде. Если установлено значение true, контакт удаляется из базы данных навсегда. Но когда происходит следующая синхронизация, контакт синхронизируется. Как синхронизация Google проверяет удаленные контакты, используется удаленный флаг, который устанавливается, только если вы установили ContactsContract.CALLER_IS_SYNCADAPTER как false. Ниже приведен фрагмент кода из класса ContactsProvider (ContentProvider для контактов датастора)

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); 
} 
Смежные вопросы