使用此实现获取联系人姓名

时间:2012-11-13 20:37:44

标签: android android-contacts

我正在尝试使用此问题帖子中找到的代码的实现:How to read contacts on Android 2.0但我无法弄清楚如何通过给定,系列或显示名称列运行它。我怎样才能获得这个实现(链接问题中的大实现),以便在遍历每一行时给出联系人的给定和显示名称?我想特别使用这个实现,因为它循环遍历每一行中的指定列,并按照它在行中的顺序返回信息。

以下是我所指的其他问题的实现:\

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 

while (cursor.moveToNext()) { 

   String contactId = cursor.getString(cursor.getColumnIndex( 
   ContactsContract.Contacts._ID)); 

   String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

   if (Boolean.parseBoolean(hasPhone)) { 
      // You know it has a number so now query it like this
      Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null); 

while (phones.moveToNext()) { 
     String phoneNumber = phones.getString(phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));                 
  } 
  phones.close(); 
   }

   Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null); 

   while (emails.moveToNext()) { 
      // This would allow you get several email addresses 
      String emailAddress = emails.getString( 
      emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

   } 

   emails.close();
}

cursor.close(); 

1 个答案:

答案 0 :(得分:1)

首先,链接帖子中的答案有点过时,因为现在有一些关于developer.android.com上的Contacts Provider的文档。

其次,您遇到的问题是您正在使用联系人表的联系人ID查询“数据”表,但这不起作用。

“联系人提供者”是表格的三层排列。顶级是Contacts表,其常量在ContactsContract.Contacts中定义。其中一个专栏是 ContactsContract.Contacts._ID,用于标识联系人行。但是,此表中的一行是来自各种来源的各个联系人的聚合

各个联系人存储在ContactsContract.RawContacts中。对于每个ContactsContract.Contacts._ID,ContactsContract.RawContacts中可以有多行。

对于ContactsContract.RawContacts中的每一行,ContactsContract.Data中都有一行或多行。每一行都有一个MIME类型,告诉你它是什么类型的数据。例如,ContactsContract.RawContacts中的一行可以在ContactsContract.Data中具有三行,这些行具有电话号码的MIME类型。三个“数据”行中的每一行都是ContactsContract.RawContacts中联系人的不同类型的电话号码(家庭,移动,工作)。

您可以看到为什么在ContactsContract.Data中查找ContactsContract.Contacts._ID将无效;这是错误的ID。

我建议你不要在这里重新编写文档。它有一些很好的插图,可以帮助解释我所得到的: Contacts Provider