获取手机联系人信息(姓名 电话号码)

手机的联系人信息,存放的位置分为两种。一种存放在手机内存里面,一种是存放在sim卡里面。

他们的访问方式都相似,都是把电话号码和联系人姓名是分开存放在数据库中的,只是访问的uri不同。


本文主要讲的是获取手机内存上的联系人信息。

联系人的姓名和电话号码是分开存放在sqlite数据库中的,我们把.db文件导出来,打开看看。

1.这是联系人信息:

获取手机联系人信息(姓名 电话号码)_第1张图片

2.电话号码信息:

获取手机联系人信息(姓名 电话号码)_第2张图片

表之间是通过id来联系的。


访问联系人的uri:

ContactsContract.Contacts.CONTENT_URI

访问电话号码的uri:

ContactsContract.CommonDataKinds.Phone.CONTENT_URI


下面是代码:

public class MainActivity extends BaseActivty {
	/** 所有的联系人信息 */
	private Cursor personCur;
	/** 所有联系人电话号码 */
	private Cursor numberCur;
	/** 联系人的信息集合 */
	private List contactList = new ArrayList();
	/** listview 组件 */
	private ListView conListview;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 加载组件
		conListview = (ListView) findViewById(R.id.lv_contact);

		// 获取手机通讯录信息
		ContentResolver resolver = this.getContentResolver();
		// 获取联系人信息
		personCur = resolver.query(ContactsContract.Contacts.CONTENT_URI, null,
				null, null, null);
		// 循环遍历,获取每个联系人的姓名和电话号码
		while (personCur.moveToNext()) {
			// 新建联系人对象
			ContactInfor cInfor = new ContactInfor();
			// 联系人姓名
			String cname = "";
			// 联系人电话
			String cnum = "";
			// 联系人id号码
			String ID;

			ID = personCur.getString(personCur
					.getColumnIndex(ContactsContract.Contacts._ID));
			// 联系人姓名
			cname = personCur.getString(personCur
					.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

			// id的整型数据
			int id = Integer.parseInt(ID);

			if (id > 0) {
				// 获取指定id号码的电话号码
				Cursor c = resolver.query(
						ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
						null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID
								+ "=" + ID, null, null);
				// 遍历游标
				while (c.moveToNext()) {
					cnum = c.getString(c
							.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
				}

				// 将对象加入到集合中
				cInfor.setcName(cname);
				cInfor.setcPhone(cnum);

				contactList.add(cInfor);
			}
		}

		// 新建联系人适配器
		ContactAdapter conadapter = new ContactAdapter(this, contactList);
		conListview.setAdapter(conadapter);
	}

}

适配器:

/**
 * 呈现所有联系人信息的适配器
 * 
 * @author hongjie
 * 
 */
public class ContactAdapter extends BaseAdapter {

	private Context context;
	private List list;

	/**
	 * 构造器
	 * 
	 * @param context
	 * @param list
	 */
	public ContactAdapter(Context context, List list) {
		this.context = context;
		this.list = list;
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		// 当第一次使用,view为空的时候
		if (convertView == null) {
			convertView = LayoutInflater.from(context).inflate(
					R.layout.main_contact, null);
		}

		// 获取联系人对象
		ContactInfor cinfor = list.get(position);
		// 获取布局组件
		TextView cname = (TextView) convertView.findViewById(R.id.m_name);
		TextView cnumber = (TextView) convertView.findViewById(R.id.m_number);
		// 为组件添加数据
		cname.setText(cinfor.getcName());
		cnumber.setText(cinfor.getcPhone());

		return convertView;
	}
}

效果:

手机的联系人,电话号码就是四个姓的数字:

获取手机联系人信息(姓名 电话号码)_第3张图片

运行的结果:

获取手机联系人信息(姓名 电话号码)_第4张图片


注意:

1.在访问手机联系人的时候,需要添加访问权限:


   
这是读联系人的权限,如果要改写还得添加写权限:

2.这是query方法原型:


    query(Uri uri, String[] projection, String selection,

     String[] selectionArgs, String sortOrder)

    projection:是需要读取的字段

    selection:是数据检索的条件

    selectionArgs:是数据检索条件的参数

    sortOrder:是排序的字段

你可以根据自己的需要,传入特定的参数来提高检索的效率。

3.手机sim卡获取联系人的uri:

Uri uri = Uri.parse("content://icc/adn");


你可能感兴趣的:(android,使用,android,通讯录,sqlite)