ContentObserver должен вызывать, если и только если ContactsContract.Contacts.CONTENT_URI изменяется

Поскольку мое приложение использует контент из android.provider.ContactsContract.Data (API > 11) и ContactsContract.Contacts.CONTENT_URI (API < 11) для заполнения Contacts,

Я пытался registerContentObserver() против этих провайдеров. Но это называет мой ContentObserver даже если я попытаюсь позвонить человеку с устройства, как только я положу вызов. Это вызывает мой ContentObserver что не полезно для меня, так как нет изменения содержания в Contacts Provider,

Первопричина:

Похоже на LAST_TIME_CONTACTED или что-то в ContactsContract.Contacts.CONTENT_URI внести изменения, когда был сделан вызов с устройства, которое законно просыпается ContentObserver,

Пытался:

private class ContactsContentObserver extends ContentObserver {
    public ContactsContentObserver() {
        super(null);
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Zname.getPreferences().setRefreshContact(true);
    }
}

зарегистрированный ContentObserver в OnCreate() из Activity

ContactsContentObserver contactsContentObserver = new ContactsContentObserver();
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, false, contactsContentObserver);

Пробовал с notifyForDescendents как false на registerContentObserver, Тем не менее это вызывает ContentObserver

Ques:

Как можно зарегистрироваться ContentObserver который срабатывает тогда и только тогда, когда информация о контактах находится в разделе CRUD(Создать, Обновить, Удалить), кроме Last_Time_Contacted или его потомки?

2 ответа

Решение

Как android.provider.ContactsContract контент-провайдер имеет свою сложность, которая делает ContentObserver трудно уведомить только о contacts изменение контента, кроме как LAST_TIME_CONTACTED поле, как все попадаются, говорят, что это так и есть.

Нужно разработать свою собственную логику contacts данные обновляются или нет, когда ContentObserver уведомляет.

Точки для рассмотрения логики построения contacts действительно обновляться или нет.

  • Проверка на этих основаниях проверена в последний раз. Зависит от требования.
  • Добавление ContentObserver в Service который STICKY так что это может быть, когда контакты меняются.

Синхронизация логики телефонной книги:- Поскольку я поддерживал контакты с помощью SQLite, проверил, существует ли он или нет, и не строю логику.

ContentValues values;
Cursor cursor = Zname.getApplication().getContentResolver().query(DBConstant.All_Contacts_Columns.CONTENT_URI,null,DBConstant.All_Contacts_Columns.COLUMN_CONTACT_NUMBER+ "=?",new String[] { _contact.getContactNumber() },null);

 if (cursor.getCount() <= 0) {
        cursor.moveToFirst();
        Zname.getApplication().getContentResolver().delete(DBConstant.All_Contacts_Columns.CONTENT_URI,DBConstant.All_Contacts_Columns.COLUMN_CONTACT_NUMBER+ "?=",new String[] { _contact.getContactNumber() });
        Log.i(TAG, "Updating zname phonebook");
        values = new ContentValues();
        values.put(DBConstant.All_Contacts_Columns.COLUMN_CONTACT_ID,_contact.getContactId());
        values.put(DBConstant.All_Contacts_Columns.COLUMN_CONTACT_NUMBER,_contact.getContactNumber());
        values.put(DBConstant.All_Contacts_Columns.COLUMN_DISPLAY_NAME,_contact.getContactName());
        values.put(DBConstant.All_Contacts_Columns.COLUMN_ZNAME_DP_URL_SMALL,_contact.getContactPhotoUri().toString());

        Zname.getApplication().getContentResolver().insert(DBConstant.All_Contacts_Columns.CONTENT_URI,values);

        if (cursor != null)
              cursor.close();
   }

Основная проблема здесь заключается в том, что регистрация ContactsContract.Contacts.CONTENT_URI не работает, как вы могли бы разумно думать.

Причина, по которой вы получаете обновления, даже если notifyForDescendents является false потому что Uri запуск обновления... ContactsContract.Contacts.CONTENT_URI а не набираемый ряд контактов.

Оскорбительный код в приложении "Контакты" можно найти по адресу GrepCode, и в Google Code для этого есть ошибка.

Таким образом, чтобы ответить на ваш вопрос, вы не можете зарегистрировать ContentObserver который сработает для определенных полей в контакте. В вашем приложении должно быть что-то, что будет отслеживать расчеты различий всякий раз, когда onChange пожары.

Другие вопросы по тегам