由于我的应用程序使用来自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
?
答案 0 :(得分:5)
这里的根本问题是注册ContactsContract.Contacts.CONTENT_URI
无法正常运作。
即使notifyForDescendents
为false
,您获得更新的原因是因为触发更新的Uri
是...... ContactsContract.Contacts.CONTENT_URI
而不是正在拨打的联系人行。
可以在GrepCode找到“联系人”应用中的违规代码,并在Google Code上存在此错误。
因此,要回答您的问题,您无法注册ContentObserver
,这会触发联系人的特定字段。您需要在应用中添加一些内容才能跟踪在onChange
开火时计算差异。
答案 1 :(得分:0)
由于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();
}