读取系统联系人
当点击“选择联系人”按钮后,弹出联系人列表,读取系统联系人分如下几个步骤:
系统联系人提供了一个内容提供者,通过内容解析器,匹配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() {@Overridepublic void handleMessage(Message msg) {//8,填充数据适配器mAdapter = new MyAdapter();lv_contact.setAdapter(mAdapter);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_contact_list);initUI();initData();}class MyAdapter extends BaseAdapter{@Overridepublic int getCount() {return contactList.size();}@Overridepublic HashMap<String, String> getItem(int i) {return contactList.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic 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() {@Overridepublic 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中添加下面的代码
@Overrideprotected 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() {@Overridepublic void onClick(View view) {Intent intent = new Intent(getApplicationContext(), ContactListActivity.class);startActivityForResult(intent, 0);}});}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。