首页 文章

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

提问于
浏览
12

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

提前致谢!

2 回答

  • 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;
    }
    
  • 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 NSData* data = (__bridge_transfer NSData*) cfData;

    然后可以使用 [UIImage imageWithData:data] 创建图像

相关问题