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

Android 如何从联系人列表中获取姓名,android,android-permissions,android-contacts,Android,Android Permissions,Android Contacts,我可以从联系人列表中获取用户电话号码,但我还需要带有号码的姓名 我知道如果我使用自定义适配器,那么我可以同时获得姓名和号码,但我想使用默认的联系人选择器 这是我的密码 private fun launchMultiplePhonePicker() { val phonebookIntent = Intent("intent.action.INTERACTION_TOPMENU") phonebookIntent.putExtra("additional", "phone-mult

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

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

这是我的密码

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\u TOPMENU
可能无法在所有设备上运行,因此我采用了以下方法,即给我带号码的姓名,但不允许我选择多个联系人

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

如果您有一个电话号码列表,并且需要获取显示名称,您可以使用,类似以下内容:

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,可能并非所有设备都支持


编辑:对于多个联系人,没有正式的使用电话选择器的方法,要么你实现自己的联系人列表,让用户在你的应用程序中选择多个联系人,要么你可以允许用户多次选择联系人,直到联系人完成。

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

用于保存提取值的数据类:

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)
                }

            }
        }
val result=arrayListOf()
val cursor.context.contentResolver.query(ContactsContract.commondatatypes.Phone.CONTENT\u URI,null,null,null,ContactsContract.Contacts.SORT\u KEY\u PRIMARY+“ASC”)
光标?,让我来{
val nameIndex=it.getColumnIndex(ContactsContract.CommonDataTypes.Phone.DISPLAY\u NAME)
val phoneIndex=it.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER)
while(it.moveToNext()){
val name=cursor.getString(nameIndex)
val phone=cursor.getString(phoneIndex)
var num=电话
.替换(“,”)
.替换(“-”,“”)
.替换(“(”,“”)
.替换(“)”,“”)
val contactModel=contactModel(num,name)
//防止某些设备上出现重复触点
如果(it.position!=0){
if(contactModel!=result[result.size-1]){
结果.添加(contactModel)
}
}否则{
结果.添加(contactModel)
}
}
}

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