ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext())
{
// 取得联系人名字
int nameFieldColumnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);
String name = cursor.getString(nameFieldColumnIndex);
string += (name);
// 取得联系人ID
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = "
+ contactId, null, null);
// 取得电话号码(可能存在多个号码)
while (phone.moveToNext())
{
String strPhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
string += (":" + strPhoneNumber);
}
string += "\n";
phone.close();
}
cursor.close();
如果有n个联系人且每个联系人都存有电话号码的话,就得查询n+1次。
在园子里看到一个帖子说可以通过
Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "*")
取得所有联系人的信息,我在Android 4.0模拟器跟2.3.7的真机上测试都不成功。
联系人的各种类型的信息都存储在Data表中,所以查询Data表并限制其MIMETYPE为Phone.CONTENT_ITEM_TYPE即可以查到所有姓名与电话
Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {
CommonDataKinds.Phone.NUMBER, CommonDataKinds.Phone.DISPLAY_NAME }, null, null, null);
上述代码可以查到所有联系人的姓名与电话,但是如果直接挨个输出的话会有问题,如果一个人存储了两个电话号码的话,在Data表中会有两条记录,比如一个叫张三的人,存储了他两个电话:11111,22222。那么输出结果中会有两条关于张三的记录,并不会合并到一起,所以我想到先把cursor查询到的所有数据存储到Map里,以DISPLAY_NAME为键,以NUMBER组成的List为值,即
HashMap<String,ArrayList<String>>
于是有了如下代码:
ContentResolver cr = getContentResolver();
HashMap<String,ArrayList<String>> hs=new HashMap<String,ArrayList<String>>();
Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {
CommonDataKinds.Phone.NUMBER, CommonDataKinds.Phone.DISPLAY_NAME }, null, null, null);
while (phone.moveToNext()) {
String strPhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String name = phone.getString(phone.getColumnIndex(CommonDataKinds.Phone.DISPLAY_NAME));
ArrayList<String> ad=hs.get(name);
if(ad==null){
ad=new ArrayList<String>();
ad.add(strPhoneNumber);
hs.put(dis, ad);
}
else
ad.add(strPhoneNumber);
}
phone.close();
这样就可以解决一个姓名对应多个号码的问题,但还有问题,可能是两个联系人同名,但他们属于不同的联系人,在数据库中表现为有不同的contact_id,那么可以将上述代码修改一下,将projection参数处添加上ContactsContract.CommonDataKinds.Phone.CONTACT_ID,然后把Map改为以contact_id为建,以DISPLAY_NAME与NUMBER组成的LIST为值,把DISPLAY_NAME统一存储为LIST的第一项。当然也可以定义一个类,包含姓名字段及电话号码组成的LIST字段,电话号码的LIST中的元素还可以是Map,以号码的TYPE为键。
分享到:
相关推荐
android的SDK做了调整,相应的读取联系人资料有了变化。 这里提供的是如何在2.0包括2.1中读取联系人资料的代码
ASP.NET 2.0 读取配置文件[INI]
附件中包含一个asp.net 2.0读取Excel文件的Demo。流程:首先将客户端的excel文件上传到服务器端,然后返回excel文件的保存路径,最后读取服务器端的excel文件,并在gridview中显示。
基于android studio的联系人读取及电话拨打,参考了《第一行代码》的思路
在android平台的可以读取系统联系人的一个demo,可以自己加工做一些用于调用系统联系人接口的应用。
android应用,读取手机联系人等信息。ContentResolver获取手机联系人、电话
Android读取通讯录中设置邮件的联系人 DEMO Android读取通讯录中设置邮件的联系人 demo
Android实例之读取设备联系人
Android 读取联系人信息
1.获取体感设备;2.彩色帧初始化;3.帧描述;4.彩色帧触发事件;5. 创立一个位图,放入位图需要的东西,即将获取的彩色图像放在位图中;6.最后显示 彩色图像和红外、深度图像的处理...前提需配置好kinect2.0的环境。
Android仿手机读取联系人,并且可以查询联系人 ,还可以点击发送发短信。
一个简单的demo,演示如何通过内容提供器读取手机联系人。
安卓客户端链接服务器读取联系人信息,包含姓名、电话、头像
这个资源来自于ArcGis官方博客,提取了其中的Android部分。
Android读取联系人代码示例,相关文章请访问:http://hyz301.iteye.com/blog/2211950
Asp.Net2.0读取-修改-新增(配置文件web.config)可以是 ***.config里面有3个文件操作类,System.config,使用文档
读取手机联系人并显示的一个例子demo 提醒:下载后评论可返还资源分1分
Android默认浏览器会读取联系人,修改如下
javafx 2.0读取_简单表格的案例_oracle数据组装成
Android读取短信和联系人