以编程方式获取 Android 中联系人的最后更新时间
Get Last Updated Time Of Contacts In Android programmatically
我一直在尝试编写一个 android 程序来同步服务器上的联系人。我已经实现了同步部分现在我想维护差异部分,例如只有那些自上次服务器推送以来已更新的联系人可能会在下一次服务器调用中被推送。
我正在使用 ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP 来关注联系人的最后更新时间戳。它也正常工作,因为它告诉我联系人何时更新但是有一个问题,每当我打电话给任何联系人时,它 CONTACT_LAST_UPDATED_TIMESTAMP 也会更新,就好像联系人现在已被修改一样。我不希望这发生。我只想要联系人的确切最后更新时间或通过任何其他方式来处理上述情况。欢迎提出建议。这是我的代码
String phoneNumber = null;
String _ID = ContactsContract.Contacts._ID;
String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
String CONTACT_LAST_UPDATED_TIMESTAMP = ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP;
String Contact_last = ContactsContract.CommonDataKinds.Phone.CONTACT_LAST_UPDATED_TIMESTAMP;
String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
ContentResolver contentResolver = appContext.getContentResolver();
Cursor cursor = contentResolver.query(CONTENT_URI, null, null, null, null);
ArrayList<Contact> contacts = new ArrayList<>();
if (cursor!= null && cursor.moveToFirst() && cursor.getCount() > 0) {
do {
long activity_at = cursor.getLong(cursor.getColumnIndex(CONTACT_LAST_UPDATED_TIMESTAMP));
if(activity_at <= prevActivityTime) {
continue;
}
// Create a contact object
Contact contact = new Contact();
// Fetch contact id and contact name
String contact_id = cursor.getString(cursor.getColumnIndex(_ID));
String contactName = cursor.getString(cursor.getColumnIndex(DISPLAY_NAME));
} while (cursor.moveToNext());
cursor.close();
}
这里的 preActivityAt 是一个具有前一天时间戳的变量,即从昨天到今天更新的联系人应该被推送到服务器
当您呼叫(或接听)联系人时,值位于:
ContactsContract.Contact.TIMES_CONTACTED,
ContactsContract.Contact.LAST_TIME_CONTACTED
改变。
所以实际上 Contact
在数据库中更新了,因此它的 LAST_UPDATED
时间戳也更新了。
如果您不关心这两个值,则比较您从该联系人获得的最后一个联系方式和新的联系方式,如果 none 个字段 对您很重要 已更改,请跳过该联系人。
更新
为了避免将所有联系人的所有详细信息存储在 app-local 数据库中,您可以计算一个哈希值(单个长整型),它代表当前为联系人保存的字段,如果有新的哈希值对于最近更新的联系人与之前的哈希值不同,您知道联系人已被修改(在您关心的字段上),并且您需要同步该联系人。
查看如何计算 Java 对象的良好哈希值:Java: Getting a unique hash value of an object
我一直在尝试编写一个 android 程序来同步服务器上的联系人。我已经实现了同步部分现在我想维护差异部分,例如只有那些自上次服务器推送以来已更新的联系人可能会在下一次服务器调用中被推送。 我正在使用 ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP 来关注联系人的最后更新时间戳。它也正常工作,因为它告诉我联系人何时更新但是有一个问题,每当我打电话给任何联系人时,它 CONTACT_LAST_UPDATED_TIMESTAMP 也会更新,就好像联系人现在已被修改一样。我不希望这发生。我只想要联系人的确切最后更新时间或通过任何其他方式来处理上述情况。欢迎提出建议。这是我的代码
String phoneNumber = null;
String _ID = ContactsContract.Contacts._ID;
String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
String CONTACT_LAST_UPDATED_TIMESTAMP = ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP;
String Contact_last = ContactsContract.CommonDataKinds.Phone.CONTACT_LAST_UPDATED_TIMESTAMP;
String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
ContentResolver contentResolver = appContext.getContentResolver();
Cursor cursor = contentResolver.query(CONTENT_URI, null, null, null, null);
ArrayList<Contact> contacts = new ArrayList<>();
if (cursor!= null && cursor.moveToFirst() && cursor.getCount() > 0) {
do {
long activity_at = cursor.getLong(cursor.getColumnIndex(CONTACT_LAST_UPDATED_TIMESTAMP));
if(activity_at <= prevActivityTime) {
continue;
}
// Create a contact object
Contact contact = new Contact();
// Fetch contact id and contact name
String contact_id = cursor.getString(cursor.getColumnIndex(_ID));
String contactName = cursor.getString(cursor.getColumnIndex(DISPLAY_NAME));
} while (cursor.moveToNext());
cursor.close();
}
这里的 preActivityAt 是一个具有前一天时间戳的变量,即从昨天到今天更新的联系人应该被推送到服务器
当您呼叫(或接听)联系人时,值位于: ContactsContract.Contact.TIMES_CONTACTED, ContactsContract.Contact.LAST_TIME_CONTACTED 改变。
所以实际上 Contact
在数据库中更新了,因此它的 LAST_UPDATED
时间戳也更新了。
如果您不关心这两个值,则比较您从该联系人获得的最后一个联系方式和新的联系方式,如果 none 个字段 对您很重要 已更改,请跳过该联系人。
更新
为了避免将所有联系人的所有详细信息存储在 app-local 数据库中,您可以计算一个哈希值(单个长整型),它代表当前为联系人保存的字段,如果有新的哈希值对于最近更新的联系人与之前的哈希值不同,您知道联系人已被修改(在您关心的字段上),并且您需要同步该联系人。
查看如何计算 Java 对象的良好哈希值:Java: Getting a unique hash value of an object