在iOS上的地址簿中获取图像联系人

时间:2013-05-24 17:56:27

标签: ios addressbook

我是新用的地址簿,我会尝试获取手机中联系人的一些信息。是否可以获得所有联系人的图像联系?这适用于iOS4或更高版本。

提前致谢!

2 个答案:

答案 0 :(得分:15)

是的,完全有可能,你只需要让每个人记录它是否有图像:

参见文档: http://developer.apple.com/library/ios/#documentation/AddressBook/Reference/ABPersonRef_iPhoneOS/Reference/reference.html#//apple_ref/doc/uid/TP40007210

相关职能:

ABPersonHasImageData(person)
ABPersonCopyImageDataWithFormat(person)

ABPersonCopyImageDataWithFormat返回CFDataRef。 使用此(ARC)NSData* data = (__bridge_transfer NSData*) cfData;

将其转换为NSData

然后可以使用[UIImage imageWithData:data]

创建图像

答案 1 :(得分:8)

这是一个非常好的代码,我发现可以选择所有的联系信息,也许对未来的用户有帮助。

在项目中添加AddressBookUI和AddressBook框架

比.h文件

#import <UIKit/UIKit.h>
#import <AddressBookUI/AddressBookUI.h>

@interface ViewController : UIViewController<ABPeoplePickerNavigationControllerDelegate,UIAlertViewDelegate,UITextFieldDelegate,UINavigationControllerDelegate>
{
    NSString * toEmail;
}

- (IBAction)getCaontactDetail:(id)sender;

@end

在.m文件中

 - (IBAction)getCaontactDetail:(id)sender {
    //open contact book
    ABPeoplePickerNavigationController *addressBookController = [[ABPeoplePickerNavigationController alloc]init];
    addressBookController.peoplePickerDelegate = self;
    addressBookController.delegate = self;

    addressBookController.navigationBar.tintColor = [UIColor redColor];
    addressBookController.searchDisplayController.searchBar.tintColor = [UIColor redColor];
    addressBookController.searchDisplayController.searchBar.backgroundColor = [UIColor blackColor];

    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
        [self presentViewController:addressBookController animated:YES completion:nil];
    } else {
        [self presentModalViewController:addressBookController animated:YES];
    }

    addressBookController = nil;
}

#pragma mark -
#pragma mark ABPeoplePickerNavigationController Delegate Method
// called when address book closed
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
        [peoplePicker dismissViewControllerAnimated:YES completion:nil];
    } else {
        [peoplePicker dismissModalViewControllerAnimated:YES];
    }
}

// called when select any contact from address book
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    //parse all data of selected contact
    ABMultiValueRef addresses = (__bridge ABMultiValueRef)((__bridge NSMutableDictionary *)ABRecordCopyValue(person, kABPersonAddressProperty));
    NSArray *addressesArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(addresses);
    NSDictionary *dictAddress = [addressesArray objectAtIndex:0];

    //get the phone number
    ABMultiValueRef phone = (__bridge ABMultiValueRef)((__bridge NSMutableDictionary *)ABRecordCopyValue(person, kABPersonPhoneProperty));
    NSArray *phoneArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phone);
    NSMutableString *strPhone = [NSMutableString string];

    for (int i=0; i<[phoneArray count]; i++)
    {
        [strPhone appendString:[NSString stringWithFormat:@"%@,",[phoneArray objectAtIndex:i]]];
    }

    //convert in to NSString and NSInteger
    NSInteger  contactId = (NSInteger) ABRecordGetRecordID(person);
    NSString *firstName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty)==nil?@"":(__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString *lastName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)==nil?@"":(__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
    NSString *street = [dictAddress valueForKey:@"Street"]==nil?@"":[dictAddress valueForKey:@"Street"];
    NSString *telephone =  [strPhone stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];
    NSString *city = [dictAddress valueForKey:@"City"]==nil?@"":[dictAddress valueForKey:@"City"];
    NSString *postcode = [dictAddress valueForKey:@"ZIP"]==nil?@"":[dictAddress valueForKey:@"ZIP"];
    NSString *state = [dictAddress valueForKey:@"State"]==nil?@"":[dictAddress valueForKey:@"State"];
    NSString *country = [dictAddress valueForKey:@"CountryCode"]==nil?@"":[dictAddress valueForKey:@"CountryCode"];


    NSString *recipientName = [NSString stringWithFormat:@"%@ %@",firstName,lastName];

    NSLog(@"contactId : %i recipientName : %@ street : %@ telephone : %@ city : %@ postcode : %@ state : %@ country : %@",contactId,recipientName,street,telephone,city,postcode,state,country);

//get the contact image
    UIImage *img ;
    if (person != nil && ABPersonHasImageData(person)) {
        if ( &ABPersonCopyImageDataWithFormat != nil ) {
            // iOS >= 4.1
            img= [UIImage imageWithData:(__bridge NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail)];
        } else {
            // iOS < 4.1
            img= [UIImage imageWithData:(__bridge NSData *)ABPersonCopyImageData(person)];
        }
    } else {
        img= nil;
    }
    contactIV.image = img;
    contactNameLbl.text = [NSString stringWithFormat:@"%@ %@",firstName,lastName];
    contactNumLbl.text = telephone;


    //get email address
    ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
    NSArray *emailArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(emails);

    //display alert if contact does not contain email addreess
    if (emailArray.count == 0) {
        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:nil message:@"The person you selected does not have an email address on file. Please enter their email address below." delegate:self cancelButtonTitle:nil otherButtonTitles:@"Cancel",@"Submit",nil];
        alert.tag = 1;
        alert.alertViewStyle = UIAlertViewStylePlainTextInput;
        UITextField * alertTextField = [alert textFieldAtIndex:0];
        // assert(alertTextField);
        alertTextField.delegate = self;
        alertTextField.keyboardType = UIKeyboardTypeEmailAddress;
        alertTextField.placeholder = @"Enter Email address";
        [alert show];
    }

    contactEmailLbl.text = [emailArray objectAtIndex:0];

    //set all object to nil for memory management
    dictAddress = nil;
    addresses = nil;
    addressesArray = nil;

    phone = nil;
    phoneArray = nil;
    strPhone = nil;

    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
        [peoplePicker dismissViewControllerAnimated:YES completion:nil];
    } else {
        [peoplePicker dismissModalViewControllerAnimated:YES];
    }
    return NO;
}



// called to show detail of contact and user select contact
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
                                property:(ABPropertyID)property
                              identifier:(ABMultiValueIdentifier)identifier
{
    return NO;
}