新建一个CContact类用于存放联系人信息,下面是该类的代码:

CContact.h代码:

01 #import <Foundation/Foundation.h>
02  
03  
04 @interface CContact : NSObject
05  
06 @property (nonatomic,strong) NSString * firstName;
07 @property (nonatomic,strong) NSString * lastName;
08 @property (nonatomic,strong) NSString * compositeName;
09 @property (nonatomic,strong) UIImage * image;
10 @property (nonatomic,strong) NSMutableDictionary * phoneInfo;
11 @property (nonatomic,strong) NSMutableDictionary * emailInfo;
12 @property (nonatomic,assign) int recordID;
13 @property (nonatomic,assign) int sectionNumber;
14  
15  
16 //-(NSString *)getFirstName;
17 //-(NSString *)getLastName;
18 -(NSString *)getFisrtLetterForCompositeName;
19  
20 @end

CContact.m文件代码:

01 //
02 //  CContact.m
03 //  Contact
04 //
05 //  Created by Carl on 13-6-28.
06 //  Copyright (c) 2013年 contact..com. All rights reserved.
07 //
08  
09 #import "CContact.h"
10 #import "pinyin.h"
11  
12 @implementation CContact
13  
14 -(void)dealloc
15 {
16     [_firstName release];
17     [_lastName release];
18     [_compositeName release];
19     [_image release];
20     [_phoneInfo release];
21     [_emailInfo release];
22      
23  
24     _recordID = nil;
25     _firstName = nil;
26     _lastName = nil;
27     _compositeName = nil;
28     _image = nil;
29     _phoneInfo = nil;
30     _emailInfo = nil;
31      
32     [super dealloc];
33 }
34  
35  
36 -(NSMutableDictionary *)phoneInfo
37 {
38     if(_phoneInfo == nil)
39     {
40         _phoneInfo = [[NSMutableDictionary alloc] init];
41     }
42      
43     return _phoneInfo;
44 }
45  
46  
47 -(NSMutableDictionary *)emailInfo
48 {
49     if(_emailInfo == nil)
50     {
51         _emailInfo = [[NSMutableDictionary alloc] init];
52     }
53     return  _emailInfo;
54 }
55  
56  
57  
58 @end

下面是一个自定义函数,用于取得所有联系人信息。

001 //取得所有的联系人
002 -(NSMutableArray *)allContacts
003 {
004      
005      
006      
007      
008     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
009  
010     NSArray * contacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(self.addressBook);
011      
012      
013 //    if([_allContacts retainCount] > 0) [_allContacts release];
014      
015     _allContacts = [[NSMutableArray alloc] init];
016      
017      
018     int contactsCount = [contacts count];
019      
020     for(int i = 0; i < contactsCount; i++)
021     {
022         ABRecordRef record = (ABRecordRef)[contacts objectAtIndex:i];
023         CContact * contact = [[CContact alloc] init];
024         //取得姓名
025         CFStringRef  firstNameRef =  ABRecordCopyValue(record, kABPersonFirstNameProperty);
026         contact.firstName = (NSString *)firstNameRef;
027         CFStringRef lastNameRef = ABRecordCopyValue(record, kABPersonLastNameProperty);
028         contact.lastName = (NSString *)lastNameRef;
029         CFStringRef compositeNameRef = ABRecordCopyCompositeName(record);
030         contact.compositeName = (NSString *)compositeNameRef;
031          
032         firstNameRef != NULL ? CFRelease(firstNameRef) : NULL;
033         lastNameRef != NULL ? CFRelease(lastNameRef) : NULL;
034         compositeNameRef != NULL ? CFRelease(compositeNameRef) : NULL;
035  
036         //取得联系人的ID
037         contact.recordID = (int)ABRecordGetRecordID(record);
038         
039          
040          
041         //联系人头像
042         if(ABPersonHasImageData(record))
043         {
044 //            NSData * imageData = ( NSData *)ABPersonCopyImageData(record);
045             NSData * imageData = (NSData *)ABPersonCopyImageDataWithFormat(record,kABPersonImageFormatThumbnail);
046             UIImage * image = [[UIImage alloc] initWithData:imageData];
047              
048             [imageData release];
049              
050             contact.image = image;
051              
052             [image release];
053         
054         }
055          
056          
057         //处理联系人电话号码
058         ABMultiValueRef  phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
059         for(int i = 0; i < ABMultiValueGetCount(phones); i++)
060         {
061              
062             CFStringRef phoneLabelRef = ABMultiValueCopyLabelAtIndex(phones, i);
063             CFStringRef localizedPhoneLabelRef = ABAddressBookCopyLocalizedLabel(phoneLabelRef);
064             CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, i);
065  
066             NSString * localizedPhoneLabel = (NSString *) localizedPhoneLabelRef;
067             NSString * phoneNumber = (NSString *)phoneNumberRef;
068              
069             [contact.phoneInfo setValue:phoneNumber forKey:localizedPhoneLabel];
070              
071             //释放内存
072             phoneLabelRef == NULL ? : CFRelease(phoneLabelRef);
073             localizedPhoneLabelRef == NULL ? : CFRelease(localizedPhoneLabelRef);
074             phoneNumberRef == NULL ? : CFRelease(phoneNumberRef);
075              
076         }
077         if(phones != NULL) CFRelease(phones);
078          
079         //处理联系人邮箱
080         ABMultiValueRef emails = ABRecordCopyValue(record, kABPersonEmailProperty);
081         for(int i = 0; i < ABMultiValueGetCount(emails); i++)
082         {
083              
084             CFStringRef emailLabelRef = ABMultiValueCopyLabelAtIndex(emails, i);
085             CFStringRef localizedEmailLabelRef = ABAddressBookCopyLocalizedLabel(emailLabelRef);
086             CFStringRef emailRef = ABMultiValueCopyValueAtIndex(emails, i);
087              
088             NSString * localizedEmailLabel = ( NSString *)localizedEmailLabelRef;
089              
090             NSString * email = (NSString *)emailRef;
091              
092             [contact.emailInfo setValue:email forKey:localizedEmailLabel];
093              
094             emailLabelRef == NULL ? : CFRelease(emailLabelRef);
095             localizedEmailLabel == NULL ? : CFRelease(localizedEmailLabelRef);
096             emailRef == NULL ? : CFRelease(emailRef);
097              
098         }
099         if(emails != NULL) CFRelease(emails);
100          
101          
102         [_allContacts addObject:contact];
103         [contact release];
104         CFRelease(record);
105          
106     }
107  
108     [pool drain];   
109     return [_allContacts autorelease];
110      
111 }

