【问题标题】: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)

【问题讨论】:

    标签: android android-permissions android-contacts


    【解决方案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 不是官方的,新方法是给我名字,但不允许我选择多个联系人
      猜你喜欢
      • 2012-10-11
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 2011-09-13
      • 2014-06-21
      相关资源
      最近更新 更多