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

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

本文地址:http://www.cnblogs.com/wuyudong/p/5951794.html,转载请注明出处。

读取系统联系人

当点击“选择联系人”按钮后,弹出联系人列表,读取系统联系人分如下几个步骤:

系统联系人提供了一个内容提供者,通过内容解析器,匹配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);
            }
        });
    }
时间: 2024-10-10 09:07:55

Android 手机卫士--获取联系人信息并显示与回显的相关文章

内容提供者(获取联系人信息和插入联系人)

一丶获取联系人的信息 点击获取联系人信息 public void click(View view){        //获取内容解析器        ContentResolver resolver = getContentResolver() ;        //设定访问的uri(系统本机)        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts") ;//联系人的id        Uri d

Android 手机卫士--弹出对话框

在<Android 手机卫士--解析json与消息机制发送不同类型消息>一文中,消息机制发送不同类型的信息还没有完全实现,在出现异常的时候,应该弹出吐司提示异常,代码如下: private Handler mHandler = new Handler() { // public void handleMessage(android.os.Message msg) { switch (msg.what) { case UPDATE_VERSION: //弹出对话框,提示用户更新 //showUp

Android 手机卫士--确认密码对话框编写

本文接着实现“确认密码”功能,也即是用户以前设置过密码,现在只需要输入确认密码 本文地址:http://www.cnblogs.com/wuyudong/p/5940718.html,转载请注明出处. 布局文件和<Android 手机卫士--设置密码对话框>中的布局基本类似,所有copy一下,修改一点细节就搞定: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and

在Android手机上获取其他应用的包名及版本号

转载请注明出处:http://blog.csdn.net/jason_src/article/details/37757661 获取Android手机上其他应用的包名及版本号方法有很多,可以通过AAPT从APK包中直接获取,也可以通过代码在手机上获取.显然,对于产品或者用户来说要获取这些信息,在手机上获取更为简便. 下面我们来看下如何在手机上获取其他应用的包名.版本号. 核心:通过PackageManager可以获取到我们想要的信息,例如:程序图标.程序名称.包名.VersionName.Ver

Android手机如何获取power_profile.xml文件

最近在做关于能耗方面的测试,看了一个月时间的论文,终于找到了一些新的思路,但是一个问题出现了,以至于 工作无法再进行下去. 在Android手机中,对于手机中的每个部件(cpu.led.gps.3g等等)运行时对应的能耗值都放power_profile.xml 文件中,而且系统的 设置-->电池-->使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数 的.Android手机如何获取power_profile.xml文件呢?接下来我们会详细介绍该问题

Android 手机卫士--签名文件说明&amp;包名说明

在<Android 手机卫士--打包生成apk维护到服务器>一文中,实现了新版本的apk到服务器,当打开客户端apk的时候,发现有新版本,提示更新.还实现了利用xutils工具实现了从服务器端下载apk 本文地址:http://www.cnblogs.com/wuyudong/p/5903484.html,转载请注明源地址. 本文实现下载本机apk的安装,过程很简单,参考<Android APK的安装> 代码如下: /** * 安装对应的apk * @param file 安装文件

[android] 手机卫士来电显示号码归属地

继续N天前的项目 开启服务监听手机来电,查询数据库,显示归属地 详细内容可以参考这篇博文:http://www.cnblogs.com/taoshihan/p/5331232.html AddressService.java package com.qingguow.mobilesafe.service; import com.qingguow.mobilesafe.utils.NumberQueryAddressUtil; import android.app.Service; import

android通过查询电话号码获取联系人信息

[java] view plaincopyprint? // 取得Intent中的頭像 ivShowImage = (ImageView) findViewById(R.id.call_log_detail_contact_img); //通话电话号码获取头像uri Uri uriNumber2Contacts = Uri .parse("content://com.android.contacts/" + "data/phones/filter/" + strPh

weiyi通讯录(二)获取联系人信息包括头像 增删改查功能,

看了下第一期的访问量,100都没有可能很多人不需要吧,之前跟过一个大神学做项目,他都不吧核心代码告诉我,感觉没有一点分享精神,所以我就自己做.没跟他一起做 这里把上次的代码分享一下 我这里分享的跟我博客里面可能不一样因为我已经做完第一个模块了,代码就没有分开了 第一期的代码地址:http://download.csdn.net/detail/u010982856/8232855 分享的是类似的代码 基本跟我的是一样.如果需要的联系人我把 或者加入我的交流群吧 -----------欢迎加入交流群