Вопрос по ios – iOS не может получить изображение человека

4

У меня есть два tableViewControllers. У первого есть список контактов. Другой показывает подробную информацию о человеке.

Кусок кода первого 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]];
    ...
}

Кусок кода второй таблицы ViewController

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

Переменная isHasImage всегда ложна, даже если у контакта есть аватар. Я даже проверил это на первом tableViewController и если у человека есть аватар, то он возвращает true и изображение.

Кто-нибудь знает, почему я не могу получить изображение контактов?

постскриптумcontactClass.manID это типid, У него правильный адрес, потому чтоABMultiValueRef multiValue = ABRecordCopyValue((__bridge ABRecordRef)contactClass.manID, kABPersonPhoneProperty); возвращает правильное значение во второй tableViewController

Ваш Ответ

2   ответа
10

но, возможно, это поможет другим, которые застряли с той же проблемой. ПохожеABPersonHasImageData() а такжеABPersonCopyImageDataWithFormat() не работают должным образом наABRecordRef копии (например,ABContactRef из массива, полученного с помощьюABAddressBookCopyArrayOfAllPeople()), как минимум на 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));
          }
    }
Error: User Rate Limit Exceeded

Похожие вопросы