Android手机卫士之获取联系人信息显示与回显
前面的文章已经实现相关的布局,本文接着进行相关的功能实现
读取系统联系人
当点击“选择联系人”按钮后,弹出联系人列表,读取系统联系人分如下几个步骤:
系统联系人提供了一个内容提供者,通过内容解析器,匹配url地址
1.内容解析器
2.url地址,查看系统联系人数据库,内容提供者源码
先看api文档的清单文件,后看java类(联系人数据库有多张表)
contents://com.android.contacts/表名
3.系统联系人数据库中核心表的表结构
raw_contacts 联系人表: contact_id 联系人唯一性id值
data 用户信息表:raw_contact_id作为外键,和raw_contacts中contact_id做关联查询
获取data1字段,包含了电话号码以及联系人名称
mimetype_id字段,包含了当前行data1对应的数据类型
mimetypes 类型表: 获取data表中mimetype_id和mimetypes中_id做关联查询,获取指向的信息类型
电话号码:vnd.android.cursor.item/phone_v2
用户名称:vnd.android.cursor.item/name
4.表的访问方式
content://com.android.contacts/raw_contacts
content://com.android.contacts/data
下面用代码实现
private listview lv_contact; private list<hashmap<string, string>> contactlist = new arraylist<hashmap<string, string>>(); private myadapter madapter; private handler mhandler = new handler() { @override public void handlemessage(message msg) { //8,填充数据适配器 madapter = new myadapter(); lv_contact.setadapter(madapter); } }; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_contact_list); initui(); initdata(); } class myadapter extends baseadapter{ @override public int getcount() { return contactlist.size(); } @override public hashmap<string, string> getitem(int i) { return contactlist.get(i); } @override public long getitemid(int i) { return i; } @override public view getview(int i, view view, viewgroup viewgroup) { view v = view.inflate(getapplicationcontext(), r.layout.listview_contact_item, null); textview tv_name = (textview)v.findviewbyid(r.id.tv_name); textview tv_phone = (textview)v.findviewbyid(r.id.tv_phone); tv_name.settext(getitem(i).get("name")); tv_phone.settext(getitem(i).get("phone")); return v; } } /** * 获取联系人数据的方法 */ private void initdata() { //因为读取系统联系人,可能是一个耗时操作,放置到子线程中处理 new thread(){ public void run(){ //1,获取内容解析器对象 contentresolver contentresolver = getcontentresolver(); //2,做查询系统联系人数据库表过程(读取联系*限) cursor cursor = contentresolver.query( uri.parse("content://com.android.contacts/raw_contacts"), new string[]{"contact_id"}, null, null, null); contactlist.clear(); //3,循环游标,直到没有数据为止 while (cursor.movetonext()){ string id = cursor.getstring(0); //4,根据用户唯一性id值,查询data表和mimetype表生成的视图,获取data以及mimetype字段 cursor indexcursor = contentresolver.query( uri.parse("content://com.android.contacts/data"), new string[]{"data1","mimetype"}, "raw_contact_id = ?", new string[]{id}, null); //5,循环获取每一个联系人的电话号码以及姓名,数据类型 hashmap<string, string> hashmap = new hashmap<string, string>(); while (indexcursor.movetonext()){ string data = indexcursor.getstring(0); string type = indexcursor.getstring(1); //6,区分类型去给hashmap填充数据 if(type.equals("vnd.android.cursor.item/phone_v2")) { //数据非空判断 if(!textutils.isempty(data)) { hashmap.put("phone", data); } }else if(type.equals("vnd.android.cursor.item/name")) { if(!textutils.isempty(data)) { hashmap.put("name", data); } } } indexcursor.close(); contactlist.add(hashmap); } cursor.close(); //7,消息机制,发送一个空的消息,告知主线程可以去使用子线程已经填充好的数据集合 mhandler.sendemptymessage(0); } }.start(); }
实现的效果如下:
联系人信息回显
接下来实现点击联系人条目,实现回显,例如双击第一个条目,号码自动添加
代码如下:
private void initui() { lv_contact = (listview) findviewbyid(r.id.lv_contact); lv_contact.setonitemclicklistener(new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> adapterview, view view, int i, long l) { //1,获取点中条目的索引指向集合中的对象 if(madapter != null) { hashmap<string, string> hashmap = madapter.getitem(i); //2,获取当前条目指向集合对应的电话号码 string phone = hashmap.get("phone"); //3,此电话号码需要给第三个导航界面使用 //4,在结束此界面回到前一个导航界面的时候,需要将数据返回过去 intent intent = new intent(); intent.putextra("phone", phone); setresult(0, intent); finish(); } } }); }
接着onactivityresult中添加下面的代码
@override protected void onactivityresult(int requestcode, int resultcode, intent data) { if(data != null) { //1,返回到当前界面的时候,接受结果的方法 string phone = data.getstringextra("phone"); //2,将特殊字符过滤(中划线转换成空字符串) phone = phone.replace("-", "").replace(" ", "").trim(); et_phone_number.settext(phone); //3,存储联系人至sp中 sputil.putstring(getapplicationcontext(), constantvalue.contact_phone, phone); } super.onactivityresult(requestcode, resultcode, data); }
当填写号码后,进入下一页,再次返回,发现号码不见了,于是使用sp存储并从中读取
private void initui() { //显示电话号码的输入框 et_phone_number = (edittext)findviewbyid(r.id.et_phone_number); //获取联系人电话号码回显过程 string contact_phone = sputil.getstring(this, constantvalue.contact_phone, ""); et_phone_number.settext(contact_phone); bt_select_number = (button) findviewbyid(r.id.bt_select_number); //点击选择联系人的对话框 bt_select_number.setonclicklistener(new view.onclicklistener() { @override public void onclick(view view) { intent intent = new intent(getapplicationcontext(), contactlistactivity.class); startactivityforresult(intent, 0); } }); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。