新建一个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. underscore源码阅读记录

    这几天有大神推荐读underscore源码,趁着项目测试的空白时间,看了一下. 整个underscore包括了常用的工具函数,下面以1.3.3源码为例分析一下. _.size = function(o ...

  2. 说说设计模式~建造者模式(Builder)

    返回目录 建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我 ...

  3. WebApi系列~安全校验中的防篡改和防复用

    回到目录 web api越来越火,因为它的跨平台,因为它的简单,因为它支持xml,json等流行的数据协议,我们在开发基于面向服务的API时,有个问题一直在困扰着我们,那就是数据的安全,请求的安全,一 ...

  4. 邮件开发——base64账号密码转换

    package com.hq.base64; import java.io.BufferedReader; import java.io.FileInputStream; import java.io ...

  5. 为什么获取的System.Web.HttpContext.Current值为null,HttpContext对象为null时如何获取程序(站点)的根目录

    ASP.NET提供了静态属性System.Web.HttpContext.Current,因此获取HttpContext对象就非常方便了.也正是因为这个原因,所以我们经常能见到直接访问System.W ...

  6. ASP.NET MVC 微信公众号支付,微信公众平台配置

    微信公众号支付,首先要登录微信公众号进行配置: 第一步:配置网页授权域名

  7. 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

  8. Java-集合-第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList(); l

    第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; ...

  9. unity生成WP工程后ExtendedSplashImage显示不正确的问题

    这个bug我已经彻底无语了,居然这么久都没有fix. 解决方法如下: <SwapChainPanel x:Name="DXSwapChainPanel"> <Gr ...

  10. Enterprise Solution 开发框架功能点

    1. 通用查询模块,可以通过关联数据库表,存储过程或程序代码开发查询,多个查询之间也可构成主从关联查询. 2. 业务异常处理 支持统一的异常处理. 3. 内置一个简单的SQL Server查询分析器, ...