获取手机的联系人列表和打电话

获取手机中的联系人列表,需要用到系统给我们提供的框架:AddressBook.framework,

1.导入框架;

2.简历模型和管理者:

模型:

.h

#import <Foundation/Foundation.h>

@interface Contact : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *phone;

+(instancetype)contactWithItem:(id)item;
- (instancetype)initWithItem:(id)item;

@end

.m

#import "Contact.h"
#import <AddressBook/AddressBook.h>
@implementation Contact

+(instancetype)contactWithItem:(id)item{

    return [[Contact alloc] initWithItem:item];
}

-(instancetype)initWithItem:(id)item{

    self = [super init];

    if (self) {

        NSString *temFirstName = (__bridge NSString *)ABRecordCopyValue((__bridge ABRecordRef)(item), kABPersonFirstNameProperty);
        NSString *temLastName = (__bridge NSString *)ABRecordCopyValue((__bridge ABRecordRef)(item), kABPersonLastNameProperty);
        ABMultiValueRef tempPhones = ABRecordCopyValue((__bridge ABRecordRef)(item), kABPersonPhoneProperty);
        self.name = [NSString stringWithFormat:@"%@%@", temLastName?temFirstName:@"", temFirstName?temLastName:@""];
        self.phone = (__bridge NSString *)ABMultiValueCopyValueAtIndex(tempPhones, 0);

    }

    return self;
}

@end

管理者:

.h

#import <Foundation/Foundation.h>

@interface ContactManger : NSObject

-(instancetype)initWithArray:(NSArray *)contacts;
- (NSDictionary *)contactsWithGroup;

@end

.m

#import "ContactManger.h"
#import "Contact.h"
@interface ContactManger ()

@property (nonatomic, strong) NSArray *myContacts;
@property (nonatomic, strong) NSMutableDictionary *contactsDic;

@end

@implementation ContactManger

+(NSString *)phonetic:(NSString *)sourceString{

    NSMutableString *source = [sourceString mutableCopy];

    CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformMandarinLatin, NO);
    CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformStripDiacritics, NO);
    return source;
}

-(instancetype)initWithArray:(NSArray *)contacts{

    self = [super init];

    if (self) {
        _myContacts = contacts;
    }

    return self;
}

-(NSDictionary *)contactsWithGroup{

    for (id item in _myContacts) {

        Contact *people = [Contact contactWithItem:item];

        if (![people.name isEqualToString:@""]) {

            NSString *nameEnglish = [ContactManger phonetic:people.name];
            nameEnglish = [nameEnglish capitalizedString];
            unichar k = [nameEnglish characterAtIndex:0];
            if (!(k >= ‘A‘ && k <= ‘Z‘)) {
                k = ‘#‘;
            }

            NSString *key = [NSString stringWithFormat:@"%c", k];

            NSMutableArray *arrayGroupK = [self.contactsDic objectForKey:key];

            if (!arrayGroupK) {
                arrayGroupK = [[NSMutableArray alloc]initWithCapacity:5];
                [arrayGroupK addObject:people];

                if (nil == self.contactsDic) {

                    self.contactsDic = [[NSMutableDictionary alloc]initWithCapacity:5];

                }
                [self.contactsDic setObject:arrayGroupK forKey:key];

            }else{
                [arrayGroupK addObject:people];
            }
        }

    }

    return self.contactsDic;
}

@end

接下来在Vc里面的代码实现如下:

#import "RootViewController.h"
#import "MBProgressHUD.h"
#import <AddressBook/AddressBook.h>
#import "Contact.h"
#import "ContactManger.h"
#import "LzwTableViewCell.h"
@interface RootViewController ()<UITableViewDelegate, UITableViewDataSource, UIAlertViewDelegate>

@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, assign) ABAddressBookRef addressBook;
@property (nonatomic, strong) ContactManger *contactManager;
@property (nonatomic, strong) NSDictionary *contactsDic;
@property (nonatomic, copy) NSArray *keys;

@end

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self creatTableView];
}

