Постоянный контактный идентификатор - PullRequest
0 голосов
/ 25 февраля 2019

Я знаю, что на некоторых телефонах идентификаторы контактов меняются даже при перезагрузке, но я не могу воспроизвести это на своем телефоне.Но я могу воспроизвести следующий случай и хотел бы знать, можно ли хотя бы решить этот случай:

  • установить 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 "")
}

1 Ответ

0 голосов
/ 26 февраля 2019

LOOKUP_KEY - ваш друг.

LOOKUP_KEY

Непрозрачное значение, содержащее подсказки о том, как найти контакт, если его идентификатор строки изменился в результате синхронизации илиагрегация.

Так что это не стабильный идентификатор сам по себе, но он помогает БД ContactsContract выяснить новый contactID в случае его изменения.

Вы должны использовать пара из <CONTACT_ID, LOOKUP_KEY>, чтобы отслеживать контакты.При обычном использовании используйте значение CONTACT_ID, но если в вашем коде появляется подсказка, что CONTACT_ID изменилось (отсутствует или указано имя контакта), вы можете использовать от LOOKUP_KEY до find новый идентификатор контакта.

Вы можете использовать Contacts.getLookupUri (long, String) , чтобы получить URI, который вы всегда можете использовать для быстрого поиска контакта, независимо от его CONTACT_ID илиLOOKUP_KEY фактические значения.

...