按编号搜索并使用ABAddressBook获取图像

时间:2011-02-25 10:12:35

标签: xcode uiimageview abaddressbook

我希望通过我的应用程序使用数字作为键在iphone地址簿中搜索,然后检索与该联系人关联的图像并将其显示在UIImageView上。

我尝试使用ABAddressBook框架,但无法继续。

任何人都可以向我推荐我可以遵循的解决方案或任何替代路径。任何代码片段也会有很大的帮助!!

任何形式的帮助都会非常明显。

提前致谢

2 个答案:

答案 0 :(得分:26)

AB框架有时可能是一种真正的痛苦。但它分解为一系列非常简单的操作。首先,您必须创建一个ABAddressBook实例:

ABAddressBookRef addressbook = ABAddressBookCreate();

然后,您需要复制地址簿中所有人的数组,并逐步查找所需数据:

CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressbook);
CFIndex numPeople = ABAddressBookGetPersonCount(addressbook);
for (int i=0; i < numPeople; i++) { 

在您的循环中,您可能希望获得对个人的引用:

ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);

然后,您想要将您拥有的号码(让我们称之为inNumber)与与该特定人员相关联的每个电话号码进行比较。要做到这一点,首先需要列出所有人的电话号码:

ABMutableMultiValueRef phonelist = ABRecordCopyValue(person, kABPersonPhoneProperty);

然后,当然,你需要有一个内循环来循环每个人的电话号码:

CFIndex numPhones = ABMultiValueGetCount(phones);
for (int j=0; j < numPhones; j++) {

由于电话号码同时包含数字和标签,因此您需要将实际电话号码字符串解压缩为NSString:

CFTypeRef ABphone = ABMultiValueCopyValueAtIndex(phoneList, j);
NSString *personPhone = (NSString *)ABphone;
CFRelease(ABphone);

现在你终于可以比较数字了!使用标准的NSString比较方法,但请记住,您需要担心格式化等。

找到电话号码与inNumber匹配的人后,您需要将该人的图片提取到UIImage

    CFDataRef imageData = ABPersonCopyImageData(person);
    UIImage *image = [UIImage imageWithData:(NSData *)imageData];
    CFRelease(imageData);

当需要退出时,您需要清理内存。 AB框架的一般经验法则是,您不需要释放函数名称中包含Get的任何内容,以及CopyCreate的任何内容,您需要释放。因此,在这种情况下,您需要CFRelease() phonelistallPeopleaddressbook,而不是numPeopleperson或{ {1}}。

答案 1 :(得分:1)

-(void)fetchAddressBook:(NSString *)searchnumber
{
    ABAddressBookRef UsersAddressBook = ABAddressBookCreateWithOptions(NULL, NULL);

    //contains details for all the contacts
    CFArrayRef ContactInfoArray = ABAddressBookCopyArrayOfAllPeople(UsersAddressBook);

    //get the total number of count of the users contact
    CFIndex numberofPeople = CFArrayGetCount(ContactInfoArray);

    //iterate through each record and add the value in the array
    for (int i =0; i<numberofPeople; i++) {

        ABRecordRef ref = CFArrayGetValueAtIndex(ContactInfoArray, i);

        NSString *firstName = (__bridge NSString *)ABRecordCopyValue(ref, kABPersonFirstNameProperty);
        //Get phone no. from contacts
        ABMultiValueRef multi = ABRecordCopyValue(ref, kABPersonPhoneProperty);
        UIImage *iimage;
        NSString* phone;
        for (CFIndex j=0; j < ABMultiValueGetCount(multi); j++) {
            iimage=nil;
            phone=nil;
            phone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(multi, j);



            //if number matches
            if([phone isEqualToString:searchnumber])
            {
                NSLog(@"equlas%@",searchnumber);

            //if person has image store it
            if (ABPersonHasImageData(ref)) {

                CFDataRef imageData=ABPersonCopyImageDataWithFormat(ref, kABPersonImageFormatThumbnail);
                iimage = [UIImage imageWithData:(__bridge NSData *)imageData];

            }else{
                //default image
                iimage=[UIImage imageNamed:@"icon"];

            }

         //set image and name
                userimage.image=iimage;
                lblname.text=firstName;

                return;
            }


        }

    }
}