Настройка изображения адресной книги для контакта не работает - PullRequest
3 голосов
/ 18 января 2010

Я пытаюсь установить изображение контакта с кодом ниже. Я не вижу никаких ошибок, и изображение не сохраняется в записи контактов в адресной книге. Пожалуйста помоги! Должно быть, я что-то не так делаю ...

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
[abcontroller setDisplayedPerson:person];

UIImage *im = [UIImage imageNamed:@"image1.jpg"];
NSData *dataRef = UIImagePNGRepresentation(im);
CFErrorRef error;
ABAddressBookRef addressBook = ABAddressBookCreate(); 

NSLog(@"Error:",error);
    if (ABPersonSetImageData(person, (CFDataRef)dataRef, &error))
    {
        NSLog(@"Set contact photo %@", error);
        if (ABAddressBookHasUnsavedChanges(addressBook))
        {
            NSLog(@"Changes made to address book");
        }
        else {
            NSLog(@"No changes made to address book");
        }

        if (ABAddressBookSave(addressBook, &error))
        {
            NSLog(@"Saved");

        }
        else {
            NSLog(@"Not saved");
        }


    }
    else {
        NSLog(@"Error saving contact photo %@", error);
    }
ABAddressBookSave(addressBook, &error);

[self dismissModalViewControllerAnimated:YES];    

return NO;
}

Вот мой выходной журнал:

2010-01-17 21:58:35.465 Error:
2010-01-17 21:58:35.504 Set contact photo <ABPeoplePickerNavigationController: 0x19e9b0>
2010-01-17 21:58:43.497 No changes made to address book
2010-01-17 21:58:44.724 Saved

Я не уверен, почему объект ошибки регистрируется как объект ABPeoplePickerNavigationController?

Ответы [ 4 ]

5 голосов
/ 07 мая 2011

Все эти ответы не сработали. Вы должны просто изменить строку кода с:

ABAddressBookRef addressBook = ABAddressBookCreate(); 

до:

ABAddressBookRef addressBook = [peoplePicker addressBook];

Таким образом, вы получаете ссылку на «адресную книгу», которой принадлежит «персона».

2 голосов
/ 28 декабря 2011

Я проверил ваш код, и он не работает так, как должен. Итак, я сделал 2 изменения.

ABAddressBookRef libroDirec = [peoplePicker addressBook];//don't create
        ABPersonSetImageData(person, (CFDataRef)UIImagePNGRepresentation(display.image), &cfError);
        ABAddressBookAddRecord(libroDirec, person, &cfError);

        if (ABAddressBookSave(libroDirec, nil)) {
            NSLog(@"\n%s saved successfuly", _cmd);
        } else {
            NSLog(@"\n%s something bad happen while saving", _cmd);
        }
        //CFRelease(libroDirec);

Теперь все работает как положено.

2 голосов
/ 27 февраля 2010

Я также пытался использовать, чтобы установить изображение (Фото) текущего выбранного человека, но он отображает массаж для успешного сохранения, но в действительности он не работает !!!

после извлечения кода и документов, предоставленных Apple SDK, у меня есть кое-что со следующим решением.

Пожалуйста, проверьте код ниже. это действительно хорошо работает для меня и надеюсь, что вы тоже.

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    @try {
        CFErrorRef cfError = nil;

        if (ABPersonHasImageData(person)) {
            NSLog(@"%s has an image", _cmd);

            //theAlert = [[UIAlertView alloc] initWithTitle:@"Contact already has an image" message:@"Are you sure you want to overwrite it?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Overwrite"];
            //[theAlert show];
            //[theAlert release];
            //Note: We do not yet handle the answer to this question
        }

        // Just a sanity check

        if ((nil == [imageView image])
            || (nil == UIImagePNGRepresentation([imageView image]))) {
            NSLog(@"%s NIL STUFF", _cmd);
        }

        // Not sure I even need to create and save an address book
        // Cf. https://devforums.apple.com/message/27512#27512
        ABAddressBookRef libroDirec = ABAddressBookCreate();
        ABPersonSetImageData(person, (CFDataRef) (UIImageJPEGRepresentation([imageView image], 1.0f)), &cfError);
        ABAddressBookAddRecord(libroDirec, person, &cfError);
        if (ABAddressBookSave(libroDirec, nil)) {
            NSLog(@"%s saved successfuly", _cmd);
        } else {
            NSLog(@"%s something bad happen while saving", _cmd);
        }
        CFRelease(libroDirec);
    }
    @catch (NSException * e) {

    }
    @finally {

    }
    // TODO: release peoplePicker (and refactor code to not have it global)
    [self dismissModalViewControllerAnimated:YES];

    return NO;

}
1 голос
/ 18 января 2010

Относительно Я не уверен, почему объект ошибки регистрируется как объект ABPeoplePickerNavigationController? - потому что вы неправильно инициализируете error здесь:

CFErrorRef error;

Присвойте nil здесь, или оно будет иметь случайное (или, точнее, некоторую предыдущую память) значение, случайно указывающее на объект ABPeoplePickerNavigationController.

Относительно достоинств: вы уверены, что ссылка на person Вы перешли на ваш метод, действительный в контексте адресной книги?Сначала я бы попытался использовать такую ​​функцию, как ABAddressBookGetPersonWithRecordID, вместо того, чтобы передавать ABPersonRef s и ожидать, что они будут действительны для разных ссылок адресной книги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...