Поиск по номеру и получить изображение с помощью ABAddressBook - PullRequest
8 голосов
/ 25 февраля 2011

Я хочу выполнить поиск в адресной книге iphone через мое приложение, используя номер в качестве ключа, а затем получить изображение, связанное с этим контактом, и отобразить его в UIImageView.

Я пытался использовать платформу ABAddressBook, но не зналпродолжать.

Может кто-нибудь предложить мне решения или альтернативный путь, которым я могу следовать.Любой фрагмент кода также будет очень полезен !!

Любая форма помощи будет весьма полезна.

Заранее спасибо

Ответы [ 2 ]

26 голосов
/ 30 марта 2011

Фреймворк 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++) {

Поскольку с номерами телефонов связаны номера и метки, вам необходимо извлечь строку фактического номера телефона в виде строки NSS:

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 в имени функции не нужно выпускать, и все, что с Copy или Create, вам нужно освобождать. Таким образом, в этом случае вам потребуется CFRelease() phonelist, allPeople и addressbook, но не numPeople, person или numPhones.

1 голос
/ 10 января 2015
-(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;
            }


        }

    }
}
...