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