3

我正在开发名片阅读器应用程序。当我读取卡片时,我从 OCR 输出中得到一个字符串对象。我将字符串分隔为不同的其他字符串,例如姓名、地址、电话号码、电子邮件和网址。但是我的问题是我无法在ABNewPersonViewController类的相应字段中发送这些字符串。

4

1 回答 1

1

请参阅下面的代码。这是一个详细的代码。

-(NSUInteger)addNewContacts_InAddressBook:(NSMutableArray*)contactsToBeAdded
{

    int numContacts=[contactsToBeAdded count];

    if (numContacts==0) 
    {
        return 0;
    }

    int32_t uniqueId;

    @try 
    {
        ABAddressBookRef iphoneAddressBook=ABAddressBookCreate();

        CFErrorRef error = NULL; 

        if(!iphoneAddressBook)
        {
            DLog(@"unable to open addressBook");

            return 0;
        }


        NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
        [inFormat setDateFormat:@"yyyy-MM-dd"];
        [inFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
        NSAutoreleasePool* pool=[[NSAutoreleasePool alloc] init];
        NSMutableArray *recordRefArray=[[NSMutableArray alloc] initWithCapacity:numContacts];
        BOOL shouldReleasePool=NO;
        NSAutoreleasePool *innerPool=nil;
        for(int j=0;j<numContacts;j++)
        {
            if((j&255)==0)
            {
                innerPool= [[NSAutoreleasePool alloc] init];
                shouldReleasePool=YES;
            }
            Contact *objContact=[contactsToBeAdded objectAtIndex:j];
            ABRecordRef newPerson = ABPersonCreate();
            if(objContact.mPrefixName!=nil)
            {   
                if([objContact.mPrefixName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonPrefixProperty, (CFStringRef)objContact.mPrefixName , &error);
                }
            }

            if(objContact.mFirstName!=nil)
            {   
                if([objContact.mFirstName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonFirstNameProperty, (CFStringRef)objContact.mFirstName , &error);
                }
            }

            if(objContact.mMiddleName!=nil)
            {   
                if([objContact.mMiddleName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonMiddleNameProperty, (CFStringRef)objContact.mMiddleName , &error);
                }
            }

            if(objContact.mLastName!=nil)
            {   
                if([objContact.mLastName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonLastNameProperty, (CFStringRef)objContact.mLastName , &error);
                }
            }

            if(objContact.mNickName!=nil)
            {   
                if([objContact.mNickName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonNicknameProperty, (CFStringRef)objContact.mNickName , &error);
                }
            }

            if(objContact.mSuffixName!=nil)
            {   
                if([objContact.mSuffixName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonSuffixProperty, (CFStringRef)objContact.mSuffixName , &error);
                }
            }


            // Storing user photo into address book
            if(objContact.mUserPhotoData)
            {
                if ([objContact.mUserPhotoData length] > 0)
                    ABPersonSetImageData(newPerson, (CFDataRef)objContact.mUserPhotoData, &error);
            }

            ContactProperty *objContactProperty;
            int numProps=[objContact.mPropertyArray count];

            ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            ABMutableMultiValueRef multiEmail = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            ABMutableMultiValueRef multiUrl = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            NSMutableDictionary *addressDictionary=[[NSMutableDictionary alloc] init];
            ABMutableMultiValueRef multiAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);

            BOOL notFirstTime=NO;
            int currentPropertyIndex=-1;
            NSString *displayName;
            ABMutableMultiValueRef multiDate = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            ABMutableMultiValueRef multiIM = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);

            NSMutableDictionary *IMDictionary;


            for(int i=0;i<numProps;i++)
            {

                objContactProperty=[objContact.mPropertyArray objectAtIndex:i];

                int PID=objContactProperty.mContactPropId;


               // if([objContactProperty.mContactDataType compare:@"Text"]==NSOrderedSame)
                //{

                if (PID==3) 
                {

                    if(objContactProperty.mContactPropertyString)
                    {
                      //  DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                        ABRecordSetValue(newPerson, kABPersonOrganizationProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                    }

                }
               // }

            ///\/\/\/\/\/\/\/\/




                if(PID==1901)
                {
                        if(objContactProperty.mContactPropertyString)
                        {
                       //     DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                            ABRecordSetValue(newPerson, kABPersonNoteProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                        }

                 }




                if(PID==4)
                {   
                        if(objContactProperty.mContactPropertyString)
                        {
                 //           DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                            ABRecordSetValue(newPerson, kABPersonFirstNamePhoneticProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                        }

                }



                if(PID==5)
                {   
                    if(objContactProperty.mContactPropertyString)
                    {
                        //           DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                        ABRecordSetValue(newPerson, kABPersonLastNamePhoneticProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                    }

                }




                if(PID==6)
                {   
                    if([objContactProperty.mContactPropertyString length]>=1)
                    {
                        //           DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                        ABRecordSetValue(newPerson, kABPersonJobTitleProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                    }

                }




                if(PID==7)
                {   
                    if(objContactProperty.mContactPropertyString)
                    {
                        //           DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                        ABRecordSetValue(newPerson, kABPersonDepartmentProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                    }

                }




            //Adding phone numbers


                //if([objContactProperty.mContactDataType compare:@"Phone"]==NSOrderedSame)
                if(PID>10 && PID<=200)
                {
      //              if(objContactProperty.mContactPropertyString)
      //              {
              //          DLog(@"Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                        ABMultiValueAddValueAndLabel(multiPhone, objContactProperty.mContactPropertyString, (CFStringRef)objContactProperty.mDisplayName, NULL);
     //               }
                }






            //Adding emails



         //       if([objContactProperty.mContactDataType compare:@"Email"]==NSOrderedSame)
                if(PID>300 && PID<=320)
                {
                        ABMultiValueAddValueAndLabel(multiEmail, objContactProperty.mContactPropertyString, @"home", NULL);
                }
                else if(PID>320 && PID<=340)
                {
                    ABMultiValueAddValueAndLabel(multiEmail, objContactProperty.mContactPropertyString, @"work", NULL);
                }
                else if(PID>340 && PID<=400)
                {
                    ABMultiValueAddValueAndLabel(multiEmail, objContactProperty.mContactPropertyString, (CFStringRef)objContactProperty.mDisplayName, NULL);
                }





            //Adding web URLs


     //           if([objContactProperty.mContactDataType compare:@"Url"]==NSOrderedSame)
                if(PID>500  && PID<=600)
                {
     //               if(objContactProperty.mContactPropertyString)
     //               {
                        ABMultiValueAddValueAndLabel(multiUrl, objContactProperty.mContactPropertyString, (CFStringRef)objContactProperty.mDisplayName, NULL);
     //               }
                }






            //ADDRESSES


                if (PID>700 && PID<=1300) 
                {

                    int propertyIndex=(PID-1)/10;  //To adjust for 710 to fall into category of (710-1)/10=70 instead of 71.

                    if (propertyIndex!=currentPropertyIndex) 
                    {
                        if (notFirstTime) 
                        {
                            bool didAddAddress;

                            if(currentPropertyIndex*10<901)
                                didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABHomeLabel, NULL);
                            else if(currentPropertyIndex*10<1101)
                                didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABWorkLabel, NULL);
                            else
                                didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, displayName, NULL);

                            [addressDictionary release];
                            addressDictionary = [[NSMutableDictionary alloc] init];
                        }

                        currentPropertyIndex=propertyIndex;

                        notFirstTime=YES;
                    }

                    displayName=[NSString stringWithString:objContactProperty.mDisplayName];

                    switch (PID%10) 
                    {
                        case 1:

                            [addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *) kABPersonAddressStreetKey];
                            break;

                        case 2:
                            [addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressCityKey];
                            break;

                        case 3:
                            [addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressStateKey];
                            break;

                        case 4:
                            [addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressZIPKey];
                            break;

                        case 5:
                            [addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressCountryKey];
                            break;

                        default:
                            break;
                    }
                }





                //DATE AND BIRTHDAY

                    NSDate *ddate;

                    if (PID>1400 && PID<=1500) 
                    {
                        switch (PID) 
                        {
                            case 1401:
                                ddate=[inFormat dateFromString:[objContactProperty.mContactPropertyString substringToIndex:10]];
                                ABRecordSetValue(newPerson, kABPersonBirthdayProperty, ddate , &error);
                                break;

                            default:
                                ddate=[inFormat dateFromString:[objContactProperty.mContactPropertyString substringToIndex:10]];
                                ABMultiValueAddValueAndLabel(multiDate, ddate, (CFStringRef)objContactProperty.mDisplayName, NULL);
                                break;
                        }
                    }




                //INSTANT MESSAGE

                    if (PID>1600 && PID<=1800) 
                    {

                        switch (PID%2) 
                        {
                            case 1:
                                IMDictionary=[[NSMutableDictionary alloc] init];
                                [IMDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *) kABPersonInstantMessageUsernameKey];
                                break;
                            case 0:
                                [IMDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *) kABPersonInstantMessageServiceKey];
                                ABMultiValueAddValueAndLabel(multiIM, IMDictionary, (CFStringRef)objContactProperty.mDisplayName, NULL);
                                [IMDictionary release];
                            default:
                                break;
                        }
                    }





            }

            if ([addressDictionary count]!=0) 
            {
                bool didAddAddress;


                NSRange range1,range2;

                range1=[displayName rangeOfString:@"home" options:NSCaseInsensitiveSearch];
                range2=[displayName rangeOfString:@"work" options:NSCaseInsensitiveSearch];

                if (range1.location!=NSNotFound)
                    didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABHomeLabel, NULL);
                else if (range2.location!=NSNotFound)
                    didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABWorkLabel, NULL);
                else
                    didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, (CFStringRef)displayName, NULL);
            }
            [addressDictionary release];

            ABRecordSetValue(newPerson, kABPersonAddressProperty, multiAddress, NULL);
            CFRelease(multiAddress);


            DLog(@"Saving Phone Numbers");
            ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone,nil);
            CFRelease(multiPhone);
            ABRecordSetValue(newPerson, kABPersonEmailProperty, multiEmail,nil);
            CFRelease(multiEmail);    
            ABRecordSetValue(newPerson, kABPersonURLProperty, multiUrl,nil);
            CFRelease(multiUrl);
            ABRecordSetValue(newPerson, kABPersonDateProperty, multiDate,nil);
            CFRelease(multiDate);
            ABRecordSetValue(newPerson, kABPersonInstantMessageProperty, multiIM, NULL);
            CFRelease(multiIM);







            bool outcome=ABAddressBookAddRecord(iphoneAddressBook, newPerson, &error);

