0

我正在尝试使用在这个问题帖子中找到的代码的实现:如何在 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(); 
4

1 回答 1

1

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

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

Contacts Provider 是一个三层排列的表格。顶层是 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

于 2012-11-13T21:13:25.313 回答