随着android开发的升入,虽然代码功力提升了不少,但是我们却忘记了在以后的android开发中为了开发的方便却一直引用别人的框架,虽然可以省去很多调试的BUG,但是我个人觉得一步一个脚印,慢慢的提升自己。
那直接进入主题,我们知道读取联系人需要权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
读取联系人信息都是从手机数据库中加载获取信息。方法是查询数据库表中的三个字段raw_contacts, data, mimetypes来获取联系人信息,下面是通过两种方法获取联系人信息:
方法一:
1. 先从raw_contacts中读取联系人的contact_id
2. 根据contact_id,从data中查出联系人相关信息
3. 根据mimetype_id, 查询mimetype表,得到信息类型(名称,号码)
代码如下:
private ArrayList<HashMap<String, String>> readContact(){
// raw_contacts, data, mimetypes
// 1. 先从raw_contacts中读取联系人的contact_id
// 2. 根据contact_id,从data中查出联系人相关信息
// 3. 根据mimetype_id, 查询mimetype表,得到信息类型(名称,号码)
Cursor rawContactCursor = getContentResolver().query(
Uri.parse("content://com.android.contacts/raw_contacts"),
new String[] { "contact_id" }, null, null, null);
ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();// 所有联系人集合
while(rawContactCursor.moveToNext()){// 遍历所有联系人
contactId = rawContactCursor.getString(0);
// 系统查询的不是data这个表,而是view_data这个视图,视图是多个表的整合, data+mimetypes
Cursor dataCursor = getContentResolver().query(
Uri.parse("content://com.android.contacts/data"),
new String[] { "data1", "mimetype" }, "raw_contact_id=?",
new String[] { contactId }, null);
HashMap<String, String> map = new HashMap<String, String>();// 保存某个联系人的信息
while (dataCursor.moveToNext()) {// 遍历单个联系人所有字段信息
String data = dataCursor.getString(0);
String type = dataCursor.getString(1);
if ("vnd.android.cursor.item/phone_v2".equals(type)) {
// 电话号码
map.put("phone", data);
} else if ("vnd.android.cursor.item/name".equals(type)) {
// 名称
map.put("name", data);
}
}
dataCursor.close();
// 脏数据, 过滤掉
if (!TextUtils.isEmpty(map.get("name"))
&& !TextUtils.isEmpty(map.get("phone"))) {
list.add(map);
}
}
rawContactCursor.close();
return list;
}
}
方法二:
最近在研究android源码,个人觉得源码才是android最基础,而且是精髓;通过查询源码我又得到了另外一种方法,而且很简单快捷,我是通过按键点击显示一个dialog的方式把联系人信息显示在dialog的内容框中。代码如下:
<span style="font-size:14px;">private String contactId;
private Cursor cursor;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.SEND_TO_VOICEMAIL
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
projection, null, null, null);
}
}).start();
}
public void click(View view){
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("联系人列表");
builder.setMultiChoiceItems(cursor, ContactsContract.Contacts.SEND_TO_VOICEMAIL,
ContactsContract.Contacts.DISPLAY_NAME,</span>
<span style="font-size:14px;"><span style="white-space: pre;"> </span>new OnMultiChoiceClickListener() {
<span style="white-space: pre;"> </span>@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
Toast.makeText(getApplicationContext(), "选择:"+which, 1).show();
}
});
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setNegativeButton("取消", null);
builder.create().show();
}</span>