Я хочу перехватывать только операции обновления, вставки и удаления контактов при вызове onChange. Как я могу это сделать …?

#android

#Android

Вопрос:

У меня есть следующий код.

 public class TestContentObserver extends Activity {
    int contactCount = 0;
    final String[] projection = new String[] { RawContacts.CONTACT_ID, RawContacts.DELETED };
    Cursor curval;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        curval = getContentResolver().query(RawContacts.CONTENT_URI, projection, null, null, null);
        contactCount = curval.getCount();

        curval.registerContentObserver(new ContentObserver(new Handler()) {
            @Override
            public void onChange(boolean selfChange) {
                getChangedContactDetails();
            }
            @Override
            public boolean deliverSelfNotifications() {
                return true;
            }
        });

    }



    public void getChangedContactDetails(){
        // how can I catch the affected contact details
    }
}
  

когда я делаю звонок из контактов, он также переходит в функцию onChange. Но я хочу использовать только вставку, обновление и удаление контактов. Пожалуйста, вы можете мне помочь.

Спасибо

Ответ №1:

Это вопрос с подвохом, вам нужно понять, как на самом деле работают контакты, прежде чем вы это сделаете. Каждый контакт связан с учетной записью, и, следовательно, всякий раз, когда происходит изменение контакта (за пределами этой учетной записи), он помечается как грязный. Вы можете получить все эти контакты, используя этот грязный флаг. Но если контакты фактически изменены самой учетной записью, тогда этот флаг не будет установлен.

Если вы не уверены, о чем я говорю, и вам все равно, к какой учетной записи принадлежат контакты, тогда идеальным способом было бы сохранить идентификатор контакта и ссылку на версию где-нибудь в вашем приложении. В этой вашей функции запрашивайте все контакты и выполняйте итерации по списку

  1. Проверьте, есть ли новый контакт, который вы не можете найти в своей справочной таблице. Это недавно добавленный контакт.
  2. Проверьте, выше ли версия сейчас, это обновленный контакт
  3. Проверьте, отсутствует ли контакт (который у вас был в вашей таблице ранее), он был удален.

Если вы не используете менеджер учетных записей, у вас нет другого выбора, кроме как пройти этот цикл.

Комментарии:

1. Спасибо за ваш ответ. Но мне не нужно определять, какая запись изменена. Я хочу знать только изменения, произошедшие только в контактах. Когда я использую content observer, вызывается метод onchange с передачей значения параметра false. Чтобы я мог перехватить это событие. но проблема в том, что когда я делаю звонок из контакта в то время, он также вызывает функцию onChange.