`
zartzwj
  • 浏览: 27035 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android通讯录数据获取

 
阅读更多

读取通讯录有两种方式,一种方式是参照上篇文章关于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系统中,通讯录管理是一项重要的功能,它涉及到用户个人信息的存储和访问。这篇教程将深入探讨如何在Android应用中获取联系人信息、通话记录以及短信消息。首先,我们来了解一下基本概念。 1. **获取联系...

    获取Android手机通讯录

    客户端将通过HTTP请求发送JSON或XML格式的通讯录数据,服务端则解析并存储这些数据。这里是一个简单的HTTP POST请求示例: ```java URL url = new URL("http://yourserver.com/contacts"); HttpURLConnection conn ...

    Android通讯录附搜索及字母索引Demo

    综上所述,"Android通讯录附搜索及字母索引Demo"涵盖了Android开发中的多个重要概念和技术,对于想要深入学习Android应用开发,尤其是涉及数据存储和UI交互的开发者来说,这是一个宝贵的实践资源。通过这个Demo,...

    Android通讯录.zip

    《Android通讯录项目详解》 在移动开发领域,Android平台上的通讯录管理是不可或缺的一部分,它涉及到用户数据的存储、查询、更新以及删除等操作。本篇将详细探讨基于Android的通讯录项目,主要涉及的技术点包括...

    android 通讯录(A-Z)带可模糊查询搜索框

    通讯录数据通常是姓名列表,我们可以通过对姓名的首字母进行排序,然后将排序后的数据传递给`Adapter`。在Android中,这可以通过`Collections.sort()`方法实现,配合自定义的比较器来完成。 模糊查询搜索框是通讯录...

    使用android通讯录中的内容提供者实例

    在Android系统中,内容提供者(Content ...总结,Android通讯录内容提供者是访问和管理用户联系人数据的核心工具。通过学习和实践,开发者可以构建出强大的通讯录应用,提升用户体验,同时确保数据的安全和隐私。

    Android通讯录的开发-完整代码

    以上就是基于标题“Android通讯录的开发-完整代码”和描述“Android]通讯录的开发_完整代码,项目可直接运行,欢迎下载学习”的主要技术知识点。通过学习和实践这个项目,开发者可以深入了解Android应用开发的各个...

    android通讯录(完整,可运行)

    《Android通讯录系统详解——基于adt-bundle-windows的实现》 在移动设备上,通讯录是用户日常使用的重要功能之一。Android系统以其开放性和灵活性,为开发者提供了丰富的API,使得开发自定义通讯录应用成为可能。...

    Android 获取通讯录程序源码-IT计算机-毕业设计.zip

    该压缩包文件“Android 获取通讯录程序源码-IT计算机-毕业设计.zip”是一个针对Android平台的毕业设计项目,旨在帮助学生了解并实践如何在Android应用程序中获取和操作用户的通讯录数据。通过学习和分析这个源码,...

    android通讯录简单实现

    6. **权限管理**:由于涉及用户数据,Android应用在读写联系人时需要获取相应的权限。在AndroidManifest.xml文件中,需要声明`&lt;uses-permission&gt;`标签,如`&lt;uses-permission android:name="android.permission.READ_...

    Android通讯录源码.rar

    【Android通讯录源码分析】 本项目是一款基于Android平台的通讯录应用,它不仅提供了基本的本地联系人存储和检索功能,还集成了拨打电话和发送短信的能力,非常适合用于学习和理解Android应用开发中的核心概念和...

    android获取通讯录源码

    ContentResolver是Android系统服务的接口,它提供对ContentProvider的访问,而ContactsContract则是Android系统提供的通讯录数据的常量和类。 以下是获取所有联系人的基本步骤: 1. 创建ContentResolver实例: ```...

    Android获取手机通讯录信息demo

    在Android中,通讯录数据存储在ContentProvider中,可以通过ContentResolver查询。首先,定义一个方法用于获取所有的联系人: ```java public List&lt;Contact&gt; getAllContacts(ContentResolver resolver) { List...

    Android 获取通讯录程序源码.zip

    这份"Android 获取通讯录程序源码.zip"包含了实现这一功能的完整源代码,可以帮助开发者深入理解如何在Android系统中访问和操作用户通讯录数据。下面我们将详细探讨Android通讯录API的使用、权限管理以及源码中的...

    Android通讯录详细demo

    本教程将深入探讨如何在Android应用中实现对通讯录的获取、添加、删除等操作,通过提供的"Android通讯录详细demo",你可以更好地理解这些概念。 首先,让我们了解Android系统中的通讯录API。Android提供了一个名为`...

    仿android通讯录demo

    2. **数据存储**:通讯录数据通常从系统联系人API获取,使用`ContentResolver`来查询和操作联系人信息。开发者可能还使用SQLite数据库来缓存部分数据,提高加载速度。 3. **过滤和搜索**:搜索功能的实现可能涉及到...

    android 通讯录 (有索引)

    本教程将深入探讨如何在Android中与通讯录进行交互,尤其是涉及到有索引和分割的通讯录数据处理。 首先,我们需要了解Android提供的Contacts Provider,这是Android系统用于存储和检索联系人数据的API。通过...

    基于android通讯录的实现

    本项目“基于Android通讯录的实现”旨在为初学者和开发者提供一个完整的实现案例,帮助他们理解和掌握Android系统中如何与通讯录数据进行交互。 1. **Android权限管理**: 在Android中,访问通讯录数据需要获取...

    android调用通讯录获取联系人Demo

    当用户授予权限后,我们可以通过ContentResolver和ContactsContract类来访问通讯录数据。以下是一个简单的示例,展示如何获取联系人列表: ```java Cursor cursor = getContentResolver().query(ContactsContract....

    Android studio—读取通讯录

    在Android平台上,开发人员经常需要访问用户的通讯录数据来实现特定功能,如联系人同步、消息发送等。本文将深入探讨如何使用Android Studio来读取手机的通讯录,这是一个非常实用且基础的知识点,适用于移动应用...

Global site tag (gtag.js) - Google Analytics