此博客只实现了查询功能:

import java.util.ArrayList;

import android.os.Bundle;
import android.provider.ContactsContract;
import android.app.Activity;
import android.app.AlertDialog;
import android.database.Cursor;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;

search.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {
    // 定义两个List来封装系统的联系人信息、指定联系人的电话号码、Email等详情
    final ArrayList<String> names = new ArrayList<String>();
    final ArrayList<ArrayList<String>> details = new ArrayList<ArrayList<String>>();
    //使用ContentResolver查找联系人的数据
    Cursor cursor = getContentResolver().query(
    ContactsContract.Contacts.CONTENT_URI, null, null, null,null );
    //遍历查询结果,获取系统中所有联系人
    while(cursor.moveToNext()){
      //获取联系人ID
      String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
      //获取联系人的名字
      String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
      names.add(name);
      //使用ContentResolver查询联系人的电话号码
      Cursor phones = getContentResolver().query(
          ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
          ContactsContract.CommonDataKinds.Phone.CONTACT_ID
          +"="+contactId, null, null);
      ArrayList<String> detail = new ArrayList<String>();
      //遍历查询结果,获取该联系人的多个电话号码
      while(cursor.moveToNext()){
        //获取查询结果中电话号码列中的数据
        String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        detail.add("电话号码:"+phoneNumber);
      }
      phones.close();
      //使用ContentResolver查询联系人的E_mail地址
      Cursor emails = getContentResolver().query(
          ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
          ContactsContract.CommonDataKinds.Email.CONTACT_ID
          +"="+contactId, null, null);
      //遍历查询结果,获取该联系人的多个E_mail地址
      while(emails.moveToNext()){
      //获取查询结果中E_mail地址列中的数据
      String emailAddress = emails.getString(
          emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA
          ));
      detail.add("邮件地址:"+emailAddress);
      }
      emails.close();
      details.add(detail);
    }
    cursor.close();
    //加载result.xml界面布局代表的视图
    View resultDialog = getLayoutInflater().inflate(R.layout.result, null);
    //获取resultDialog中ID为list的ExpandableListView
    ExpandableListView list = (ExpandableListView) resultDialog.findViewById(R.id.list);
    //创建一个ExpandableListAdapter对象
    ExpandableListAdapter adapter = new BaseExpandableListAdapter() {

      @Override
      public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
      }

      @Override
      public boolean hasStableIds() {
      return true;
      }

      //该方法决定每个组选项的外观
      @Override
      public View getGroupView(int groupPosition, boolean isExpanded,
      View convertView, ViewGroup parent) {
        TextView textView = getTextView();
        textView.setText(getGroup(groupPosition).toString());
        return textView;
      }

      @Override
      public long getGroupId(int groupPosition) {
        return groupPosition;
      }

      @Override
      public int getGroupCount() {
        return names.size();
      }

      //获取指定组位置处的组数据
      @Override
      public Object getGroup(int groupPosition) {
        return names.get(groupPosition);
      }

      @Override
      public int getChildrenCount(int groupPosition) {
        return details.get(groupPosition).size();
      }
      private TextView getTextView(){
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
              ViewGroup.LayoutParams.MATCH_PARENT, 64);
        TextView textView = new TextView(MainActivity.this);
        textView.setLayoutParams(lp);
        textView.setGravity(Gravity.CENTER_VERTICAL|Gravity.LEFT);
        textView.setPadding(36, 0, 0, 0);
        textView.setTextSize(20);
        return textView;
      }

      //该方法决定每个子选项的外观
      @Override
      public View getChildView(int groupPosition, int childPosition,
          boolean isLastChild, View convertView, ViewGroup parent) {
        TextView textView = getTextView();
        textView.setText(getChild(groupPosition, childPosition).toString());
        return textView;
      }

      @Override
      public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
      }

      //获取指定组位置、指定子列表项处的子列表项数据
      @Override
      public Object getChild(int groupPosition, int childPosition) {
        return details.get(groupPosition).get(childPosition);
      }
    };
    //为ExpandableListView设置Adapter
    list.setAdapter(adapter);
    //使用对话框来显示查询结果
    new AlertDialog.Builder(MainActivity.this)
        .setView(resultDialog).setPositiveButton("确定", null).show();
    }
});

