如何从联系人列表中获取姓名

Posted

技术标签:

【中文标题】如何从联系人列表中获取姓名【英文标题】:How to get name from contacts list 【发布时间】:2020-04-04 12:49:47 【问题描述】:

我可以从联系人列表中获取用户电话号码,但我还需要带有号码的姓名,

我知道如果我使用自定义适配器,那么我可以同时获取姓名和号码,但我想使用默认的联系人选择器。

这是我的代码。

private fun launchMultiplePhonePicker() 
    val phonebookIntent = Intent("intent.action.INTERACTION_TOPMENU")
    phonebookIntent.putExtra("additional", "phone-multi")
    phonebookIntent.putExtra("maxRecipientCount", 20)
    phonebookIntent.putExtra("FromMMS", true)
    startActivityForResult(phonebookIntent, 110)

这确实可以正常工作,但只返回电话号码,而不是 onActivityResult 中的联系人姓名。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 

       val bundle = data?.extras
       val result = bundle?.getString("result")
       val contacts = bundle?.getStringArrayList("result")

编辑: 我发现intent.action.INTERACTION_TOPMENU 可能不适用于所有设备,所以我使用了以下方法,它给了我带有数字的名字,但不允许我选择多个联系人。

val intent = Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI)
    startActivityForResult(intent, 10101)

【问题讨论】:

【参考方案1】:

我获取联系人的简单解决方案,可能会对您有所帮助

保存提取值的数据类:

data class ContactModel(val phoneNumber: String, val displayName: String)

获取联系人并映射到模型

        val result = arrayListOf<ContactModel>()
        val cursor.context.contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, ContactsContract.Contacts.SORT_KEY_PRIMARY + " ASC")

        cursor?.let 
            val nameIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)
            val phoneIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)

            while (it.moveToNext()) 
                val name = cursor.getString(nameIndex)
                val phone = cursor.getString(phoneIndex)
                var num = phone
                        .replace(" ", "")
                        .replace("-", "")
                        .replace("(", "")
                        .replace(")", "")

                val contactModel = ContactModel(num, name)

                //Prevents duplicated contacts on some devices
                if (it.position != 0) 
                    if (contactModel != result[result.size - 1]) 
                        result.add(contactModel)
                    
                 else 
                    result.add(contactModel)
                

            
        

【讨论】:

【参考方案2】:

如果您有电话号码列表并且需要获取显示名称,可以使用ContactsContract.PhoneLookup,如下所示:

private fun phoneToName(phone: String): String? 
    val uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phone))
    var cur = getContentResolver().query(uri, arrayOf(PhoneLookup.DISPLAY_NAME), null, null, null)
    if (cur.moveToFirst()) 
        return cur.getString(0)
    
    cur.close()
    return null

附:请注意,“intent.action.INTERACTION_TOPMENU”不是官方的 android API,可能并非所有设备都支持。

编辑:没有官方方法可以为多个联系人使用电话选择器,要么您实现自己的联系人列表并让用户在您的应用中选择多个联系人,要么您可以允许用户多次选择联系人,直到他们完成。

【讨论】:

我已经更新了我的问题,请检查,我已经更改了方法,因为TOP_MENU 不是官方的,新方法是给我名字,但不允许我选择多个联系人

以上是关于如何从联系人列表中获取姓名的主要内容,如果未能解决你的问题,请参考以下文章

如何从联系人列表中获取电子邮件地址?

获取不在联系人列表中的短信发件人姓名?

如何从listview android中的姓名获取联系方式

Android从联系人列表中获取电话号码

如何从 Android 中的联系人中获取 ContactNumbers 数组的联系人姓名?

从电话联系人中获取姓名、电话号码和电子邮件地址[关闭]