文档章节

读取通讯录联系人

mutouzhang
 mutouzhang
发布于 2014/05/05 14:50
字数 679
阅读 424
收藏 3


先添加权限


根据号码查询联系人姓名

查询data表,根据data1字段(因为联系人姓名已知 where data1 = phoneNumber),返回mimetype和_id字段 

如果返回的cursor不为空 且cursor.getCount长度大于0,则遍历mimetype(0下标元素)和raw_contact_id(1下标元素).

在遍历时,如果mimetype与vnd.android.cursor.item/phone_v2相同(即数据类型是号码)<---------查询的是data表 但实际上查询的是view视图 所以mimetype返回的string 可以打印下看看--------------,则根据已获取的raw_contact_id查询姓名字段

如果返回的cursor不为空且长度大于0,则遍历name(0下标元素)

切记关闭这2个cursor

//根据号码查询联系人姓名
	public void queryContact(String number){
	//联系人涉及到两个表
	Uri uri1 = Uri.parse("content://com.android.contacts/data");
	Uri uri2 = Uri.parse("content://com.android.contacts/raw_contacts");
	ContentResolver resolver = getContentResolver();
//	Cursor cursor = resolver.query(uri1 , new String[]{"mimetype","_id"}, "data1=?", new String[]{number}, null);//这一行有问题 按理不应该查询_id
	Cursor cursor = resolver.query(uri1 , new String[]{"mimetype","raw_contact_id"}, "data1=?", new String[]{number}, null);
	if(cursor != null && cursor.getCount() > 0){
		while(cursor.moveToNext()){
			String type = cursor.getString(0);
			int raw_contact_id = cursor.getInt(1);
			System.out.println(raw_contact_id);
			System.out.println(type);
			if("vnd.android.cursor.item/phone_v2".equals(type)){
				Cursor cursor2 = resolver.query(uri2, new String[]{"display_name"}, "contact_id = ?", new String[]{String.valueOf(raw_contact_id)}, null);
				if(cursor2 != null && cursor2.getCount() > 0){
					while(cursor2.moveToNext()){
						String name = cursor2.getString(0);
						System.out.println(name);
					}
					cursor2.close();
				}
			}
		}
		cursor.close();
	}
}




//根据姓名查询联系人号码 未判断如果是多号码的话出现的是哪一个 经测试 显示的是第2个号码 或者多号码的最后一个 

查询raw_contacts表,根据display_name字段,返回contact_id字段

如果返回的cursor不为空,且长度大于0,则遍历contact_id(0下标元素)

在遍历时,根据取得的contact_id和mimetype(已经知道需要找号码,即mimetype表中vnd.android.cursor.item/phone_v2,其_id为5)来查询data1字段

如果返回的cursor不为空且长度大于0,则遍历data1(0下标元素)

切记关闭这2个cursor

//根据联系人姓名查号码 如果在数据库中不存在 那么返回的是空字符串
	public void queryContactByName(String name){
		//联系人涉及到两个表
		Uri uri1 = Uri.parse("content://com.android.contacts/data");//data表的uri
		Uri uri2 = Uri.parse("content://com.android.contacts/raw_contacts");//raw_contacts表的uri
		ContentResolver resolver = getContentResolver();
		Cursor cursor = resolver.query(uri2 , new String[]{"contact_id"}, "display_name=?", new String[]{name}, null);
		if(cursor != null && cursor.getCount() > 0){
			while(cursor.moveToNext()){
				String contact_id = cursor.getString(0);
				System.out.println("查询到的contact_id="+contact_id);
				Cursor cursor2 = resolver.query(uri1, new String[]{"data1"}, "contact_id = ?" +  "and mimetype = ?", new String[]{String.valueOf(contact_id),"vnd.android.cursor.item/phone_v2"}, null);
					if(cursor2 != null && cursor2.getCount() > 0){
						while(cursor2.moveToNext()){
							String number = cursor2.getString(0);
							System.out.println(number);
						}
						cursor2.close();
					}
			}
			cursor.close();
		}
	}



这个类对根据姓名获取的电话号码进行了去除空格和“-”处理 因为在数据库里面的号码是以1 234-444-444的格式进行储存的