#ifdef  ENABLE_DEBUG_CONSOLE_OUTPUT           
            if(outcome==FALSE)
                DLog(@"RECORD COULD NOT BE ADDED TO THE ADDRESSBOOK");
#endif

            [recordRefArray addObject:newPerson];
            CFRelease(newPerson);



            if(shouldReleasePool)
            {
                [innerPool release];
                shouldReleasePool=NO;
            }

        }

        DLog(@"Saving AddressBook");
        DBManager *dbManager=[DBManager getInstance];
        [dbManager setFLAGIsSavingAddressBook:YES];
        bool outcome=ABAddressBookSave(iphoneAddressBook, &error);
        [dbManager setFLAGIsSavingAddressBook:NO];
        [[NSNotificationCenter defaultCenter] postNotificationName:ADDRESSBOOK_DONE_SAVING object:nil];

#ifdef  ENABLE_DEBUG_CONSOLE_OUTPUT 
        if(outcome==FALSE)
            DLog(@"ADDRESSBOOK COULD NOT BE SAVED");
#endif


        for(int i=0;i<numContacts;i++)
        {

            uniqueId=ABRecordGetRecordID([recordRefArray objectAtIndex:i]);
            Contact *objContact=[contactsToBeAdded objectAtIndex:i];
            objContact.addressBookId=uniqueId;

            DLog(@"Adding multiple records at once. The LID for the newly added record is: %i",uniqueId);
        }

        [recordRefArray release];


        //Initializing new addressBook id in contact
        //objContact.addressBookId=uniqueId;


        CFRelease(iphoneAddressBook);


        [pool release];

        [inFormat release];

    }
    @catch (NSException * e) 
    {
        DLog(@"Exception in addNewContactInAddressBook ");
    }
    @finally {
    }

    return 0;
//  

    return uniqueId;
    }
于 2012-10-22T12:38:08.810 回答