2012-04-15 55 views
4

我有两个tableViewControllers。第一个有一个联系人列表。另一个显示详细的人的信息。iOS无法获取人物图像

的第一tableViewController

ABAddressBookRef addressBook = ABAddressBookCreate(); 
ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook); 
NSArray *allPeople = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source,kABPersonSortByFirstName); 
for (int i = 0; i < [allPeople count]; i++) 
{ 
    ... 
    contactClass = [[ContactClass alloc] initWithName:name surName:surName manID:[allPeople objectAtIndex:i]]; 
    ... 
} 

的第二tableViewController的代码

ABRecordRef person = (__bridge ABRecordRef)contactClass.manID; 
BOOL isHasImage = ABPersonHasImageData(person); 

可变isHasImage甲chunck的代码块是总是假的,即使接触具有的化身。我甚至在第一个tableViewController上检查了这个,如果person有一个头像,那么它会返回true和image。

有谁知道我为什么无法获取联系人图片?

p.s. contactClass.manIDid的类型。它有一个正确的地址,因为ABMultiValueRef multiValue = ABRecordCopyValue((__bridge ABRecordRef)contactClass.manID, kABPersonPhoneProperty);返回正确的值在第二个tableViewController

回答

10

我可能为你太晚了解决方案,但也许这将帮助其他困住相同问题的其他人。 看起来像ABPersonHasImageData()ABPersonCopyImageDataWithFormat()ABRecordRef副本(例如,使用ABAddressBookCopyArrayOfAllPeople()获得的阵列中的ABContactRef)不能如预期的那样工作,在iOS 5.x版本中仍然如此。你可以这样解决:

- (UIImage*)imageForContact: (ABRecordRef)contactRef { 
    UIImage *img = nil; 

    // can't get image from a ABRecordRef copy 
    ABRecordID contactID = ABRecordGetRecordID(contactRef); 
    ABAddressBookRef addressBook = ABAddressBookCreate(); 

    ABRecordRef origContactRef = ABAddressBookGetPersonWithRecordID(addressBook, contactID); 

    if (ABPersonHasImageData(origContactRef)) { 
     NSData *imgData = (NSData*)ABPersonCopyImageDataWithFormat(origContactRef, kABPersonImageFormatOriginalSize); 
     img = [UIImage imageWithData: imgData]; 

     [imgData release]; 
    } 

    CFRelease(addressBook); 

    return img; 
} 
0

对此有何进一步更新?

我收到了一些用户无法看到几个联系人缩略图的投诉。大多数情况下,它工作正常,是否有任何特殊情况下不会返回缩略图。

我使用下面的代码:

- (instancetype)initWithABContact:(ABRecordRef)contact { 
      NSData *iThumbnailData = nil; 
      if (ABPersonHasImageData(contact)) { 
      iThumbnailData = 
      CFBridgingRelease(ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail)); 
      } 
    } 
+0

你认真问了一个问题,答案??? – 2016-03-14 07:41:53