public class RemovePhoneNumberSpace {

	public static String getNormativePhoneNumber(String unNormativePhoneNumber) {
		
		String removeCharPhoneNumber = "";
		
		if ( !"".equals(unNormativePhoneNumber)) {
			String removeSpacePhoneNumber = unNormativePhoneNumber.replaceAll(" ", "");
			removeCharPhoneNumber = removeSpacePhoneNumber.replaceAll("-", "");
			
		}
		
		return removeCharPhoneNumber;
		
	}
	
}

























© 著作权归作者所有

共有 人打赏支持
mutouzhang
粉丝 6
博文 190
码字总数 91235
作品 0
洛阳
程序员
ios(包括6、7)应用程序引用系统通讯录的方法 [亲测可行]

由于ios系统对用户隐私的控制,第三方应用程序只能通过苹果官方接口调用系统通讯录,不能像android那样直接操作通讯录数据库。 一般地,使用系统自带通讯录的方法有两种,一种是直接将整个通...

Align
2016/01/08
18
0
Android 的 Intents 和 Intent Filters(实例部分)

引言 上篇我们介绍了Intents和Intent Filters的理论部分,主要是介绍了:activities、services、broadcastreceivers三种组件的Intent机制两种Intent(显式和隐式)及它们如何去匹配目的组件、...

鉴客
2011/09/28
886
0
Message Template

一个简单的短信模版应用。即为某个联系人制定好短信模版,加上联系人的手机好吗,之后直接点击这个联系人,就会跳转到设备发短信的界面,并且自动填充之前已经定制好的短息内容。Demo还可以读...

匿名
2012/10/27
615
0
一个App完成入门篇(六)- 完成通讯录页面

第五章和第六章间隔时间有点长,对不起大家了。下面继续。 本节教程将要教会大家如何加载本地通讯录。 导入项目 导入通讯录 自定义js模块 发送和订阅page消息 将要学习的demo效果图如下所示 ...

jonh_felix
2016/04/22
825
0
IOS获取系统通讯录联系人信息

IOS获取系统通讯录联系人信息 一、权限注册 随着apple对用户隐私的越来越重视,IOS系统的权限设置也更加严格,在获取系统通讯录之前,我们必须获得用户的授权。权限申请代码示例如下: ? 1 ...

北方人在上海
2015/09/15
282
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 入门 - 进阶篇(4)- REST访问(RestTemplate)

经常需要发送一个GET/POST请求到其他系统(REST API),通过JDK自带的HttpURLConnection、Apache HttpClient、Netty 4、OkHTTP 2/3都可以实现。 HttpClient的使用:http://rensanning.iteye.c...

onedotdot
21分钟前
1
0
Wi-Fi也有版本号了!

据Solidot消息,行业组织 Wi-Fi 联盟宣布当前的版本 Wi-Fi 802.11ac 重命名为 Wi-Fi 5,而下一个版本 802.11ax 重命名为 Wi-Fi 6,之前的版本 802.11n 改名为 Wi-Fi 4。 Wi-Fi 标准之前使用单...

linux-tao
23分钟前
3
0
项目经验不丰富、技术不突出的程序员怎么打动面试官?

前言 相信不少的程序员都有过类似的困惑:如果我没有大型的项目经历,也不能靠技术征服面试官,那我要怎么才能给面试官留下一个好印象呢? 按照本人的面试经验来说,面试主要看几点:项目经验...

Mamba1
33分钟前
2
0
MyBatis 源码分析----MyBatis 整体架构概要说明

MyBatis整体架构 MyBatis的整体架构分为三层1:基础支持层,2:核心处理层,3:接口层 1:基础支持层: 1-1反射模块: 该模块对Java 原生的反射进行了良好的封装,提供了更加简洁易用的API ,...

西瓜1994
39分钟前
6
0
如何让 J2Cache 在多种编程语言环境中使用

现在的系统是越来越复杂了,不仅仅是功能复杂,系统结构也非常复杂,而且经常在一个系统里包含几种不同语言编写的子系统。例如用 JavaScript 做前端开发、用 Java/PHP 等等做后端,C/C++/Go ...

红薯
41分钟前
46
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部