说白了就是通过内容提供者(ContentProvider)访问数据库的联系人数据库表,通过多表联查实现提取联系人的姓名以及电话号码,同时将数据库的联系人绑定到List集合中,展示在List中,大概就是这样.
直接上代码
通过按钮的onClick直接调用MainActivity中写的方法.
public void getContents(View view){
//获取联系人raw_content
//id name
Uri uri=Uri.parse("content://com.android.contacts/raw_contacts");
Cursor cursor=cr.query(uri,null,null,null,null);
while(cursor.moveToNext()){
int id=cursor.getInt(cursor.getColumnIndex("_id"));
String name=cursor.getString(cursor.getColumnIndex("display_name"));
Log.i("test",id+" "+name);
//继续获取相对应的联系人的数据(电话号码)
Uri uriData=Uri.parse("content://com.android.contacts/raw_contacts/"+id+"/data");
Cursor cursorData=cr.query(uriData,null,null,null,null);
while(cursorData.moveToNext()){
String data1=cursorData.getString(cursorData.getColumnIndex("data1"));
//int type=cursorData.getInt(cursorData.getColumnIndex("mimetype_id"));
String type=cursorData.getString(cursorData.getColumnIndex("mimetype"));
if ("vnd.android.cursor.item/phone_v2".equals(type)){
Map map = new HashMap();
map.put("id",id+"");
map.put("name",name+"");
map.put("number",data1+"");
list.add(map);
Log.i("test"," "+data1+":"+type);
}
}
}
//适配器
adapter = new SimpleAdapter(this, list, R.layout.item_list,new String[]{"id","name","number"},new int[]{R.id.id,R.id.name,R.id.number});
listView.setAdapter(adapter);
}
适配器就不用说了吧,我这里用的是SimpleAdapter,同时也可以根据自己的喜欢用不同的适配器.
注意这里要加三个权限:
配置完清单文件后就可以实现吧联系人绑定到listView 中了.
然后还有就是点击按钮跳转到系统通讯录页面并拿到 相应绑定联系人到List中
还是跟上面一样, 通过按钮的onClick直接调用MainActivity中写的方法.
首先要做的是跳转到通讯录页面
public void getContent(View view){
Uri uri = Uri.parse("content://contacts/people");
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 0:
if(data==null)
{
return;
}
//处理返回的data,获取选择的联系人信息
Uri uri=data.getData();
String contact[]=getPhoneContacts(uri);
Map map = new HashMap();
map.put("name",contact[0]);
map.put("number",contact[1]);
list.clear();
list.add(map);
adapter = new SimpleAdapter(this, list, R.layout.item_list,new String[]{"id","name","number"},new int[]{R.id.id,R.id.name,R.id.number});
listView.setAdapter(adapter);
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
然后在根据相应
id查询data表中的数据,
拿到联系人的,名字以及电话号码
private String[] getPhoneContacts(Uri uri){
String contact[] =new String[2];
// //得到ContentResolver对象
// ContentResolver cr = getContentResolver();
//取得电话本中开始一项的光标
Cursor cursor=cr.query(uri,null,null,null,null);
//拿到光标数据
if(cursor!=null)
{
//获取第一条
cursor.moveToFirst();
//取得联系人姓名
contact[0]=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
//取得电话号码
//现获取id
String contactId = cursor.getString(cursor.getColumnIndex("_id"));
//根据id查询data表中的数据
Cursor cursorData = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null);
if(cursorData != null){
cursorData.moveToFirst();
contact[1] = cursorData.getString(cursorData.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
}
return contact;
}
PS:大概就是这样了,其实也没什么好说的,就是通过按钮onClick直接调用方法进行对联系人表的多表联查
拿到对应自己想拿到的信息,然后跳转到通讯人页面拿值也跟上面的差不多,只不过要拿到对象的联系人id
处理返回的data获取选择的联系人信息,然后查询获取的id对应得联系人数据,实例化适配器,把数据全部给Lisy
设置适配器,就可以把跳转通讯录选择点击的联系人信息返回到开始点击按钮的界面,达到了把点击对应得联系人显示到listView中,
如有什么问题,疑问请把问题留在评论里, 人无完人金无足赤,还希望有大家的点评,让我以后可以更加完善自己.