2011-06-27 81 views
3

Gah,另一种应该很简单的方案证明是非常耗时和痛苦的。提取联系人的照片

我使用这个查询的联系人提供商:

private Cursor getContacts(){ 
Uri uri = ContactsContract.Contacts.CONTENT_URI; 
String[] projection = new String[] { 
    ContactsContract.Contacts._ID, 
    ContactsContract.Contacts.DISPLAY_NAME, 
      ContactsContract.Contacts.PHOTO_ID 
    }; 
    ...... 
    return managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
} 

这工作得很好,并检索联系人姓名,并在接触了一把它显示了PHOTO_ID领域的数字ID,我以为是我要求的PHOTO_ID。但是随后我将该ID推入此方法中以提取位图,它在每次接触时都失败,并且每次都为空。我正在测试一组包含Android联系人照片的联系人(我知道从Facebook联系人中提取照片时存在一些问题)。

private Bitmap loadContactPhoto(long id) { 
    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id); 
    InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, uri); 
    if (input == null) return null; 
    Bitmap bitmap = BitmapFactory.decodeStream(input); 
    return bitmap; 
} 

我错过了什么?

回答

2

openContactPhotoInputStream()获取联系人的URI,尝试使用ContactsContract.Contacts._ID列而不是PHOTO_ID列调用它,并且应该会看到更好的结果。

有一堆这里的相关讨论的一些代码来看看:

How do I load a contact Photo?

注意,在某些情况下,你会看到在本机通讯录应用程序,它不会通过加载照片内容解析器。某些同步信息(例如Facebook)会被标记为仅供联系人应用程序本身使用,并且不会导出至其他应用程序:-(

但是,使用contactUri至少应处理一些问题。

+0

谢谢!你救了我的一天!但有没有人kbow如何从例如facebook同步提取? - 我知道它的高度讨论 – bricklore