在Android开发中,读取手机通讯录中的号码是一种基本操作,但是由于Android的版本众多,所以手机通讯录操作的代码比较纷杂,在本文中进行一下总结。

Android1.5是现在的Android系统中最低的版本,首先来说一下适用于Android1.5及以上版本(含2.X,3.X)的代码实现:

//获得所有的联系人

Cursor cur = context.getContentResolver().query(

Contacts.People.CONTENT_URI,

null,

null,

null,

Contacts.People.DISPLAY_NAME +" COLLATE LOCALIZED ASC");

// 循环遍历

if (cur.moveToFirst()) {

int idColumn = cur.getColumnIndex(Contacts.People._ID);

int displayNameColumn = cur.getColumnIndex(Contacts.People.DISPLAY_NAME);

do {

// 获得联系人的ID号

String contactId =cur.getString(idColumn);

// 获得联系人姓名

String disPlayName =cur.getString(displayNameColumn);

//获取联系人的电话号码

CursorphonesCur = context.getContentResolver().query(

Contacts.Phones.CONTENT_URI,null,

Contacts.Phones.PERSON_ID+ "=" + contactId, null, null);

if (phonesCur.moveToFirst()) {

do {

// 遍历所有的电话号码

StringphoneType = phonesCur.getString(phonesCur

.getColumnIndex(Contacts.PhonesColumns.TYPE));

String phoneNumber =phonesCur.getString(phonesCur

.getColumnIndex(Contacts.PhonesColumns.NUMBER));

//自己的逻辑处理代码

}while(phonesCur.moveToNext());

}

}while (cur.moveToNext());

}

cur.close();

使用这段代码可以在各种版本的Android手机中读取手机通讯录中的电话号码,而且可以读取一个姓名下的多个号码,但是由于使用该代码在2.x版本中的效率不高,读取的时间会稍长一些,而且2.x现在是Android系统的主流,至少占有80%以上的Android手机份额,所以可以使用高版本的API进行高效的读取。

适用于Android2.0及以上版本的读取通讯录的代码如下:

//读取手机本地的电话

ContentResolver cr =context.getContentResolver();

//取得电话本中开始一项的光标,必须先moveToNext()

Cursor cursor =cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);

while(cursor.moveToNext()){

//取得联系人的名字索引

int nameIndex =cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);

String name = cursor.getString(nameIndex);

//取得联系人的ID索引值

String contactId =cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

//查询该位联系人的电话号码,类似的可以查询email,photo

Cursor phone =cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,

ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = "

+ contactId, null, null);//第一个参数是确定查询电话号,第三个参数是查询具体某个人的过滤值

//一个人可能有几个号码

while(phone.moveToNext()){

String phoneNumber =phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

listName.add(name);

listPhone.add(phoneNumber);

}

phone.close();

}

cursor.close();

如果需要读取SIM卡里面的通讯录内容,则可以使用:”content://icc/adn”进行读取,代码如下:

try{

Intent intent = new Intent();

intent.setData(Uri.parse(“content://icc/adn”));

Uri uri = intent.getData();

ContentResolvercr = context.getContentResolver();

Cursor cursor =context.getContentResolver().query(uri, null, null, null, null);

if (cursor != null) {

while(cursor.moveToNext()){

//取得联系人的名字索引

int nameIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);

String name = cursor.getString(nameIndex);

//取得联系人的ID索引值

String contactId =cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

//查询该位联系人的电话号码,类似的可以查询email,photo

Cursor phone =cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,

ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = "

+ contactId, null, null);//第一个参数是确定查询电话号,第三个参数是查询具体某个人的过滤值

//一个人可能有几个号码

while(phone.moveToNext()){

String phoneNumber =phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

//自己的逻辑代码

}

phone.close();

}

cursor.close();

}

}catch(Exception e){}

通讯录上的信息,存储在两个地方,一个是SIM卡,一个是手机本地,

首先是手机本地:
Cursor cursor = getContentResolver().query(People.CONTENT_URI, null,
null, null, null);
while (cursor.moveToNext()) {
ContactInfo cci = new ContactInfo();
//取得联系人名字
int nameFieldColumnIndex = cursor.getColumnIndex(People.NAME);
cci.contactName = cursor.getString(nameFieldColumnIndex);
//取得电话号码
int numberFieldColumnIndex = cursor.getColumnIndex(People.NUMBER);
cci.userNumber = cursor.getString(numberFieldColumnIndex);
cci.userNumber = GetNumber(cci.userNumber);
cci.isChecked = false;
if (IsUserNumber(cci.userNumber)) {
if (!IsContain(contactList, cci.userNumber)) {
if(IsAlreadyCheck(wNumStr, cci.userNumber)){
cci.isChecked = true;
numberStr += "," + cci.userNumber;
}
contactList.add(cci);
//Log.i("eoe", "*********"+cci.userNumber);
}
}
}
cursor.close();
}

下面是获取SIM卡:

//从SIM卡中取号
private void GetSimContact(String add){
//读取SIM卡手机号,有两种可能:content://icc/adn与content://sim/adn
try {
Intent intent = new Intent();
intent.setData(Uri.parse(add));
Uri uri = intent.getData();
mCursor = getContentResolver().query(uri, null, null, null, null);
if (mCursor != null) {
while (mCursor.moveToNext()) {
ContactInfo sci = new ContactInfo();
// 取得联系人名字
int nameFieldColumnIndex = mCursor.getColumnIndex("name");
sci.contactName = mCursor.getString(nameFieldColumnIndex);
// 取得电话号码
int numberFieldColumnIndex = mCursor
.getColumnIndex("number");
sci.userNumber = mCursor.getString(numberFieldColumnIndex);

sci.userNumber = GetNumber(sci.userNumber);
sci.isChecked = false;

if (IsUserNumber(sci.userNumber)) {
if (!IsContain(contactList, sci.userNumber)) {
if(IsAlreadyCheck(wNumStr, sci.userNumber)){
sci.isChecked = true;
numberStr += "," + sci.userNumber;
}
contactList.add(sci);
//Log.i("eoe", "*********"+sci.userNumber);
}
}
}
mCursor.close();
}
} catch (Exception e) {
Log.i("eoe", e.toString());
}
}

以上是将获取到的信息对象方法ArrayList<ContactInfo> contactList里面,然后砸显示的是采用适配器,这样就完成了

在写的时候,一定要注意获取的方式。

android获取手机录的更多相关文章

  1. Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息

    Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息 本文目录: 获取手机信息 设置权限 申请权限 查询联系人 获取手机定位信息 调用高德地图,设置显示2个坐标点的位置,以及 ...

  2. android API版本对应的系统版本及Android获取手机和系统版本等信息的代码

    学了这么久的Android,竟然一直对其API对应的名称关系一值搞不清楚,现在网上认真看了下资料,转载一个觉得写得不错的作者的文章,记下来: [背景] 之前折腾android期间,慢慢地知道了,And ...

  3. Android 获取手机的厂商、型号、Android系统版本号等工具类(转载)

    Android 获取手机的厂商.型号.Android系统版本号等工具类 1.获取手机制造厂商 2.获取手机型号 3.获取手机系统当前使用的语言 4.获取Android系统版本号 5.获取手机IMEI串 ...

  4. Android中手机录屏并转换GIF的两种方式

    之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视 ...

  5. Android 获取手机Mac地址,手机名称

    /** * 获取手机mac地址<br/> * 错误返回12个0 */ public static String getMacAddress(Context context) { // 获取 ...

  6. android获取手机信息大全

    IMEI号,IESI号,手机型号: private void getInfo() { TelephonyManager mTm = (TelephonyManager) getSystemServic ...

  7. Android获取手机制作商,系统版本等

    在开发中 我们有时候会需要获取当前手机的系统版本来进行判断,或者需要获取一些当前手机的硬件信息. android.os.Build类中.包括了这样的一些信息.我们可以直接调用 而不需要添加任何的权限和 ...

  8. Android获取手机设备识别码(IMEI)和手机号码

    最近看了下获取手机设备ID和手机信息以及SIM的信息例子,主要还是借鉴别人的,现在自己写一下,算是巩固加深了,也希望能给大家一个参考 必要的条件还是一部真机,SIM卡或者UIM卡. 首先,在Andro ...

  9. android获取手机信息2

    IMEI号,IESI号,手机型号: private void getInfo() { TelephonyManager mTm = (TelephonyManager) getSystemServic ...

随机推荐

  1. PMP考试--成本管理中常用的概念

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 净现值(NPV)   Net Present Value 在项目计算期内,按行业基准 ...

  2. iOS打电话、发短信

    方式一:使用该方法进行拨号之后,当电话挂断之后不会反回应用程序,会停留在电话记录界面,不会反回应用程序      NSURL *url = [NSURL URLWithString:@"te ...

  3. mysql数据导入

    1.windows解压 2.修改文件名,例如a.txt 3.rz 导入到 linux \data\pcode sudo su -cd /data/pcode/rm -rf *.txt 4.合并到一个文 ...

  4. IE SEESION共享的问题

    前几天,我们在开发工作流的过程中出现了一个比较奇怪的问题,原本看不到流程的人员,在登陆后却能够看到对应流程的待办任务,并且导致流程流向混乱!在调模式下调试程序发现(假设登陆两个用户)第二个登陆用户的信 ...

  5. 【HTML/XML 7】CSS层叠样式表

    导读:上篇博客说到用XSL去实现XML文档的表现形式的美化,那么另外一种方式就是CSS的使用.本篇博客系统的介绍CSS,下篇博客,将系统的介绍XSL. 一.CSS的发展历史 1996年,层叠样式表(C ...

  6. Duilib学习笔记《06》— 窗体基类WindowImpBase

    在前面的例子中我们发现,窗口都是继承CWindowWnd.INotifyUI,然后重载相关函数去实现.显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等… ...

  7. 网络设备模拟器 GNS3

    https://www.gns3.com/support/docs/linux-installation sudo dpkg --add-architecture i386 sudo add-apt- ...

  8. 学习STL-介绍一下STL

    从大学时就开始学习C++,到现在近5年的时间了却很少用到STL.现在想想真得是对不起这门语言,也对不起宝贵的五年光阴.我钟爱C++,所以一定要完全搞懂它,理解它.爱一个人的前提是要懂他(她),爱一门语 ...

  9. WP8_UTF8 to GB2312转码 (url网址中带中文字符的处理)

    直接使用例如:http://www.abc.php?name=中文符 ,客户端调用,在服务端修改后,会出现乱码, 而windows phone 又不能直接支持gb2312, 经过大量分析和验证,发现 ...

  10. virtual box 中两个虚拟机 、宿主机 三机互通并且能上外网设置

    virtual box 中两个虚拟机 .宿主机 三机互通并且能上外网设置 1:背景:因为需要学习linux,所以需要在虚拟机里装linux系统,测试要么宿主机与虚拟机linux网络实验测试:要么另一台 ...