Я знаю, что на некоторых телефонах идентификаторы контактов меняются даже при перезагрузке, но я не могу воспроизвести это на своем телефоне.Но я могу воспроизвести следующий случай и хотел бы знать, можно ли хотя бы решить этот случай:
- установить WhatsApp - он добавит свои контакты в
ContentProvider
- для чтения контактов из
ContactProvider
=> Я получаю набор данных 1 - удалить WhatsApp, переустановить его - он добавит свои контакты в
ContentProvider
снова - читать контакты из
ContentProvider
=> Я получаю набор данных 2
Результат:
Между набором данных 1 и набором данных 2 я не вижулюбые непротиворечивые данные.
Например:
ContactsContract.Data.CONTACT_ID
=> изменяется, например, с 598
до 679
ContactsContract.Data.LOOKUP_KEY
=> также изменяется, например, 3514i2b4948808eec75c9.3789r593-2D374B39.2797r594-2D374B39
на 3514i2b4948808eec75c9.2797r603-2D374B39.3789r670-2D374B39
* конечно, некоторые raw ids
остаются прежними, но ни один общий идентификатор для полного контакта не меняется, насколько я вижу
Что я хочу
Мне нужен идентификатор для контакта, который я могу сохранить в базе данных моего приложения и который также будет работать после изменения, подобного описанному выше. Мне нужен идентификатор для контакта (не необработанного контакта), необработанные контакты могут меняться в течение жизни контакта (как в примере, который я описал выше) ...
Любые идеи, как я могу решить эту проблему?
Код
Ради полноты, вот как я запрашиваю данные из ContentProvider
, по крайней мере, курсора:
private fun getCursor(offset: Int?, count: Int?): Cursor? {
val selection = arrayOf(
ContactsContract.Data.RAW_CONTACT_ID,
ContactsContract.Data.CONTACT_ID,
ContactsContract.Data.LOOKUP_KEY,
ContactsContract.Data.PHOTO_ID,
ContactsContract.Data.DISPLAY_NAME,
ContactsContract.Data.ACCOUNT_TYPE_AND_DATA_SET,
ContactsContract.CommonDataKinds.Email.DATA,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.LABEL,
ContactsContract.Contacts.Data.MIMETYPE,
ContactsContract.RawContacts.ACCOUNT_NAME,
ContactsContract.CommonDataKinds.Phone.IS_PRIMARY,
ContactsContract.Data.CONTACT_LAST_UPDATED_TIMESTAMP,
ContactsContract.RawContacts.SOURCE_ID
)
return AppProvider.get().context.contentResolver.query(
ContactsContract.Data.CONTENT_URI,
selection, null, null,
ContactsContract.Data.CONTACT_ID + " ASC" + if (offset != null && count != null) " limit $count offset $offset" else "")
}