#pragma mark -- 创建表格
- (void)creatTableView{

    self.tableView = ({

        UITableView *tableView = [[UITableView alloc]initWithFrame:[[UIScreen mainScreen]bounds] style:UITableViewStylePlain];
        tableView.delegate =self;
        tableView.dataSource = self;
        tableView.backgroundColor = [UIColor lightGrayColor];
        [tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
        [self.view addSubview:tableView];
        tableView;
    });

    //注册cell
    [self.tableView registerClass:[LzwTableViewCell class] forCellReuseIdentifier:@"cell"];
    [MBProgressHUD showHUDAddedTo:self.view animated:YES];

    //检查授权状态
    [self checkAddressBookAuthorizationStatus];

}
#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [self.keys count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSString *key = [self.keys objectAtIndex:section];
    NSArray * array = [self.contactsDic objectForKey:key];
    return [array count];
}
- (NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return self.keys[section];
}
- (NSArray*)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    return self.keys;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    LzwTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    NSString *key = [self.keys objectAtIndex:indexPath.section];
    Contact *people = [[self.contactsDic objectForKey:key] objectAtIndex:indexPath.row];

    cell.labelName.text = people.name;
    cell.labelNumber.text = people.phone;

        return cell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 60;
}

/**
 *  通讯录的授权状态
 */
- (void)checkAddressBookAuthorizationStatus{

    //初始化
    self.addressBook = ABAddressBookCreateWithOptions(nil, nil);

    if (kABAuthorizationStatusAuthorized == ABAddressBookGetAuthorizationStatus())
    {
        NSLog(@"已经授权");
    }

    ABAddressBookRequestAccessWithCompletion(self.addressBook, ^(bool granted, CFErrorRef error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (error) {
                [MBProgressHUD hideHUDForView:self.view animated:YES];
                NSLog(@"Error: %@", error);
            }else if (!granted){
                [MBProgressHUD hideHUDForView:self.view animated:YES];
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Authorization Denied"
                                                                message:@"Set permissions in Setting>Genearl>Privacy."
                                                               delegate:nil
                                                      cancelButtonTitle:nil
                                                      otherButtonTitles:@"OK", nil];
                [alert show];
            }else{
                //还原 ABAddressBookRef
                ABAddressBookRevert(self.addressBook);

                self.contactManager = [[ContactManger alloc] initWithArray:(__bridge NSArray *)(ABAddressBookCopyArrayOfAllPeople(self.addressBook))];
                self.contactsDic = [self.contactManager contactsWithGroup];

                self.keys = [[self.contactsDic allKeys] sortedArrayUsingSelector:@selector(compare:)];

                [MBProgressHUD hideHUDForView:self.view animated:YES];

                [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
                [self.tableView reloadData];
            }
        });
    });

}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *key = [self.keys objectAtIndex:indexPath.section];
    Contact *people = [[self.contactsDic objectForKey:key] objectAtIndex:indexPath.row];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:people.name
                                                    message:people.phone
                                                   delegate:self
                                          cancelButtonTitle:@"取消"
                                          otherButtonTitles:@"打电话", nil];
    [alert show];
}

#pragma mark - UIAlertViewDelegate

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    UIApplication *app = [UIApplication sharedApplication];
    if (buttonIndex == 1) {
        [app openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@", alertView.message]]];
    }
}

@end

这样就可以实现获取本地通讯录的联系人和打电话功能,效果图如下:

完成!!!

时间: 2024-11-10 11:56:51

获取手机的联系人列表和打电话的相关文章

Android实例-手机安全卫士(二十六)—获取手机内联系人信息

一.目标. 通过内容解析器获取手机联系人信息,并采用自定义的样式显示. 为了便于介绍和重复使用,重新建立一个”读取联系人“工程. 二.代码实现. 1.新建工程,取名为”读取联系人“.在布局文件(activity_main.xml)中,采用ListView组件(其ID为select_contact). 布局文件代码: 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmln

[小项目] 获取手机联系人并且向服务器发送JSON数据

