【问题标题】:retrieve contact's nickname检索联系人的昵称
【发布时间】:2011-03-04 11:18:53
【问题描述】:

我想从通讯录中获取联系人的昵称。我从他的电话号码开始,查询它并希望得到昵称(又名别名)。

Cursor cur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.NUMBER + " = " + incomingNumber, null, null);

        if (cur.moveToFirst()) {
            Log.e("saymyname", cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME)));
            Log.e("saymyname", cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.LABEL)));
        }

日志的输出是incomingNumber(第一个Log.e())和null(第二个Log.e()),但我想获取联系人的昵称!

谢谢 汤姆

【问题讨论】:

    标签: android contacts


    【解决方案1】:

    昵称与电话号码在不同的表中,您必须查询ContactsContract.Data.CONTENT_URI

    检查我对此question的回答

    【讨论】:

      【解决方案2】:

      answer from Pentium10 非常有帮助!谢谢!

      如果有人需要示例,请查看以下代码:

      public String accessContact(String incomingNumber) {
              if (incomingNumber == null || "".equals(incomingNumber)) {
                  return "unknown";
              }
      
              try {
                  Cursor cur = context.getContentResolver().query(Phone.CONTENT_URI, new String[] {Phone.DISPLAY_NAME, Phone.TYPE, Phone.CONTACT_ID}, Phone.NUMBER + " = " + incomingNumber, null, null);
      
                  int nameIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                  int typeIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
                  int idIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
      
                  String name;
                  String type;
                  String id;
      
                  if (cur.moveToFirst()) {
                      name = cur.getString(nameIndex);
                      type = cur.getString(typeIndex);
                      id = cur.getString(idIndex);
                  } else {
                      return "unknown";
                  }
      
                  cur = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] {ContactsContract.Data.DATA1}, ContactsContract.Data.CONTACT_ID + " = " + id, null, null);
      
                  int nicknameIndex = cur.getColumnIndex(ContactsContract.Data.DATA1);
                  String nickname;
      
                  if (cur.moveToFirst()) {
                      nickname = cur.getString(nicknameIndex);
                      if (nickname.equals(incomingNumber)) {
                          return name;
                      }
                      return nickname;
                  } else {
                      return name;
                  }
              } catch (Exception e) {
                  e.printStackTrace();
                  return "unknown";
              }
      

      【讨论】:

        【解决方案3】:

        (我没有必要的声誉来发表评论,所以我必须添加答案)

        TomTasche's answer 具有误导性,这让我浪费了很多时间试图弄清楚为什么我无法为我知道的联系人获得正确的昵称。

        我自己找到了答案,但得到了this post 的确认,我现在做得很好。

        基本上当您阅读ContactsContract.Data 文档时:

        数据表的每一行通常用于存储单条联系信息(例如电话号码)及其相关元数据(例如是工作号码还是家庭号码) .

        这解释了 TomTasche 代码的阴暗部分:

        if (nickname.equals(incomingNumber)) {
                        return name;
                    }
        

        由于仅使用 CONTACT_ID 进行搜索可以返回多行(每种信息类型一个),因此不能保证第一行包含昵称。当有昵称时,它将在 DATA1 中,但在 DATA1 中也可以找到 phone number

        @ 987654325文档中的示例部分@使其清除必须根据其MIME_TYPE选择行,只有在选择MIME_TYPE时,我们可以开始在行本身中的内容感。

        因此,正确的查询应该是:

        cursor =  getContentResolver().query(
                        ContactsContract.Data.CONTENT_URI,
                        new String[]{Nickname.NAME},
                        ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + "= ?",
                        new String[]{contactID, Nickname.CONTENT_ITEM_TYPE},
                        null);
        

        (其中昵称是ContactsContract.CommonDataKinds.Nickname

        我觉得我必须就这个话题说点什么,以防止其他人像我基于这个唯一的话题(我在 Google 朋友那里找到的第一个话题)那样浪费时间。

        【讨论】:

        • 可能是联系人数据库发生了变化,或者我当时错了(这个答案真的很老了)。无论如何,感谢您发布更好的解决方案!
        • 没问题。无论如何,知识是一个渐进的过程,所以我很高兴我能更新你的答案。感谢您首先发布它:p
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多