您的位置:首页 > 移动开发 > Android开发

android读取联系人的两种方式

2015-12-26 22:55 465 查看
随着android开发的升入,虽然代码功力提升了不少,但是我们却忘记了在以后的android开发中为了开发的方便却一直引用别人的框架,虽然可以省去很多调试的BUG,但是我个人觉得一步一个脚印,慢慢的提升自己。

那直接进入主题,我们知道读取联系人需要权限:

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> 



读取联系人信息都是从手机数据库中加载获取信息。方法是[b]查询数据库表中的三个字段raw_contacts, data, mimetypes来获取联系人信息,[/b]下面是通过两种方法获取联系人信息:

方法一:

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 读取联系人