我正在创建一个Android应用程序来跟踪设备上保存的所有联系人(默认的android联系人应用程序中显示的那些)并将它们保存在服务器上的MySQL表中。
我设法使用ContectResolver
阅读所有联系人数据:
//to read only android address book
String where = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'";
String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY, ContactsContract.Contacts.HAS_PHONE_NUMBER};
ContentResolver cr = context.getContentResolver();
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, projection, where, null, null);
然后,使用ContactsContract.Contacts._ID
我查询其他联系人数据:
// Perform a query to retrieve the contact's name parts
String[] nameProjection = new String[] {
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME,
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME
};
Cursor nameCursor = cr.query(
ContactsContract.Data.CONTENT_URI,
nameProjection,
ContactsContract.Data.MIMETYPE + " = '" +
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "' AND " +
ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID
+ " = ?", new String[] { id }, null);
// Retrieve the name parts
String firstName = "", middleName = "", lastName = "", displayName = "";
if(nameCursor.moveToNext()) {
firstName = nameCursor.getString(nameCursor.getColumnIndex(
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
middleName = nameCursor.getString(nameCursor.getColumnIndex(
ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME));
lastName = nameCursor.getString(nameCursor.getColumnIndex(
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
displayName = nameCursor.getString(nameCursor.getColumnIndex(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
}
然后我将所有这些数据(包括联系人的电子邮件地址和电话号码)发送到服务器。
我希望能够像这样定期备份设备的联系人,但能够通过将旧数据与新数据进行比较来检测联系人数据的变化。但要做到这一点,我需要在Android设备中的联系人和我保存联系人数据的数据库之间建立某种联系。
经过一番搜索,我找到了3个选项:
ContactsContract.Contacts._ID
ContactsContract.Contacts.LOOKUP_KEY
ContactsContract.RawContacts._ID
但是根据我的发现,所有这些都不可靠,并且在某些情况下可以更改 - 使我的数据库与设备的联系人列表之间的链接无效。
我考虑过使用ContentObserver
检测联系人更改的选项。但是,即使我的应用程序已被卸载,我希望能够检测到联系人更改,然后某些联系人已更改,然后我的应用程序已重新安装。
我可以使用每个联系人是否有可靠的识别码,以了解某个联系人何时被更改或删除?
编辑:
我现在发现这个变量存在:ContactsContract.ContactsColumns.CONTACT_LAST_UPDATED_TIMESTAMP
问题是它仅在API级别18中引入。我正在使用min API 15.是否有某些东西可以替换缺少的API级别?
答案 0 :(得分:2)
我担心无法知道特定联系人是否有所改变。因此,您可以在整个地址簿URI上注册观察者。通过这种方式,您可以在地址簿中的任何内容发生变化时进行监听。
现在有观察员,您可以扫描所有联系人并执行"同步"数据到您的服务器。
在您的特定情况下,ContactsContract.Contacts._ID和ContactsContract.Contacts.LOOKUP_KEY对应该足够可靠。但是为了知道是否有任何改变你需要: