最近小wei在学习安卓,还在学习中。第一次发博客,诸多简陋处,还请包含。
在查询手机内部联系人之前需要知道一点:
联系人表(Contact.CONTENT_URI)和联系人信息表(CommomDataKinds.Phone.CONTENT_URL)上的联系人信息和电话号码不在同一张表 上
两者之间由联系人表和联系人信息表的外键联系起来。
知道这个以后,就可以有方法来得到手机内部的联系人信息!
通过查询所有的联系人名字,然后得到对应的联系人id,因为id为两表的外键,所以可以通过得到的id值来推出对应联系人的手机号码!
联系人名字~~~联系人id~~~联系人手机号码
在新创建的项目里定义一个Listview,这个ListView需要一个adapter来填充数据
那该用哪个adapter呢?因为在两张表里分别有两个cuseradapter(用于取得对应id),这两个adapter都是我们不需要用的。故不适用simplecuseradapter。相反,可以使用baseadapter:通过联系人的名字得到对应id值,形成一个javabean的对象。
getview 是子布局视图。
代码实现:
1在activity_main.xml中定义一个Listview
2新建一个PhoneNumber类,javabean形式 定义两个变量 phontId,userNam,来填充数据
3.新建一个Myadapter类,继承baseAdabpter,定义两个变量:数据源和子布局,把adapter完善,包括item_main_lv.xml和viewholder类
4.在mainactivity 声明 adapter,数据源,关键代码:
ContentResolver cr = getContentResolver();//得到ContentResolver对象
Cursor c = cr.query(Contacts.CONTENT_URI, new String []{Contacts._ID,Contacts.DISPLAY_NAME}, null, null, null);//得到对应的联系人id和联系人名字
while (c.moveToNext()) {
int id = c.getInt(0);//得到联系人id
String name = c.getString(1);//得到联系人名字
Cursor c1 = cr.query(CommonDataKinds.Phone.CONTENT_URI, new String[](接下一行) {CommonDataKinds.Phone.NUMBER},CommonDataKinds.Phone.CONTACT_ID+"=?" , new String[]{id+""}, null);//得到对应的联系人number
if(c1.moveToNext())
{
String number = c1.getString(0);得到联系人number
PhoneNumber pn = new PhoneNumber(name, number);//新定义一个pn对象加入对应name和number(方法每运行一次,新建并添加一次)
numbers.add(pn);//将得到的pn加入numbers数据源中
}
}
//要在清单文件中加权限~~