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

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

时间: 2024-09-20 04:21:12

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

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

前面的文章已经实现相关的布局,本文接着进行相关的功能实现 读取系统联系人当点击"选择联系人"按钮后,弹出联系人列表,读取系统联系人分如下几个步骤: 系统联系人提供了一个内容提供者,通过内容解析器,匹配Url地址 1.内容解析器 2.Url地址,查看系统联系人数据库,内容提供者源码 先看api文档的清单文件,后看java类(联系人数据库有多张表) contents://com.android.contacts/表名 3.系统联系人数据库中核心表的表结构 raw_contacts 联系人表

浅析Android手机卫士之手机实现短信指令获取位置_Android

推荐阅读: 浅析Android手机卫士sim卡绑定 深入浅析Android手机卫士保存密码时进行md5加密 详解Android 手机卫士设置向导页面 浅析Android手机卫士关闭自动更新 浅析Android手机卫士自定义控件的属性 浅析Android手机卫士读取联系人 浅析Android手机卫士接收短信指令执行相应操作 浅析Android手机卫士手机定位的原理 获取位置 新建一个service的包 新建一个GPSService类继承系统的Service类 清单文件中注册一下 重写onCreat

浅析Android手机卫士读取联系人_Android

推荐阅读: 浅析Android手机卫士sim卡绑定 深入浅析Android手机卫士保存密码时进行md5加密 详解Android 手机卫士设置向导页面 浅析Android手机卫士关闭自动更新 浅析Android手机卫士自定义控件的属性 获取ContentResolver内容解析器对象,通过getContentResolver()方法 调用ContentResolver对象的query()方法,得到raw_contacts表里面的数据,得到Cursor对象 参数:Uri对象,字段String数组 获

浅析Android手机卫士读取联系人

推荐阅读: 浅析Android手机卫士sim卡绑定 深入浅析Android手机卫士保存密码时进行md5加密 详解Android 手机卫士设置向导页面 浅析Android手机卫士关闭自动更新 浅析Android手机卫士自定义控件的属性 获取ContentResolver内容解析器对象,通过getContentResolver()方法 调用ContentResolver对象的query()方法,得到raw_contacts表里面的数据,得到Cursor对象 参数:Uri对象,字段String数组 获

浅析Android手机卫士之号码归属地查询_Android

使用小米号码归属地数据库,有两张表data1和data2 先查询data1表,把手机号码截取前7位 select outkey from data1 where id="前七位手机号" 再查询data2表, select location from data2 where id="上面查出的outkey" 可以使用子查询 select location from data2 where id=(select outkey from data1 where id=&q

浅析Android 手机卫士设备管理权限锁屏_Android

推荐阅读: 浅析Android手机卫士sim卡绑定 深入浅析Android手机卫士保存密码时进行md5加密 详解Android 手机卫士设置向导页面 浅析Android手机卫士关闭自动更新 浅析Android手机卫士自定义控件的属性 浅析Android手机卫士读取联系人 浅析Android手机卫士接收短信指令执行相应操作 浅析Android手机卫士手机定位的原理 浅析Android手机卫士之手机实现短信指令获取位置 设备管理员 Device Admin 获取DevicePolicyManager

浅析Android手机卫士保存手机安全号码_Android

推荐阅读: 浅析Android手机卫士sim卡绑定 深入浅析Android手机卫士保存密码时进行md5加密 详解Android 手机卫士设置向导页面 浅析Android手机卫士关闭自动更新 浅析Android手机卫士自定义控件的属性 浅析Android手机卫士读取联系人 调用ListView对象的setOnItemClickListener()方法,设置条目的点击事件,参数:OnItemClickListener对象 使用匿名内部类实现,重写onClick()方法,传递进来的参数:ListVie

浅析Android手机卫士之号码归属地查询

使用小米号码归属地数据库,有两张表data1和data2 先查询data1表,把手机号码截取前7位 select outkey from data1 where id="前七位手机号" 再查询data2表, select location from data2 where id="上面查出的outkey" 可以使用子查询 select location from data2 where id=(select outkey from data1 where id=&q

浅析Android手机卫士保存手机安全号码

推荐阅读: 浅析Android手机卫士sim卡绑定 深入浅析Android手机卫士保存密码时进行md5加密 详解Android 手机卫士设置向导页面 浅析Android手机卫士关闭自动更新 浅析Android手机卫士自定义控件的属性 浅析Android手机卫士读取联系人 调用ListView对象的setOnItemClickListener()方法,设置条目的点击事件,参数:OnItemClickListener对象 使用匿名内部类实现,重写onClick()方法,传递进来的参数:ListVie