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

 更新时间:2016年10月12日 16:02:07   作者:wuyudong  
这篇文章主要介绍了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);
      }
    });
  }

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

相关文章

  • Flutter开发setState能否在build中直接调用详解

    Flutter开发setState能否在build中直接调用详解

    这篇文章主要为大家介绍了Flutter开发setState能否在build中直接调用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Android中实现OkHttp上传文件到服务器并带进度

    Android中实现OkHttp上传文件到服务器并带进度

    本篇文章主要介绍了Android中实现OkHttp上传文件到服务器并带进度,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Android自定义View播放Gif动画的示例

    Android自定义View播放Gif动画的示例

    本篇文章主要介绍了Android自定义View播放Gif动画的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Android Kotlin环境使用ButterKnife的方法

    Android Kotlin环境使用ButterKnife的方法

    本篇文章主要介绍了Android Kotlin环境使用ButterKnife的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Android使用SoundPool播放音效

    Android使用SoundPool播放音效

    这篇文章主要为大家详细介绍了Android使用SoundPool播放音效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Android开发入门之Notification用法分析

    Android开发入门之Notification用法分析

    这篇文章主要介绍了Android中Notification用法,较为详细的分析了Notification的功能、使用步骤与相关注意事项,需要的朋友可以参考下
    2016-07-07
  • Android简单实现菜单拖拽排序的功能

    Android简单实现菜单拖拽排序的功能

    这篇文章主要介绍了Android简单实现菜单拖拽排序的功能,文章围绕主题展开详细的内容介绍,具有一定的参考价价值,需要的朋友可以参考一下
    2022-07-07
  • Android Studio自动生成UML关系图的方法步骤

    Android Studio自动生成UML关系图的方法步骤

    本文主要介绍了Android Studio自动生成UML关系图,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Kotlin定义其他类的实现详解

    Kotlin定义其他类的实现详解

    这篇文章主要介绍了Kotlin定义其他类的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • 详解Android中AsyncTask机制

    详解Android中AsyncTask机制

    在Android当中,提供了两种方式来解决线程直接的通信问题,一种是通过Handler的机制,还有一种就是今天要详细讲解的 AsyncTask 机制,对android中asynctask相关知识感兴趣的朋友一起学习吧
    2015-12-12

最新评论