Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除Android联系人应用程序中的重复条目,该应用程序在通过编程方式添加新联系人时会被添加?_Android_Kotlin_Android Contentprovider_Android Contacts - Fatal编程技术网

如何删除Android联系人应用程序中的重复条目,该应用程序在通过编程方式添加新联系人时会被添加?

如何删除Android联系人应用程序中的重复条目,该应用程序在通过编程方式添加新联系人时会被添加?,android,kotlin,android-contentprovider,android-contacts,Android,Kotlin,Android Contentprovider,Android Contacts,我有一个应用程序,使用下面的代码在通讯录中插入/更新联系人,该代码有效,但我面临的问题是,如果有类似联系人使用相同的电话号码,例如WhatsApp、dou、Viber等。联系人然后这些应用程序联系人接管我的联系人显示名称并合并在一起,但由于此,我们在android的某些版本中有多个重复条目,如(三星、LG、MI A5股票android)等 但在一些手机上工作,如MI Max和其他一些手机,是否有人对此问题有解决方案,或者是否有我遗漏了一些需要显示的字段,以避免重复联系人 private fun

我有一个应用程序,使用下面的代码在通讯录中插入/更新联系人,该代码有效,但我面临的问题是,如果有类似联系人使用相同的电话号码,例如WhatsApp、dou、Viber等。联系人然后这些应用程序联系人接管我的联系人显示名称并合并在一起,但由于此,我们在android的某些版本中有多个重复条目,如(三星、LG、MI A5股票android)等

但在一些手机上工作,如MI Max和其他一些手机,是否有人对此问题有解决方案,或者是否有我遗漏了一些需要显示的字段,以避免重复联系人

private fun insertContact(contact:contact):布尔值{
试一试{
val operations=ArrayList()
ContentProviderOperation.newInsert(RawContacts.CONTENT\u URI)。应用{
withValue(RawContacts.ACCOUNT\u名称,“abcd@gmail.com")
withValue(rawscontacts.ACCOUNT_类型,“google.com”)
添加(build())
}
ContentProviderOperation.newInsert(Data.CONTENT\u URI).apply{
withValueBackReference(Data.RAW\u CONTACT\u ID,0)
withValue(Data.MIMETYPE、StructuredName.CONTENT\u ITEM\u TYPE)
withValue(StructuredName.GIVEN_NAME,contact.firstName)
withValue(StructuredName.FAMILY\u NAME,contact.lastName)
withValue(StructuredName.SUFFIX,“AppName”)
添加(build())
}
addUpdatePhone(操作、联系人、电话号码)
//其他领域的类似功能电子邮件,地址,生日,个人资料等
val results=context.contentResolver.applyBatch(ContactsContract.AUTHORITY,operations)
返回真值
}捕获(e:例外){
LOG.e(“插入联系人时出错”)
返回错误
}
}
private fun updateContact(联系人:contact,rawContactId:String):布尔值{
试一试{
val operations=ArrayList()
ContentProviderOperation.newUpdate(Data.CONTENT\u URI).apply{
val selection=“${Data.RAW_CONTACT_ID}=”和${Data.MIMETYPE}=?”
val selectionArgs=arrayOf(原始联系人ID、结构名称、内容项目类型)
带选择(选择,选择G)
withValue(StructuredName.GIVEN_NAME,contact.firstName)
withValue(StructuredName.FAMILY\u NAME,contact.lastName)
withValue(StructuredName.SUFFIX,“AppName”)
添加(build())
}
addUpdatePhone(操作,contact.phoneNumber,true,rawContactId)
//其他领域的类似功能电子邮件,地址,生日,个人资料等
context.contentResolver.applyBatch(ContactsContract.AUTHORITY,operations)
返回真值
}捕获(e:例外){
LOG.e(“更新联系人时出错”)
返回错误
}
}
private fun addUpdatePhone(操作:ArrayList,电话号码:List,isUpdate:Boolean=false,rawContactId:String=“”){
如果(isUpdate){
//删除具有给定原始联系人id的旧数据
ContentProviderOperation.newDelete(Data.CONTENT\u URI).apply{
val selection=“${Data.RAW_CONTACT_ID}=”和${Data.MIMETYPE}=?”
val selectionArgs=arrayOf(原始联系人ID、电话.内容\项目\类型)
带选择(选择,选择G)
添加(build())
}
}
电话号码{
//为给定的原始联系人id添加新的电话号码行
ContentProviderOperation.newInsert(Data.CONTENT\u URI).apply{
如果(isUpdate){
withValue(Data.RAW\u CONTACT\u ID,RAW CONTACT ID)
}否则{
withValueBackReference(Data.RAW\u CONTACT\u ID,0)
}
withValue(Data.MIMETYPE、Phone.CONTENT\u ITEM\u TYPE)
withValue(Phone.TYPE,it.TYPE)
withValue(Phone.LABEL、it.LABEL)
withValue(Phone.NUMBER,it.value)
withValue(Phone.NORMALIZED_NUMBER,it.value.normalizeEnumber())
添加(build())
}
}
}
//其他字段的类似功能如上所述
private fun OtherUpdateFunasOver(){}

添加新联系人后,Android需要决定这是一个全新的联系人还是已经存在一个代表同一个人的联系人

,它会随着不同的操作系统版本而改变和发展,三星等制造商可能会对其进行调整,但它通常会寻找与其他产品(如手机或电子邮件)非常相似的名称,这些产品要么相同,要么非常接近

在这种情况下,它将使用
RawContact聚合
合并两个联系人。 应用程序可以控制此过程,通过此过程,应用程序可以声明“保持这两个RawContacts分离”或“保持这两个RawContacts合并”,而不考虑该算法

所以你解释的是正常的行为,你原来的名字应该仍然保留在联系人中

无论如何,我不建议尝试使用ID+名称查找RawContact(即在您的选择子句中),相反,您应该只使用RawContact ID。 如果你找不到RawContact ID,这并不意味着你应该创建一个新的,而是使用你需要存储在应用程序中的RawContact,并从中获取一个可能的新ID