刚刚学习Android,接触到了如何读取手机联系人的小功能,记录下,也欢迎大家进来参考!
总体思想:
1,从raw_contacts中读取联系人的id("contact_id")。
2,根据contact_id从data表中查询出相应的电话号码和联系人的名称。
3,根据mimetype表来区分哪个是联系人名称,哪个是电话号码,(mimetype_id 中5:phone,7:name)如图所示:
代码如下:
1,拿到contactId:
Uri rawContactsUri = Uri.parse("content://com.android.contacts/raw_contacts");
Cursor rawContactsCursor = getContentResolver().query(rawContactsUri, new String[]{"contact_id"}, null, null, null);
/*括号里的第一个函数表示的是:传的哪个表
*第二个函数是:查哪些字段
*第三个函数是:筛选条件
*第四个函数是:筛选条件的参数
*第五个函数还:排序,这里我们用他的默认排序就可以了
*/
//拿到Cursor后,我们进行遍历
if (rawContactsCursor != null) {
while (rawContactsCursor.moveToNext()) {
//while中的条件表示的是,我们一直可以往下拿的话
//读数据,0表示的是,我们就读第一列
String contactId = rawContactsCursor.getString(0);
//System.out.println("id::"+contactId);}
//在读取过ID后,关闭Cursor
rawContactsCursor.close();
}
在我打印的时候,出现了问题,问题是我没有在AndroidManifest 中加权限,加下权限:READ_CONTACTS
2,对data表的查询,其实是查询的data表的视图view_data
Uri dataUri = Uri.parse("content://com.android.contacts/data");
Cursor dataCursor = getContentResolver().query(dataUri,new String[]{"data1","mimetype"}, "contact_id=?",
new String[]{contactId}, null);
if (dataCursor != null) {
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(0);
String mimetype = dataCursor.getString(1);
//System.out.println(contactId+";"+data1+";"+mimetype);
//然后,根据mimetype来区分哪个是联系人,哪个是电话号码
if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
map.put("phone", data1);
}else if ("vnd.android.cursor.item/name".equals(mimetype)) {
map.put("name", data1);
}
}
dataCursor.close();
}
3保存
用hashmap来对拿到是数据保存,Arraylist来保存多条联系人
4用listView 视图来展示!