大家好,今天晚上我给大家分享的是使用内容提供者读取手机联系人信息,并显示在列表里。现在很多应用都有涉及到读取手机联系人的功能,其实很好操作,根据系统联系人的表字段方可提出数据。因为涉及到个人隐私问题,我就不截图了,相信大家能清晰的想象到显示页面是怎样状况的。
public class MainActivity extends Activity {
//自定义ListView
private ListView list;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);'
list = (ListView) findViewById(R.id.list);
//将方法返回的结果保存在ArrayList集合里
ArrayList<Map<String, String>> data = readContacts();
//创建系统自带自配器SimpleAdapter,
//参数一:上下文,参数二:显示的数据。参数三:资源布局。,参数四:从哪里来 。参数五:到哪里去,到指定控件的Id
SimpleAdapter adapter = new SimpleAdapter(this, data,
R.layout.item_list, new String[] { "name", "phone" },
new int[] { R.id.name_tv, R.id.phone_tv });
//展示适配器数据
list.setAdapter(adapter);
}
//读取联系人方法
private ArrayList<Map<String, String>> readContacts() {
ArrayList<Map<String, String>> data = new ArrayList<Map<String, String>>();
//首先,从raw_contacts表中读取联系人的id("contact_id")
//其次,根据contact_id从data表中查询出相应的电话号码,和联系人名称
//然后,根据mimetype来区分那个是联系人,那个是电话号码
//得到raw_contacts的uri
Uri rawContactUri = Uri
.parse("content://com.android.contacts/raw_contacts");
//得到data的uri
Uri dataUri = Uri.parse("content://com.android.contacts/data");
//通过内容提供者获取手机联系人
Cursor rawCursor = getContentResolver().query(rawContactUri,
new String[] {"contact_id" }, null, null, null);
if (rawCursor != null) {
//游标遍历
while (rawCursor.moveToNext()) {
//得到游标遍历的第一行数据,就是contact_id的数据
String contactId = rawCursor.getString(0);
//根据contact_id从data表值查询相应的电话号码和联系人名称,实际查询的是视图view_data
Cursor dataCursor = getContentResolver().query(dataUri,
new String[] { "data1", "mimetype" }, "contact_id=?",
new String[] { contactId }, null);
if (dataCursor != null) {
//创建集合ma,用来存放数据
Map<String, String> map = new HashMap<String, String>();
//dataCursor游标遍历
while (dataCursor.moveToNext()) {
//得到data表中的data1值
String data1 = dataCursor.getString(0);
//得到data表中的mimetype值
String mimetype = dataCursor.getString(1);
//根据mimetype类型判断哪个是电话号码。哪个是联系人
if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
//把电话号码存放在map集合,key值:phoe
map.put("phone", data1);
} else if ("vnd.android.cursor.item/name"
.equals(mimetype)) {
//把联系人存放在map集合里,key值:name
map.put("name", data1);
}
}
//添加到ArrayList里
data.add(map);
//关闭游标
dataCursor.close();
}
}
rawCursor.close();
}
//返回data数据
return data;
}
}
通过以上方便快捷的方式就可以读取手机联系人,简单的总结是:获取raw_contacts表中contact_id,然后根据contact_id,获取data表中的data1,mimetype,最后,根据mimetype类型,就可以判断是电话号码还是手机联系人。
恩,今天就到这了。大家睡个好觉。