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
пожары.