Get image contact in address book on iOS

爱⌒轻易说出口 提交于 2019-12-05 14:54:04

问题


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!


回答1:


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]




回答2:


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


来源:https://stackoverflow.com/questions/16740924/get-image-contact-in-address-book-on-ios

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!