android学习笔记--如何获取手机联系人的信息

 今天学习了一下如何获取手机中联系人的信息。主要有两种方法。

一、通过contentProvider获取com.android.contacts中的数据库信息,在该数据库中存在两张表,一张是contacts表,用于存放联系人id,另一张是data表,用于存放联系人信息。

      Uri的信息应设置为

<span style="font-size:18px;"> Uri uri=Uri.parse("content://com.android.contacts/contacts");//获取contacts表
        Uri uri2=Uri.parse("content://com.android.contacts/data");//获取data表</span>

然后通过cursor查询到"_id",这是联系人的id属性名

<span style="font-size:18px;">Cursor cursor = context.getContentResolver().query(uri, new String[]{"_id"}, null, null, null);</span>
<span style="font-size:18px;">在data表中的统一个联系的name信息和phone信息是分两行存放的</span>
<span style="font-size:18px;"><pre name="code" class="java">while (cursor2.moveToNext()){
    String data = cursor1.getString(0);//data表中第0列是联系人信息
    String mimetype = cursor1.getString(1);//data表中第1列是信息类型
    if(mimetype.equals("vnd.android.cursor.item/name")){
        System.out.println("第"+id+"个名字:"+data);
    }else if(mimetype.equals("vnd.android.cursor.item/phone_v2")){
        System.out.println("第"+id+"个电话:"+data);
    }
}</span>
源码如下

 
 
<span style="font-size:18px;"><pre name="code" class="html">public class ReadContactsEngine {
    public void readContacts(Context context){
        Uri uri1=Uri.parse("content://com.android.contacts/contacts");//获取contacts表
        Uri uri2=Uri.parse("content://com.android.contacts/data");//获取data表
        Cursor cursor1 = context.getContentResolver().query(uri1, new String[]{"_id"}, null, null, null);

        while (cursor1.moveToNext()){
            String id = cursor1.getString(0);//contas表中第0列即为联系人的id
            Cursor cursor2 = context.getContentResolver().query(uri2, new String[]{"data1", "mimetype"}, "raw_contact_id=?", new String[]{id}, null);
           while (cursor2.moveToNext()){
               String data = cursor1.getString(0);//data表中第0列是联系人信息
               String mimetype = cursor1.getString(1);//data表中第1列是信息类型
               if(mimetype.equals("vnd.android.cursor.item/name")){
                   System.out.println("第"+id+"个名字:"+data);
               }else if(mimetype.equals("vnd.android.cursor.item/phone_v2")){
                   System.out.println("第"+id+"个电话:"+data);
               }
           }

        }
    }
}</span>

注意需要加权限:

<span style="font-size:18px;">    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/></span>

在单元测试看到查询结果

07-03 23:45:44.938 3923-3937/? I/System.out: 第1个电话:1 534-443-3607
07-03 23:45:44.938 3923-3937/? I/System.out: 第1个名字:Tom
07-03 23:45:44.942 3923-3937/? I/System.out: 第2个电话:1 234-545-6537
07-03 23:45:44.942 3923-3937/? I/System.out: 第2个名字:Kitty
07-03 23:45:44.942 3923-3937/? I/System.out: 第3个电话:1 821-609-0742
07-03 23:45:44.942 3923-3937/? I/System.out: 第3个名字:Sum

获取的联系人信息需要保存起来,创建一个ContactBea类用于封装联系人信息

public class UrlBean {
 private  String version;

    public String getVersion() {
        return version;
    }

    public String getUrl() {
        return url;
    }

    public String getDesc() {
        return desc;
    }

    private  String url;