[小项目] 获取手机联系人并且向服务器发送JSON数据 好久没有写文档了...最近忙着带班,也没有时间学习新东西,今天刚好有个小Demo,就写了一下,顺便丰富一下我的博客吧! 首先说一下需求: 简单的说,就是一个程序,会获取手机的联系人列表,然后转换成JSON字符串数组,向指定服务器中发送数据...总感觉有侵犯别人隐私权的意味; 注:仅供学习使用,不要做违法的事情哟 这个程序我写的有点有条理,首先有几个工具类: 1. 判断是否联网的工具类(NetUtils) 2. 从手机中获取所有联系人的工具类

获取手机联系人的信息

使用ContentResolver获取手机联系人的办法,建议使用第二种 1.一般下面的方法查询的是视图的表,表的字段需要查询获取,比较麻烦,可能会经常出错(特别在真机调试的时候) // TODO 这种方法直接指定uri在真机中是获取不到联系人信息的 // [1]获取到内容解析者 // ContentResolver contentResolver = getContentResolver(); /*Cursor cursor = contentResolver.query(Uri .parse(

仿IOS通讯录效果,实现获取手机通讯录、字母排序显示、搜索联系人、拨打电话

1.使用UITableView,实现联系人字母排序.点击字母跳转显示联系人组目录: 2.使用UISearchController,实现联系搜索,动态显示符合查询的联系人: 3.点击通讯录列表项,显示联系人信息(使用自定义模式化窗口类似与UIAlertView,使用UIwindow实现),点击拨号,可以直接拨打电话: 4.实现获取手机通讯录里面的联系人信息: 详情见资源:http://download.csdn.net/detail/u011622479/9505751 效果图如下: 获取联系人:

Android获取手机联系人的姓名和电话

Android获取手机联系人的姓名和电话 主要是用到了跳入手机联系人的intent和获取手机联系人信息的内容提供者,直接上代码 注:此贴是借鉴别人的帖子加了一些自己的东西写出的,原帖地址明日附上: / 首先 我们需要跳入手机通讯录 Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, 0); // 之后,我们需要重写

安卓Launcher之获取手机安装的应用列表

Launcher中最主要的就是获取所有应用列表的入口以及图标,一般获取的方法有两种: PackageInfo ResolveInfo 运行获取所有APP的Launcher并且允许进行点击事件,进入到应用 下面通过这两种方法获取到所有应用的列表: 建立基本数据: PakageMod.java public class PakageMod { public String pakageName; public String appName; public Drawable icon; public P

安卓Launcher之获取手机安装的应用列表,安卓launcher

Launcher中最主要的就是获取所有应用列表的入口以及图标,一般获取的方法有两种: PackageInfo ResolveInfo 运行获取所有APP的Launcher并且允许进行点击事件,进入到应用 下面通过这两种方法获取到所有应用的列表: 建立基本数据: PakageMod.java public class PakageMod { public String pakageName; public String appName; public Drawable icon; public P

获取手机联系人,并通过拼音字母快速查询

获取手机联系人,并通过拼音字母快速查询. 通过工具类转换联系人首字的首字母,并排序显示. 通过画布的方式在布局右侧添加快速查询的字母布局 显示效果如下图: 右侧点击[★]时回到顶部: 滑动到[N]时N开头的联系人置顶 代码: 通过画布的方式在布局右侧添加快速查询的字母布局 http://download.csdn.net/detail/zengchao2013/8750259 欢迎指正~ 通过画布的方式在布局右侧添加快速查询的字母布局

获取WIFI列表,在旧手机上运行就没有问题,在新手机上就怎么也获取不到WIFI列表,长度一直为0,还不报异常,很疑惑。

新手机获取不到WIFI列表的原因: 获取不到列表首先要考虑的是6.0动态权限的问题 解决方案: (1) 将SDK版本改为23以下,例如22,但是这样就要放弃SDK的新特性 (2) 使用动态授权,接收用户授权的信息,根据用户授权的信息作出操作