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)
}
}
}
我已经更新了我的问题,请检查,我已经更改了方法,因为顶部菜单
不是官方的,新方法是给我名字,但不允许我选择多个联系人