当前位置: 代码迷 >> Android >> Android依据联系人姓名首字符顺序读取通讯录
  详细解决方案

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

热度:10   发布时间:2016-04-27 23:39:56.0
Android根据联系人姓名首字符顺序读取通讯录

本文给出了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" />




版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案