如何从地址簿编辑ABPersonSetImageData

时间:2013-04-19 05:37:58

标签: iphone ios objective-c abaddressbook

我正在开发一个与AddressBook联系人配合使用的iPhone应用程序。我正在尝试从地址簿中获取图像并进行编辑,然后保存该图像。

但我不知道如何更新和保存该图像。如果有人知道,请给我一个解决方案。

提前完成。

这是.h文件

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

.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;
}

这里从上面的方法中获取图像和名称然后我打开图库并选择图像然后单击下面的方法按钮但图像未保存或更新在地址簿中

-(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);

}

2 个答案:

答案 0 :(得分:3)

此链接提示我如何更新您的图片..

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

在.h文件中声明1个对象

NSInteger recordID;

然后打开联系人列表并获取我们使用此方法的联系人

- (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;
}

然后编写保存详细信息或更新详细信息的操作

-(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);
}

确定你会得到结果..

答案 1 :(得分:2)

要更新时使用ABRecordRef person

首先create ABAddressBookRef

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

现在check personimage

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

 ABAddressBookSave(addressBookRef, nil);