永久联系人ID

时间:2019-02-25 17:25:33

标签: android android-contacts contactscontract

我知道在某些手机上,即使重新启动,联系人ID也会更改,但是我无法在自己的手机上重现此信息。但是我可以重现以下情况,并想知道这种情况是否至少可以解决:

  • 安装whatsapp-它将联系人添加到ContentProvider
  • ContactProvider中读取联系人=>我得到数据集1
  • 删除whatsapp,重新安装-它将再次将其联系人添加到ContentProvider
  • ContentProvider中读取联系人=>我得到数据集2

结果:

数据集1和数据集2之间,我看不到任何一致的数据。

例如:

ContactsContract.Data.CONTACT_ID =>更改,例如从598679 ContactsContract.Data.LOOKUP_KEY =>也会发生变化,例如3514i2b4948808eec75c9.3789r593-2D374B39.2797r594-2D374B393514i2b4948808eec75c9.2797r603-2D374B39.3789r670-2D374B39 *当然,有些raw ids保持不变,但据我所知,没有完整联系人的通用ID保持不变

我想要的

我需要一个联系人标识符,该标识符可以保存在应用程序的数据库中,并且在进行上述更改后也可以使用。 我需要一个联系人(而不是原始联系人)的标识符,原始联系人可能会在联系人的整个生命周期中发生变化(就像我在上面描述的示例中一样)...

有什么主意可以解决这个问题吗?

代码

出于完整性考虑,以下是我从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 :(得分:0)

LOOKUP_KEY是你的朋友。

  

LOOKUP_KEY

     

一个不透明值,其中包含有关如何查找   如果行号由于同步或聚合而发生变化,请联系。

因此,它本身并不是一个稳定的ID,但可以帮助ContactsContract数据库找出新的contactID,以防其发生更改。

您应该使用<CONTACT_ID, LOOKUP_KEY>来跟踪联系人。 在正常使用中,请使用CONTACT_ID值,但是如果您的代码得到CONTACT_ID更改的提示(丢失或意外的联系人姓名),则可以使用LOOKUP_KEY来< strong>找到新的联系人ID。

您可以使用Contacts.getLookupUri(long, String)获取一个URI,无论它的CONTACT_IDLOOKUP_KEY实际值是多少,都可以使用它来快速查找联系人。