Android根据联系人姓名首字符顺序读取通讯录

简介: 本文给出了Android读取通讯录联系人的一般方法,且在读取Android通讯录联系人时候,将结果有序化(按照联系人姓名的首字符依次顺序读取:A ~ Z)。

本文给出了Android读取通讯录联系人的一般方法,且在读取Android通讯录联系人时候,将结果有序化(按照联系人姓名的首字符依次顺序读取:A ~ Z)。

读取的结果如图所示:


现给出实现该种Android通讯录读取的代码:

package zhangphil.contacts;

import java.util.ArrayList;

import android.app.ListActivity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends ListActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		ArrayList<Contact> contacts = new ArrayList<Contact>();
		readContacts(contacts);

		ListView listView = this.getListView();
		ArrayAdapter<Contact> adapter = new MyAdapter(this,
				android.R.layout.simple_list_item_2, contacts);
		listView.setAdapter(adapter);
	}

	private class MyAdapter extends ArrayAdapter<Contact> {

		private int resource;
		private LayoutInflater inflater = null;
		private ArrayList<Contact> contacts;

		public MyAdapter(Context context, int resource,
				ArrayList<Contact> contacts) {
			super(context, resource);
			this.resource = resource;
			this.contacts = contacts;

			inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {

			if (convertView == null)
				convertView = inflater.inflate(resource, null);

			Contact c = getItem(position);

			TextView text1 = (TextView) convertView
					.findViewById(android.R.id.text1);
			TextView text2 = (TextView) convertView
					.findViewById(android.R.id.text2);

			//首字符,分组的依据。
			text1.setText(c.firstLetterOfName());
			
			//详情。
			text2.setText(c.name + " " + c.getPhoneNumbers());

			return convertView;
		}

		@Override
		public Contact getItem(int pos) {
			return contacts.get(pos);
		}

		@Override
		public int getCount() {
			return contacts.size();
		}
	}

	// 读取设备联系人的一般方法。大致流程就是这样,模板化的操作代码。
	private void readContacts(ArrayList<Contact> contacts) {
		Uri uri = Uri.parse("content://com.android.contacts/contacts");
		ContentResolver reslover = this.getContentResolver();

		// 在这里我们给query传递进去一个SORT_KEY_PRIMARY。
		// 告诉ContentResolver获得的结果安装联系人名字的首字母有序排列。
		Cursor cursor = reslover.query(uri, null, null, null,
				android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);

		while (cursor.moveToNext()) {

			// 联系人ID
			String id = cursor
					.getString(cursor
							.getColumnIndex(android.provider.ContactsContract.Contacts._ID));

			// Sort Key,读取的联系人按照姓名从 A->Z 排序分组。
			String sort_key_primary = cursor
					.getString(cursor
							.getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));

			// 获得联系人姓名
			String name = cursor
					.getString(cursor
							.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));

			Contact mContact = new Contact();
			mContact.id = id;
			mContact.name = name;
			mContact.sort_key_primary = sort_key_primary;

			// 获得联系人手机号码
			Cursor phone = reslover.query(
					ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
					ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
							+ id, null, null);

			// 取得电话号码(可能存在多个号码)
			// 因为同一个名字下,用户可能存有一个以上的号,
			// 遍历。
			ArrayList<String> phoneNumbers = new ArrayList<String>();
			while (phone.moveToNext()) {
				int phoneFieldColumnIndex = phone
						.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
				String phoneNumber = phone.getString(phoneFieldColumnIndex);
				phoneNumbers.add(phoneNumber);
			}

			mContact.phoneNumbers = phoneNumbers;

			contacts.add(mContact);
		}
	}

	// 用于装载从联系人数据库中读取到的数据。
	// 结构化数据,便于数据操作和访问。
	private class Contact {
		public String id;
		public String name;
		public String sort_key_primary;
		public ArrayList<String> phoneNumbers;
		
		//获得一个联系人名字的首字符。
		//比如一个人的名字叫“安卓”,那么这个人联系人的首字符是:A。
		public	String	firstLetterOfName(){
			String s=sort_key_primary.charAt(0)+"";
			return	s.toUpperCase();
		}

		public String getPhoneNumbers() {
			String phones = " ";
			for (int i = 0; i < phoneNumbers.size(); i++) {
				phones += "号码" + i + ":" + phoneNumbers.get(i);
			}

			return phones;
		}
	}
}


不要忘记在项目的AndroidManifest.xml文件中添加Android读写通讯录联系人的权限:

 <!-- 写权限 -->
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <!-- 读权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />



相关文章
|
4月前
|
XML Java Android开发
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
72 0
|
8月前
|
Java Android开发
Android 四大组件之ContentProvider 访问通讯录进行增删改查操作
Android 四大组件之ContentProvider 访问通讯录进行增删改查操作
51 0
|
12月前
|
Java Android开发
android12.0(S) 从SD卡导入vCard文件到通讯录 号码带“-“ 如何把横线去除
android12.0(S) 从SD卡导入vCard文件到通讯录 号码带“-“ 如何把横线去除
106 0
|
12月前
|
存储 SQL Java
Android 通讯录号码匹配规则 SQL
Android 通讯录号码匹配规则 SQL
91 0
|
12月前
|
XML 前端开发 Android开发
Android使用RecycleView实现魅族手机通讯录界面
本文主要是通过模仿魅族通讯录,学习一下RecycleView的基本用法
125 0
|
缓存 JSON Java
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
335 1
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
|
Android开发
android操作通讯录的联系人
android操作通讯录的联系人
72 0
|
JSON IDE 编译器
Android 读取csv格式数据文件
Android 读取csv格式数据文件
336 0
Android 读取csv格式数据文件
|
存储 文件存储 数据库
Android SharedPreferences存储数据与读取
SharedPreferences为Android五种数据存储的方式之一,其他四种数据存储分别为:
177 0
|
XML 数据库 Android开发
Android——一个神奇的通讯录APP
联系人总览 效果图 SQLite数据库 建表 CRUD 增 删 改 查 滚动条 联系人分组 数据库数据与滚动条绑定 添加联系人 效果图 添加紧急电话联系人 数据源 添加 新增 编辑与查看联系人 查看 效果图 大图姓氏 数据收发 发 收 编辑及删除 删除 拨号 申请权限 隐式Intent
250 0
Android——一个神奇的通讯录APP