使用ContentProvider管理联系人------搜索联系人的更多相关文章

  1. Terraform插件Provider管理,搜索、定义、下载

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 简介 最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人. Terraform系列文章如下: Ter ...

  2. 使用ContentProvider管理联系人------添加联系人

    add.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 获取程序界面中的三个 ...

  3. 【WP8.1开发】选择与搜索联系人

    在需要的情况下,可以通过相关的API来访问手机上的联系人信息:当然,在不必要的情况下,不要随便去获取别人的数据. 要从联系人列表中选择并获取一位或者N位联系人的详细信息,比较简单的做法是利用Conta ...

  4. Android通讯录管理(获取联系人、通话记录、短信消息)

    前言:前阵子主要是记录了如何对联系人的一些操作,比如搜索,全选.反选和删除等在实际开发中可能需要实现的功能,本篇博客是小巫从一个别人开源的一个项目抽取出来的部分内容,把它给简化出来,可以让需要的朋友清 ...

  5. 用ContentProvider向系统增加联系人

    发现对系统的联系人进行操作的api很乱,感觉逻辑有点不清楚...... 主要用到这4个类: android.provider.ContactsContract.CommonDataKinds.Emai ...

  6. Linux的.a、.so和.o文件 windows下obj,lib,dll,exe的关系 动态库内存管理 动态链接库搜索顺序 符号解析和绑定 strlen函数的汇编实现分析

    Linux的.a..so和.o文件 - chlele0105的专栏 - CSDN博客 https://blog.csdn.net/chlele0105/article/details/23691147 ...

  7. Elasticsearch中的索引管理和搜索常用命令总结

    添加一个index,指定分片是3,副本是1 curl -XPUT "http://10.10.110.125:9200/test_ods" -d' { "settings ...

  8. 使用ContentProvider管理多媒体-----向多媒体数据中添加数据

    //为add按钮的单击事件绑定监听器 add.setOnClickListener(new OnClickListener() { @Override public void onClick(View ...

  9. 使用ContentProvider管理多媒体-----查看多媒体数据中的所有图片

    import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; impo ...

随机推荐

  1. SQL触发器、事务

    触发器: 触发器为特殊类型的存储过程,可在执行语言事件时自动生效.SQL Server 包括三种常规类型的触发器:DML 触发器.DDL 触发器和登录触发器. 当服务器或数据库中发生数据定义语言 (D ...

  2. rpm 更新/升级 软件包(libGL-devel手动安装过程)

    rpm参数解释 -i 安装 -h 解压rpm的时候打印50个斜条 (#) -v 显示详细信息 升级命令rpm -Uvh rpm文件名 参数解释 -U 升级 -h 解压rpm的时候打印50个斜条 (#) ...

  3. 两个EXCEL文件对比去重

    两个EXCEL文件,A里面有10000条记录,B里面有4000条记录,A的记录包含了B里面所有的记录现在如何能把A里面没有包含B的6000条记录筛选出来? 那你要把两同时打开,比如book1 book ...

  4. OpenGL的glRotatef旋转变换函数详解

    OpenGL的glRotatef旋转变换函数详解 先看一下函数定义:void glRotatef(GLfloat angle,  GLfloat x,     GLfloat y,     GLflo ...

  5. valueForKeyPath的妙用(转)

    可能大家对 - (id)valueForKeyPath:(NSString *)keyPath 方法不是很了解. 其实这个方法非常的强大,举个例子: NSArray *array = @[@" ...

  6. RMAN-03009 ORA-19504 ORA-27038

    错误信息如下: RMAN> backup database tag='full20160112' format '/orabak/rman/full20160112' include curre ...

  7. 项目开发中遇到的extjs常见问题

    事件触发机制 l 给某一个控件添加事件. obj.addEvents( {search : true }); l 给某一个事件添加处理函数 n 给一个对象或变量添加监听及对应得处理,可以在创建时,通过 ...

  8. 关于e820cycles参数

    关于e820cycles参数http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=327458&pid= ...

  9. 坑爹的对GBK编码的字符进行url编码

    url编码又叫百分号编码 现在的url编码十分混乱,都没有按照新标准来 对汉字都按照不同的编码后再进行url编码 2005年1月发布的RFC 3986,强制所有新的URI必须对未保留字符不加以百分号编 ...

  10. C#综合揭秘——细说多线程(上)

    引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用. 而 I/O线程 ...