Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get image contact in address book on iOS

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!

like image 594
lightless07 Avatar asked May 24 '13 17:05

lightless07


People also ask

Why do some of my Contacts have pictures iPhone?

If you've got a contact photo set in Google+ or the like, it'll pull that photo automatically, so that's the photo which'll appear to others.

Can Contacts see their contact photo iPhone?

Answer: A: No they can't. Those photos are for your device only. They can't see them.


2 Answers

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;
}
like image 42
Dilip Avatar answered Oct 22 '22 10:10

Dilip


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]

like image 159
Justin Meiners Avatar answered Oct 22 '22 10:10

Justin Meiners