【问题标题】:Get RawContactId of specific Contact based off PhoneLookup根据 PhoneLookup 获取特定联系人的 RawContactId
【发布时间】:2012-01-26 00:01:40
【问题描述】:

我希望使用PhoneLookup 甚至只是联系人查找键来获取特定ContactRAW_CONTACT_ID

我知道联系人表有一个列 name_raw_contact_id 引用了 raw_contacts._id 列,但在使用联系人查找键查询 ContactsContract.Contacts.CONTENT_LOOKUP_URI 时似乎没有返回。

我的手机查询查询是:

String[] projection = new String[] { 
    PhoneLookup.DISPLAY_NAME, PhoneLookup.LOOKUP_KEY };
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
Cursor c = resolver.query(uri, projection, null, null, null);

然后我根据查找键查找Contact

String[] contactProjection = new String[] { 
    ContactsContract.Contacts.NAME_RAW_CONTACT_ID 
};
Uri contactUri = Uri.withAppendedPath(
    ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
Cursor contactCursor = resolver.query(contactUri, 
    contactProjection, null, null, null);

但是,这不会编译,我得到了

cannot find symbol: variable NAME_RAW_CONTACT_ID 
location: class android.provider.ContactsContract.Contacts

android documentationNAME_RAW_CONTACT_ID 显示为一列。

有什么方法可以让我根据电话号码或查找键获得RAW_CONTACT_ID

【问题讨论】:

  • 在我见过的其他例子中,number 必须被编码。例如。 Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));。为什么你的例子中没有?
  • 当时(在 ICS 之前),不需要它,而且谷歌文档在他们的示例中没有它(我记得)。我从来没有遇到过任何问题。也许他们已经在 ICS 中对其进行了更新,以获取编码电话。 Google 在这方面的文档现在也有 Uri.encode(phoneNumber),所以我会更新我的问题。

标签: android android-contacts


【解决方案1】:

我发现答案是做第三个查询:

long rawContactId = -1;
Cursor c = getContentResolver().query(RawContacts.CONTENT_URI,
    new String[]{RawContacts._ID},
    RawContacts.CONTACT_ID + "=?",
    new String[]{String.valueOf(contactId)}, null);
try {
    if (c.moveToFirst()) {
        rawContactId = c.getLong(0);
    }
} finally {
    c.close();
}

但需要注意的是,每个联系人可以有多个 RawContact,上面的查询将获得与contactId 关联的所有 RawContact

【讨论】:

    【解决方案2】:

    ContactsContract.Contacts.NAME_RAW_CONTACT_ID 列需要 API 级别 21 或更高,因此请确保您使用此版本进行编译。
    您还可以在第一个查询中使用 ContactsContract.PhoneLookup._ID 列来获取 Contact_Id,然后使用此 Contact_Id 在您的第三个查询中,因此您的问题将在 2 个查询而不是 3 个查询中得到解决。

    【讨论】:

      【解决方案3】:
      private HashSet<Long> getRawContactIdsForContact(long contactId)
      {
          HashSet<Long> ids = new HashSet<Long>();
      
          Cursor cursor = context.getContentResolver().query(RawContacts.CONTENT_URI,
                    new String[]{RawContacts._ID},
                    RawContacts.CONTACT_ID + "=?",
                    new String[]{String.valueOf(contactId)}, null);
      
          if (cursor != null && cursor.moveToFirst())
          {
              do
              {
                  ids.add(cursor.getLong(0));
              } while (cursor.moveToNext());
              cursor.close();
          }
      
          return ids;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多