Cómo editar un ABPersonSetImageData desde la libreta de direcciones

Estoy trabajando en una aplicación de iPhone que funciona con los contactos de la libreta de direcciones. Estoy intentando search la image de la libreta de direcciones y editarla y savela.

Pero no sé cómo actualizar y save esa image. Por favor dame una solución si alguien sabe sobre esto.

Gracias por adelantado.

Aquí está el file .h

ABAddressBookRef addressBook; IBOutlet UILabel *lblName; IBOutlet UIImageView *imgGet; UIImage *imgContact; NSString* name; 

El file .m

 - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { name = [(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) autorelease]; lblName.text = name; if(ABPersonHasImageData(person)) { CFDataRef imageData = ABPersonCopyImageData(person); imgContact = [UIImage imageWithData:(NSData *)imageData]; imgGet.image = imgContact; CFRelease(imageData); } else { imgGet.image = [UIImage imageNamed:@"ABPicturePerson@2x.png"]; } [self.navigationController dismissViewControllerAnimated:(YES) completion:nil]; return NO; } 

Aquí, después de search la image y el nombre del método anterior, abro la galería y selecciono una image, luego hago clic en el button de método a continuación, pero la image no se guarda ni actualiza en la libreta de direcciones

 -(IBAction)btnSaveClicked { ABRecordRef person = ABPersonCreate(); NSData *dataRef = UIImagePNGRepresentation(imgGet.image); CFDataRef cfdata = CFDataCreate(NULL, [dataRef bytes], [dataRef length]); ABPersonSetImageData(person, (CFDataRef)dataRef, nil); CFErrorRef error; ABPersonRemoveImageData(person, &error); // <-- clean any image first from ref //ABAddressBookSave(addressBook, &error); ABPersonSetImageData(person, cfdata, &error); ABAddressBookSave(addressBook, &error); CFRelease(cfdata); 

}

Este enlace me sugiere que actualizar su image ..

http://davidbits.blogspot.in/2010/01/iphone-update-addressbook-contact.html

declarar 1 object en el file .h

 NSInteger recordID; 

luego abra la list de contactos y para search el contacto usamos este método

 - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { recordID = ABRecordGetRecordID(person); name = [(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) autorelease]; lblName.text = name; if(ABPersonHasImageData(person)) { CFDataRef imageData = ABPersonCopyImageData(person); your uiimage = [UIImage imageWithData:(NSData *)imageData]; you uiimageview.image = your uiimage; CFRelease(imageData); } else { you uiimageview.image = [UIImage imageNamed:@"ABPicturePerson@2x.png"]; } [self.navigationController dismissViewControllerAnimated:(YES) completion:nil]; //[self.navigationController dismissModalViewControllerAnimated:YES]; return NO; } 

luego escribe acciones para save detalles o actualizar detalles

 -(IBAction)btnSaveClicked { CFErrorRef *aberror = NULL; ABRecordRef aRecord = ABAddressBookGetPersonWithRecordID(addressBook, recordID); if (aRecord) { NSData *dataRef = UIImagePNGRepresentation(your uiimage); ABPersonSetImageData(aRecord, (CFDataRef)dataRef, nil); } ABAddressBookSave(addressBook, aberror); //BOOL didAdd = ABAddressBookSave(addressBook, nil); CFRelease(addressBook); } 

seguro que obtendrás el resultado …

Use la ABRecordRef person cuando desee actualizar:

Primero create ABAddressBookRef :

 // Request authorization to Address Book ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); 

Ahora check person tiene image :

 if(ABPersonHasImageData(person)) { //remove image as we want to update to new image NSError *anError; if(ABPersonRemoveImageData(person, &anError)) NSLog(@"removed"); else NSLog(@"%@",[anError description]); } 

Update

  UIImage *image = image here; NSData *picData = UIImageJPEGRepresentation(image, 0.9f); ABPersonSetImageData(person, (CFDataRef)picData, nil); 

saving function llamada:

  ABAddressBookSave(addressBookRef, nil);