读取通讯录有两种方式,一种方式是参照上篇文章关于android通讯录的数据库表来获取,另一种就是利用系统自带的一种读取通讯录的方式。
先使用后一种简单的方式:
这是获取手机通讯录中的信息。可以根据Phone中对应的字段名区分是哪几张表的数据。实际系统在获取这些通讯录的时候,是通过将几张表关联查询得到的。
/**
* 获取所有手机里的通讯录
*/
private List<ContactModel> getAllContactsFromPhone() {
List<ContactModel> contactList = new ArrayList<ContactModel>();
String[] PHONES_PROJECTION = new String[] { Phone._ID,
Phone.RAW_CONTACT_ID, Phone.CONTACT_ID, Phone.DISPLAY_NAME,
Phone.NUMBER, Phone.CUSTOM_RINGTONE };
ContentResolver resolver = context.getContentResolver();
// 获取手机联系人
Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,
PHONES_PROJECTION, Phone.MIMETYPE + "='"
+ Phone.CONTENT_ITEM_TYPE + "'", null, null);
if (phoneCursor != null) {
while (phoneCursor.moveToNext()) {
// 得到手机号码
String phoneNumberString = phoneCursor.getString(phoneCursor
.getColumnIndex(Phone.NUMBER));
//过滤手机号,如果不需要可以去掉
String phoneNumber = phoneNumberFilter(phoneNumberString);
if (phoneNumber != null) {
String id = phoneCursor.getString(phoneCursor
.getColumnIndex(Phone.RAW_CONTACT_ID));
String contactId = phoneCursor.getString(phoneCursor
.getColumnIndex(Phone.CONTACT_ID));
// 得到联系人名称
String contactName = phoneCursor.getString(phoneCursor
.getColumnIndex(Phone.DISPLAY_NAME));
String customRingtone = phoneCursor.getString(phoneCursor
.getColumnIndex(Phone.CUSTOM_RINGTONE));
ContactModel model = new ContactModel();
model.setId(id);
model.setContactId(contactId);
model.setDisplayName(contactName);
model.setPhoneNumber(phoneNumber);
model.setCustomRingtone(customRingtone);
contactList.add(model);
}
}
phoneCursor.close();
}
return contactList;
}
通讯录还包括SIM卡中,接下来是获取sim卡中的通讯录:
/**
* 获取所有SIM卡的通讯录
*/
private List<ContactModel> getAllContactsFromSIM() {
List<ContactModel> contactList = new ArrayList<ContactModel>();
String[] PHONES_PROJECTION = new String[] { Phone.DISPLAY_NAME,
Phone.NUMBER };
ContentResolver resolver = context.getContentResolver();
// 获取Sims卡联系人
Uri uri = Uri.parse("content://icc/adn");
Cursor phoneCursor = resolver.query(uri, PHONES_PROJECTION, null, null,
null);
if (phoneCursor != null) {
while (phoneCursor.moveToNext()) {
// 得到手机号码
String phoneNumberString = phoneCursor.getString(phoneCursor
.getColumnIndex(Phone.NUMBER));
String phoneNumber = phoneNumberFilter(phoneNumberString);
if (phoneNumber != null) {
// 得到联系人名称
String contactName = phoneCursor.getString(phoneCursor
.getColumnIndex(Phone.DISPLAY_NAME));
ContactModel model = new ContactModel();
model.setDisplayName(contactName);
model.setPhoneNumber(phoneNumber);
contactList.add(model);
}
}
phoneCursor.close();
}
return contactList;
}
sim卡通讯录因为不会存放在手机的数据库中,所以所包含的信息有限。
对于上面的方法获取通讯录,都是将通讯录中的所有数据获取,但有的时候我们需要将通讯录进行分组显示,也就是说需要将通讯录中默认的分组信息获取到,显示出来,然后再根据分组来获取里面对应的通讯录信息。这时候就需要通过利用之前讲到的数据库表格来获取了。
第二种,分组获取通讯录:
/**
* 获取分组通讯录
*
* @return
*/
private List<ContactGroupModel> getGroupContacts() {
int count = 0;
ContentResolver resolver = context.getContentResolver();
// 获取所有的groupId,通过groups表
List<ContactGroupModel> contactGroupList = new ArrayList<ContactGroupModel>();
Cursor cursor = resolver.query(ContactsContract.Groups.CONTENT_URI,
new String[] { ContactsContract.Groups._ID,
ContactsContract.Groups.TITLE },
ContactsContract.Groups.GROUP_VISIBLE + "=?",
new String[] { "0" }, ContactsContract.Groups._ID);
while (cursor.moveToNext()) {
String id = cursor.getString(cursor
.getColumnIndex(ContactsContract.Groups._ID));
String title = cursor.getString(cursor
.getColumnIndex(ContactsContract.Groups.TITLE));
ContactGroupModel groupModel = new ContactGroupModel();
groupModel.setGroupDisplayName(title);
groupModel.setGroupId(id);
contactGroupList.add(groupModel);
}
if (cursor != null) {
cursor.close();
}
// 根据groupId获取这一组的人员raw_contact_id。根据data表,当获取每个分组所包含的人时,DATA1这个字段代表的含义就是组号,对应的mimetype_id是11
String[] groupRawContactId = new String[] { ContactsContract.Data.RAW_CONTACT_ID };
for (ContactGroupModel groupModel : contactGroupList) {
// 获取到这一组中所有人的raw_contact_id
Cursor rawContactIdCursor = resolver
.query(ContactsContract.Data.CONTENT_URI,
groupRawContactId, ContactsContract.Data.DATA1
+ "=" + groupModel.getGroupId(), null, null);
if (rawContactIdCursor != null) {
// 拼成了在这个分组里面的所有人的raw_contact_id
StringBuffer sb = new StringBuffer(" IN (0");
while (rawContactIdCursor.moveToNext()) {
long rawContactId = rawContactIdCursor.getLong(0);
sb.append(",").append(rawContactId);
}
sb.append(")");
rawContactIdCursor.close();
// 取名字,通过RawContacts表将对应的在上面取到的raw_contact_id对应的用户显示的名称
Map<String, String[]> rawContactIdName = new HashMap<String, String[]>();
Cursor nameCursor = resolver.query(
ContactsContract.RawContacts.CONTENT_URI, new String[] {
ContactsContract.RawContacts._ID,
ContactsContract.RawContacts.CONTACT_ID,
Phone.DISPLAY_NAME, Phone.CUSTOM_RINGTONE },
ContactsContract.RawContacts._ID + sb.toString(), null,
null);
if (nameCursor != null) {
while (nameCursor.moveToNext()) {
String id = nameCursor.getString(0);
String contactId = nameCursor.getString(1);
String name = nameCursor.getString(2);
String customRingtone = nameCursor.getString(3);
rawContactIdName.put(id, new String[] { name,
contactId, customRingtone });
}
nameCursor.close();
}
// 取号码,再回到data表中,此时通过上次获取的分组对应的raw_contact_id来取到对应的手机号码
List<ContactModel> contactList = new ArrayList<ContactModel>();
Cursor phoneNumberCursor = resolver.query(
ContactsContract.Data.CONTENT_URI, new String[] {
ContactsContract.Data._ID,
ContactsContract.Data.DATA4,
ContactsContract.Data.RAW_CONTACT_ID },
ContactsContract.Data.RAW_CONTACT_ID + sb.toString()
+ " and " + ContactsContract.Data.MIMETYPE
+ "='" + Phone.CONTENT_ITEM_TYPE + "'", null,
null);
if (phoneNumberCursor != null) {
while (phoneNumberCursor.moveToNext()) {
String phoneNumberString = phoneNumberCursor
.getString(1);
// 过滤手机号
String phoneNumber = phoneNumberFilter(phoneNumberString);
if (phoneNumber != null) {
String rawContactId = phoneNumberCursor
.getString(2);
ContactModel model = new ContactModel();
model.setId(rawContactId);
model.setPhoneNumber(phoneNumber);
String[] nameRingtone = rawContactIdName
.get(rawContactId);
model.setDisplayName(nameRingtone[0]);
model.setContactId(nameRingtone[1]);
model.setCustomRingtone(nameRingtone[2]);
contactList.add(model);
if (nameRingtone[1] != null
&& !"".equals(nameRingtone[1])) {
System.out.println("个性振铃 :id = " + rawContactId
+ "|" + phoneNumber + "|"
+ nameRingtone[0] + "|"
+ nameRingtone[1]);
}
}
}
phoneNumberCursor.close();
}
count += contactList.size();
groupModel.setContactList(contactList);
}
}
System.out.println("总数据个数 count = " + count);
return contactGroupList;
}
上面获取分组通讯录就是利用这样的表关联来完成的,逐个表进行查询,然后取到对应的名字和号码
分享到:
相关推荐
在Android系统中,通讯录管理是一项重要的功能,它涉及到用户个人信息的存储和访问。这篇教程将深入探讨如何在Android应用中获取联系人信息、通话记录以及短信消息。首先,我们来了解一下基本概念。 1. **获取联系...
客户端将通过HTTP请求发送JSON或XML格式的通讯录数据,服务端则解析并存储这些数据。这里是一个简单的HTTP POST请求示例: ```java URL url = new URL("http://yourserver.com/contacts"); HttpURLConnection conn ...
综上所述,"Android通讯录附搜索及字母索引Demo"涵盖了Android开发中的多个重要概念和技术,对于想要深入学习Android应用开发,尤其是涉及数据存储和UI交互的开发者来说,这是一个宝贵的实践资源。通过这个Demo,...
《Android通讯录项目详解》 在移动开发领域,Android平台上的通讯录管理是不可或缺的一部分,它涉及到用户数据的存储、查询、更新以及删除等操作。本篇将详细探讨基于Android的通讯录项目,主要涉及的技术点包括...
通讯录数据通常是姓名列表,我们可以通过对姓名的首字母进行排序,然后将排序后的数据传递给`Adapter`。在Android中,这可以通过`Collections.sort()`方法实现,配合自定义的比较器来完成。 模糊查询搜索框是通讯录...
在Android系统中,内容提供者(Content ...总结,Android通讯录内容提供者是访问和管理用户联系人数据的核心工具。通过学习和实践,开发者可以构建出强大的通讯录应用,提升用户体验,同时确保数据的安全和隐私。
以上就是基于标题“Android通讯录的开发-完整代码”和描述“Android]通讯录的开发_完整代码,项目可直接运行,欢迎下载学习”的主要技术知识点。通过学习和实践这个项目,开发者可以深入了解Android应用开发的各个...
《Android通讯录系统详解——基于adt-bundle-windows的实现》 在移动设备上,通讯录是用户日常使用的重要功能之一。Android系统以其开放性和灵活性,为开发者提供了丰富的API,使得开发自定义通讯录应用成为可能。...
该压缩包文件“Android 获取通讯录程序源码-IT计算机-毕业设计.zip”是一个针对Android平台的毕业设计项目,旨在帮助学生了解并实践如何在Android应用程序中获取和操作用户的通讯录数据。通过学习和分析这个源码,...
6. **权限管理**:由于涉及用户数据,Android应用在读写联系人时需要获取相应的权限。在AndroidManifest.xml文件中,需要声明`<uses-permission>`标签,如`<uses-permission android:name="android.permission.READ_...
【Android通讯录源码分析】 本项目是一款基于Android平台的通讯录应用,它不仅提供了基本的本地联系人存储和检索功能,还集成了拨打电话和发送短信的能力,非常适合用于学习和理解Android应用开发中的核心概念和...
ContentResolver是Android系统服务的接口,它提供对ContentProvider的访问,而ContactsContract则是Android系统提供的通讯录数据的常量和类。 以下是获取所有联系人的基本步骤: 1. 创建ContentResolver实例: ```...
在Android中,通讯录数据存储在ContentProvider中,可以通过ContentResolver查询。首先,定义一个方法用于获取所有的联系人: ```java public List<Contact> getAllContacts(ContentResolver resolver) { List...
这份"Android 获取通讯录程序源码.zip"包含了实现这一功能的完整源代码,可以帮助开发者深入理解如何在Android系统中访问和操作用户通讯录数据。下面我们将详细探讨Android通讯录API的使用、权限管理以及源码中的...
本教程将深入探讨如何在Android应用中实现对通讯录的获取、添加、删除等操作,通过提供的"Android通讯录详细demo",你可以更好地理解这些概念。 首先,让我们了解Android系统中的通讯录API。Android提供了一个名为`...
2. **数据存储**:通讯录数据通常从系统联系人API获取,使用`ContentResolver`来查询和操作联系人信息。开发者可能还使用SQLite数据库来缓存部分数据,提高加载速度。 3. **过滤和搜索**:搜索功能的实现可能涉及到...
本教程将深入探讨如何在Android中与通讯录进行交互,尤其是涉及到有索引和分割的通讯录数据处理。 首先,我们需要了解Android提供的Contacts Provider,这是Android系统用于存储和检索联系人数据的API。通过...
本项目“基于Android通讯录的实现”旨在为初学者和开发者提供一个完整的实现案例,帮助他们理解和掌握Android系统中如何与通讯录数据进行交互。 1. **Android权限管理**: 在Android中,访问通讯录数据需要获取...
当用户授予权限后,我们可以通过ContentResolver和ContactsContract类来访问通讯录数据。以下是一个简单的示例,展示如何获取联系人列表: ```java Cursor cursor = getContentResolver().query(ContactsContract....
在Android平台上,开发人员经常需要访问用户的通讯录数据来实现特定功能,如联系人同步、消息发送等。本文将深入探讨如何使用Android Studio来读取手机的通讯录,这是一个非常实用且基础的知识点,适用于移动应用...