欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-05 14:22:51
前面的文章已经实现相关的布局,本文接着进行相关的功能实现 读取系统联系人 当点击“选择联系人”按钮后,弹出联系人列表,读取系统联系人分如下几个步骤: 系统联系人提...

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

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();
  }

实现的效果如下:

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

联系人信息回显

接下来实现点击联系人条目,实现回显,例如双击第一个条目,号码自动添加

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

代码如下:

  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);
      }
    });
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。