    public void setVersion(String version) {
        this.version = version;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    private  String desc;
}

ReadContactsEngine类改成如下:

public class ReadContactsEngine {
    /**
     * 
     * @param context 传递一个上下文参数
     * @return 返回ContactBean集合
     */
    public static ArrayList<ContactBean> readContacts(Context context){
        Uri uri1=Uri.parse("content://com.android.contacts/contacts");//获取contacts表
        Uri uri2=Uri.parse("content://com.android.contacts/data");//获取data表
        Cursor cursor1 = context.getContentResolver().query(uri1, new String[]{"_id"}, null, null, null);
        ArrayList<ContactBean> beans=new ArrayList<ContactBean>();//用于存放联系人的容器
        while (cursor1.moveToNext()){
            String id = cursor1.getString(0);//contas表中第0列即为联系人的id
            ContactBean bean=new ContactBean();
            Cursor cursor2 = context.getContentResolver().query(uri2, new String[]{"data1", "mimetype"}, "raw_contact_id=?", new String[]{id}, null);
           while (cursor2.moveToNext()){
               String data = cursor2.getString(0);//data表中第0列是联系人信息
               String mimetype = cursor2.getString(1);//data表中第1列是信息类型
               if(mimetype.equals("vnd.android.cursor.item/name")){
                   bean.setName(data);//保存联系人的名字
               }else if(mimetype.equals("vnd.android.cursor.item/phone_v2")){
                  bean.setPhone(data);//保存联系人的号码
               }
           }
            cursor2.close();//关闭cursor1
            beans.add(bean);

        }
        cursor1.close();//关闭cursor2
        return beans;
    }
}

 
 
</pre><p><strong>在listView中显示联系人信息</strong></p><p><strong></strong><pre name="code" class="java">public class ContactsActivity extends ListActivity {
    private static final int LOADING=1;//ListActivity中只有ListView组件
    private static final int FINISH = 2;
    private ProgressDialog pd;
    private List<ContactBean> datas=new ArrayList<ContactBean>();//用于显示在ListView中的联系人
    private MyAdapter adapter;
    private ListView lv_conta;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        lv_conta = getListView();
        adapter = new MyAdapter();
        lv_conta.setAdapter(adapter);
        //填充数据
        initData();
        initEnvent();
    }

    /**
     * 初始化ListView的Item的点击事件
     */
    private void initEnvent() {
     lv_conta.setOnItemClickListener(new AdapterView.OnItemClickListener() {
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
             ContactBean bean=datas.get(position);
             String phone=bean.getPhone();
             Intent intent=new Intent();
             intent.putExtra(MyConstant.SAFENUMBER,phone);
             setResult(1,intent);
             finish();
         }
     });
    }

    /**
     * handler
     */
    Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what){
            case LOADING:
                pd = new ProgressDialog(ContactsActivity.this);
                pd.setTitle("提醒");
                pd.setMessage("正在加载数据,请等候....");
                pd.show();
                break;
            case FINISH:
                if(pd!=null)
                {
                    pd.dismiss();//关闭对话框
                    pd=null;//释放内存
                }
                adapter.notifyDataSetChanged();//通知适配器去取数据
                break;
            default:
                break;
        }
    }
};

    /**
     * 初始化ListView中的数据
     */
    private void initData() {
        //获取数据是耗时的操作,需在子线程进行
        new Thread(){

            @Override
            public void run() {
                Message msg = Message.obtain();
                msg.what=LOADING;
                handler.sendMessage(msg);
            //    SystemClock.sleep(5000);//模拟耗时操作
                datas= ReadContactsEngine.readContacts(getApplicationContext());
                //加载完成
                Message msg1 = Message.obtain();
                msg.what=FINISH;
                handler.sendMessage(msg1);
            }
        }.start();

    }
    public class  MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return datas.size();
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view=View.inflate(getApplicationContext(),R.layout.setupactivity3_contact_lv,null);
            TextView tv_name= (TextView) view.findViewById(R.id.tv_contactsName);
            TextView tv_phone= (TextView) view.findViewById(R.id.tv_contactsPhone);
            ContactBean bean=datas.get(position);
            tv_name.setText(bean.getName());
            tv_phone.setText(bean.getPhone());
            System.out.println("姓名:"+tv_name.getText()+"电话:"+tv_phone.getText());
            return view;
        }
    }

}




发布了38 篇原创文章 · 获赞 6 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/coderlady/article/details/51819932