iOS取得AddressBook联系人信息的更多相关文章

  1. iOS访问通讯录开发-读取联系人信息

    读取通信录中的联系人一般的过程是先查找联系人记录,然后再访问记录的属性,属性又可以分为单值属性和多值属性.通过下面例子介绍联系人的查询,以及单值属性和多值属性的访问,还有读取联系人中的图片数据. 本案 ...

  2. iOS获取通讯录所有联系人信息

    以下是2种方式: 第一种方法: GetAddressBook.h #import <Foundation/Foundation.h> @interface GetAddressBook : ...

  3. IOS 获取通讯录中信息

    获取通讯录中信息 一. 我们设置一个ABAddressBookRef类型的属性addressBook. 二. 要获得通讯录中的信息,我们需要获取访问通讯录的权限. 在运行下面的获取权限的方法的时候,系 ...

  4. Expo大作战(三十九)--expo sdk api之 DocumentPicker,Contacts(获取手机联系人信息),Branch

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  5. Android 手机卫士--获取联系人信息并显示与回显

    前面的文章已经实现相关的布局,本文接着进行相关的功能实现 本文地址:http://www.cnblogs.com/wuyudong/p/5951794.html,转载请注明出处. 读取系统联系人 当点 ...

  6. android之读取联系人信息

    联系人信息被存放在一个contacts2.db的数据库中 主要的两张表 读取联系人 读取联系人需要知道联系人内容提供者的地址,以及对应的操作对象.一般情况下操作对象是的命名方式和表明是一致的. 布局文 ...

  7. 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)

    1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...

  8. php课程---练习(联系人信息表)

    做一个联系人表,实现增删改功能 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...

  9. Android项目——读取手机联系人信息

    加入读取联系人信息的权限 <uses-permission android:name="android.permission.READ_CONTACTS"/> cont ...

随机推荐

  1. Java-数组练习1

    1.已知2个一维数组:a[]={3,4,5,6,7},b[]={1,2,3,4,5,6,7}:把数组a与数组b 对应的元素乘积再赋值给数组b,如:b[2]=a[2]*b[2]:最后输出数组b的元素. ...

  2. 大叔也说Xamarin~Android篇~支付宝SDK的集成

    回到目录 首先做为支付宝SDK它提供了多种平台,网页版,wap版,IOS版,android版等等,今天主要说一下在xamarin里使用android平台的sdk的方法,在网上介绍这块的文章不多,大叔本 ...

  3. EF架构~CodeFirst生产环境的Migrations

    回到目录 Migrations即迁移,它是EF的code first模式出现的产物,它意思是说,将代码的变化反映到数据库上,这种反映有两种环境,一是本地开发环境,别一种是服务器的生产环境,本地开发环境 ...

  4. 锋利的JQuery —— Ajax

    大图猛戳

  5. WPF入门教程系列十一——依赖属性(一)

    一.依赖属性基本介绍 本篇开始学习WPF的另一个重要内容依赖属性. 大家都知道WPF带来了很多新的特性,其中一个就是引入了一种新的属性机制——依赖属性.依赖属性出现的目的是用来实现WPF中的样式.自动 ...

  6. 每天一个linux命令(39):grep 命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  7. Android线程之AsyncTask

    在之前的博客中为大家分享过关于Android多线程处理,想必大家对于Android为什么要使用多线程已经有了清晰的认识,我就在简单唠两句,Android规定UI界面的更新必须在在主线程进行,对于访问网 ...

  8. 学习RxJS: 导入

    原文地址:http://www.moye.me/2016/05/31/learning_rxjs_part_one_preliminary/ 引子 新手们在异步编程里跌倒时,永远会有这么一个经典问题: ...

  9. web接口测试之GET与POST请求

    关于HTTP协议,我考虑了一下觉得没必要再花一节内容来介绍,因为网上关于HTTP协议的介绍非常详细.本着以尽量避免介绍一空洞了概念与理论来介绍接口测试,我这里仍然会给出具体实例. 在此之前先简单的介绍 ...

  10. Titon Toolkit – 非常强大的用户界面组件

    Titon Toolkit 是一个非常强大的用户界面组件,也是实现响应式,移动和现代网页的工具类的集合.每个组件封装了 HTML.CSS 以及为角色特定页面元素的 JavaScript 功能.Tool ...