前面的文章已经实现相关的布局,本文接着进行相关的功能实现
读取系统联系人
当点击“选择联系人”按钮后,d出联系人列表,读取系统联系人分如下几个步骤:
系统联系人提供了一个内容提供者,通过内容解析器,匹配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); 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,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,""); 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); } }); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的Android手机卫士之获取联系人信息显示与回显全部内容,希望文章能够帮你解决Android手机卫士之获取联系人信息显示与回显所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)