Установка изображения адресной книги для контакта, похоже, не работает
-
21-09-2019 - |
Вопрос
Я пытаюсь установить изображение контакта с помощью приведенного ниже кода.Я не вижу никаких ошибок, и изображение не сохраняется в записи контакта в адресной книге.Пожалуйста помоги!Должно быть, я делаю что-то не так...
- (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?
Решение
Касательно Я не уверен, почему объект ошибки регистрируется как объект ABPeoplePickerNavigationController? -- потому что вы неправильно инициализируете error
здесь:
CFErrorRef error;
Назначать nil
здесь, или оно будет иметь случайное (точнее, некоторую предыдущую память) значение, случайно указывающее на ABPeoplePickerNavigationController
объект.
Что касается достоинств:ты уверен, что это ссылка на person
Вы перешли к своему методу, который действителен в контексте адресной книги?Я бы попробовал использовать такую функцию, как ABAddressBookGetPersonWithRecordID
во-первых, вместо прохождения ABPersonRef
и ожидаем, что они будут действительны для различных ссылок в адресной книге.
Другие советы
Весь этот ответ не сработал. Вы должны просто изменить свою строку кода с:
ABAddressBookRef addressBook = ABAddressBookCreate();
к:
ABAddressBookRef addressBook = [peoplePicker addressBook];
Таким образом, вы получаете ссылку на «адресную книгу», «человек» принадлежит.
Я также постараюсь использовать для установки изображения (фото) текущего выбранного человека, но он отображает массаж для успешного сохранения, но в реальной дозе не работает !!!
После выкапывания кода и документов, предоставленных 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;
}
Я проверил ваш код, и он не работает так, как должно. Итак, я сделал 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);
Теперь это работает так, как предполагалось.