Android手机卫士之获取联系人信息显示与回显

Android手机卫士之获取联系人信息显示与回显,第1张

概述前面的文章已经实现相关的布局,本文接着进行相关的功能实现读取系统联系人

前面的文章已经实现相关的布局,本文接着进行相关的功能实现

读取系统联系人
当点击“选择联系人”按钮后,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手机卫士之获取联系人信息显示与回显所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1148025.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存