Android从data.Email查询获取联系人照片

时间:2011-03-16 21:56:01

标签: android email contacts photo

我正在创建一个自动填充字段,按展示名称和电子邮件查询联系人。当有人在过滤后点击所需的联系人时,将该联系人添加到包含其电子邮件的列表中,如果他有任何联系人,则显示名称和图片。

所以到目前为止我已经设法做了所有事情,除了让照片出现。以下是我运行查询以获取电子邮件,显示名称,ID和照片ID的方法。

    return mContent.query(Email.CONTENT_URI,
              PROJECTION, filter, null, null);

投影是:

 PROJECTION = new String[] {ContactsContract.Contacts._ID,
              ContactsContract.Contacts.DISPLAY_NAME,
              ContactsContract.Contacts.PHOTO_ID,
                Email.DATA
            };

这个做我需要的并返回所有数据。但是我在调​​试此问题时注意到的一件事是联系人ID与例如针对特定显示名称对ContactsContract.Contacts.CONTENT_URI运行查询的情况不同。

例如我运行的测试通过运行Contacts.CONTENT_URI来获取所有联系人。我给了一个图像联系人,ID为152.但是对Email.CONTENT_URI的查询给了我一个452的id同一联系人(具有相同的显示名称和电子邮件地址)。因此,当我试图获取包含Id 452的内容uri的照片时,它返回该照片不存在,但如果我尝试获取152的照片它完美地工作。

导致此问题的原因是什么?我如何获得正确的用户名?是否有任何关系查询,我可以运行以获取联系人ID,或者可能是在这个问题的帮助下获得它的正确方法。

谢谢。

修改

我发现这是在挖掘旧代码。可能对任何人都有帮助。

完整的查询:

String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID,
            Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID };

                String order = " CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME
                        + " NOT LIKE '%@%' THEN 1" + " ELSE 2 END, "
                        + ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE";
                String filter = Email.DATA + " NOT LIKE '' ) GROUP BY ( " + Email.DATA;

然后它的

getContentResolver().query( Email.CONTENT_URI, PROJECTION, filter, null, order);

4 个答案:

答案 0 :(得分:6)

如果要访问联系人的照片,则需要指定联系人照片URI,例如使用此方法:

public Uri getContactPhotoUri(long contactId) {
    Uri photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
    photoUri = Uri.withAppendedPath(photoUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    return photoUri;
}

但对于contactId,你必须使用:

String id = ContactsContract.CommonDataKinds.Photo.CONTACT_ID;
long contactId = Long.parseLong(id);

请注意,常见错误是使用ContactsContract.Contacts._ID代替ContactsContract.CommonDataKinds.Photo.CONTACT_ID

我希望能帮助你。

答案 1 :(得分:1)

您应该在查询中使用RAW_CONTACT_ID。例如,可以有两个不同的联系人,即单个CONTACT_ID的RAW_CONTACT_ID不同。

答案 2 :(得分:1)

也许您可以在示例中查看此博客帖子,他们会查询所有联系人,电子邮件地址和联系人照片 http://blog.app-solut.com/2011/03/working-with-the-contactscontract-to-query-contacts-in-android/

答案 3 :(得分:1)

最佳代码将是

Uri photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Id);

    Bitmap photoBitmap;
    ContentResolver cr = getContentResolver();
    InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(cr, photoUri);

    photoBitmap = BitmapFactory.decodeStream(is);

适用于所有