新建一个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方法里面不能再嵌套方法?

    直接原因: 这是Java基本语法定义的,方法中不可以再次声明方法,只能调用其他的方法. 个人理解: 1.方法栈是需要一个载体的,这个载体就是Class,如果一个方法的上一级不是一个类,就说明没有载体. ...

  2. MySQL 5.7新特性之Generated Column(函数索引)

    MySQL 5.7引入了Generated Column,这篇文章简单地介绍了Generated Column的使用方法和注意事项,为读者了解MySQL 5.7提供一个快速的.完整的教程.这篇文章围绕 ...

  3. Nodejs·构建web应用

    本篇的内容比较多..... 1 首先是从基本的Nodejs服务方面讲述前后端统一语言在web应用中的作用: 2 然后讲了web中基本的知识,从请求方法到路由.从查询字符串到Cookie和Session ...

  4. struts2学习笔记之七:Result类型

    一:关于Struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法 他们体现了策略模式,具体Result类型参见:struts-default ...

  5. js高程读书笔记(1-3章)

    一.js简介 js是一种专为与网页交互而设计的脚本语言,由以下三个不同的部分组成: 1.ECMAScript,由ECMA-262(它规定了语言的这些组成部分:语法,类型,语句,关键字,保留字,操作符, ...

  6. word-wrap: break-word; break-word: break-all;区别

    word-break:break-all和word-wrap:break-word都是能使其容器如DIV的内容自动换行. 它们的区别就在于: 1,word-break:break-all 例如div宽 ...

  7. 为什么MVC不是一种设计模式

    http://damoqiongqiu.iteye.com/blog/1949256 ---比较Backbone和Ext4.x在MVC实现上的差异 大漠穷秋 前言 圣人云:不想做妈咪的小姐不是好码农. ...

  8. Primer – 支撑 GitHub 的 CSS 工具包和准则

    Primer 是一个 CSS 工具包,支撑着 GitHub 的前端设计.它的目的仅限于提供通用部件,为我们的开发者提供最大的灵活性,并保持 GitHub 的独特风格.它基于 SCSS 建成,可以通过 ...

  9. 【Android】Volley做网络请求的几种用法

    前言: 最近在将自己写的烂代码重构,以前使用的网络请求全是基于apache的HttpClient,简单使用还好,使用多了发现重复代码太多,而且每次使用都很繁琐,因此在网上找了半天网络请求的相关类库,最 ...

  10. Windows Azure Cloud Service (1) 用户手册

    <Windows Azure Platform 系列文章目录> 下载地址 Cloud Service用户手册