Android 选择系统联系人并读取联系人数据
昨天写了两个demo,利用 ContentProvider 和 ContentResolver 实现app之间的类似于数据共享的效果
今天写了一个 尝试获取系统联系人,选择后返回单个联系人数据的demo
作为这样一个demo的大概思路是:
1、点击按钮,跳转到系统联系人界面
2、选择联系人,然后返回到之前的Activity中
3、将选择的联系人信息展示到页面上
1、首先我们要先跳转到系统通讯录
public void sendContacts(View view){
Uri uri = Uri.parse("content://contacts/people");
Intent intent = new Intent(Intent.ACTION_PICK,uri);
startActivityForResult(intent,0);
}
通过设置Uri跳转到系统通讯录,可以看到使用了回调函数实现
2、重写onActivityResult方法,获取数据
/**
* 跳转联系人列表的回调函数
* @param requestCode
* @param resultCode
* @param data
*/
@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[] = getContacts(uri);
//展示至控件上
tv_main_name.setText(contact[0]);
tv_main_number.setText(contact[1]);
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
在该方法中的getContacts(uri),对回调拿到的数据做了处理,拿到我需要的联系人和号码
private String[] getPhoneContacts(Uri uri){
String contact[] = new String[2];
//得到电话本中开始一项的光标
Cursor cursor = cr.query(uri,null,null,null,null);
//拿到了光标数据
if (cursor!=null){
//获取第一条
cursor.moveToFirst();
//获取联系人姓名
contact[0] = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
//获取联系人号码
//1:先获取id
String contactId = cursor.getString(cursor.getColumnIndex("_id"));
//2:根据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;
}
该方法带了一个路径的参数,根据该路径可以拿到选中的联系人
然后查询联系人的id,在继续根据id查询联系人的号码,最后将需要的值返回出去
最后的最后,将值绑定在页面上