Get image contact in address book on iOS
Asked Answered
T

2

12

I'm new using the Address book and I would try to get some info for the contacts in the phone. Is possible get the image contact of all the contacts? This will be for iOS4 or higher.

Thanks in advance!

Thanet answered 24/5, 2013 at 17:56 Comment(0)
C
15

Yes it is completely possible, you simply ask each person record whether it has an image:

See the documentation: http://developer.apple.com/library/ios/#documentation/AddressBook/Reference/ABPersonRef_iPhoneOS/Reference/reference.html#//apple_ref/doc/uid/TP40007210

Relevant Functions:

ABPersonHasImageData(person)
ABPersonCopyImageDataWithFormat(person)

The ABPersonCopyImageDataWithFormat returns a CFDataRef. Convert it to NSData with this (ARC) NSData* data = (__bridge_transfer NSData*) cfData;

An image can then be created with [UIImage imageWithData:data]

Cedell answered 24/5, 2013 at 18:8 Comment(1)
Thanks for your answer! It will help me a lot!Thanet
R
8

This is really nice code that i found to select all the contact inaformation and maybe helpfull to future user..

add AddressBookUI and AddressBook framework in project

Than in .h file

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

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

- (IBAction)getCaontactDetail:(id)sender;

@end

And in .m file

 - (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;
}
Ramiform answered 4/10, 2013 at 7:31 Comment(1)
The inclusion of the < 4.1 code causes a warning in XCode 6.1 as 4.1 isn't supported anymore anyway. This is the correct answer though, as it actually provides a code exampleTriggerfish

© 2022 - 2024 — McMap. All rights reserved.