文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.csdn.net/flowingflying/以及作者@恺风Wei。
我们将读取Raw Contacts的信息。
代码和之前获取整合联系人的表头信息类似,只是URI不同,Raw contacts的URI为ContactsContract.RawContacts.CONTENT_URI。
private void showHasWhatInfo(){
Cursor c = null;
try{
c = getACurosor(ContactsContract.RawContacts.CONTENT_URI.toString(),null);
if(c != null){
printColumnNames(c); //同Pro Android学习笔记(一六一):联系人API(4):读取整合联系人中的printColumnNames(Cursor c)不再重复。
}
}finally{
if(c!= null)
c.close();
}
}
//通过URI获取查询的游标
private Cursor getACurosor(String uri, String clause){
ContentResolver cv = mContext.getContentResolver();
return cv.query(Uri.parse(uri), null, clause, null, null);
}
Raw contacts有很多信息,我们将选取部分进行显示。新增类RawContactInfo,在类中,给出了获取当前游标对应的raw contact的信息,代码如下:
public class RawContactInfo {
public String rawContactId;
public String aggregatedContactId;
public String accountName;
public String accountType;
public String displayName;
public void fillinFrom(Cursor c){
rawContactId = BaseTest.getColumnValue(c, "_ID");
accountName = BaseTest.getColumnValue(c, ContactsContract.RawContacts.ACCOUNT_NAME);
accountType = BaseTest.getColumnValue(c, ContactsContract.RawContacts.ACCOUNT_TYPE);
aggregatedContactId = BaseTest.getColumnValue(c, ContactsContract.RawContacts.CONTACT_ID);
displayName = BaseTest.getColumnValue(c, ContactsContract.RawContacts.DISPLAY_NAME_PRIMARY);
}
public String toString(){
return displayName + " / " + accountName + ":" + accountType+ " / "
+rawContactId + " / " + aggregatedContactId;
}
}
遍历Raw contacts的相关代码如下:
private void showAllContacts(){
Cursor c = null;
try{
c = getACurosor(ContactsContract.RawContacts.CONTENT_URI.toString(),null);
showInfo("Total are " + c.getCount() + " contacts.");
showTop20Entries(c); //信息太多,最多只读取前20个。
}finally{
if(c!= null)
c.close();
}
}
private void showTop20Entries(Cursor c ){
showInfo("只显示前20行-----");
int num = 0;
for(c.moveToFirst(); num <20 && !c.isAfterLast() ; num ++,c.moveToNext()){
RawContactInfo rawOne = new RawContactInfo();
rawOne.fillinFrom(c);
showInfo("【" + num + "】" + rawOne.toString());
}
}
我们知道一个整合联系人是系统将多个认为是同一个人的raw contacts进行合并。在我们之前raw contacts信息中,有一个是aggregatedContactId,对应raw contacts的ContactsContract.RawContacts.CONTACT_ID的数据。而这个ContactsContract.RawContacts.CONTACT_ID和整合联系人中的_ID是一致的。下面我们将获得第一个整合联系人的_ID,然后再查看包含哪些raw contacts
//【1】获取指定整合联系人(第一个)的contact ID
private int getFirstAggreatedContactId(){
Cursor ac = null;
try{
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
ContentResolver cv = mContext.getContentResolver();
ac = cv.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, sortOrder);
ac.moveToFirst();
String id = getColumnValue(ac,"_ID");
showInfo("id = " + id + " display name : " + getColumnValue(ac,ContactsContract.Contacts.DISPLAY_NAME));
return Integer.decode(id);
}finally{
if(ac != null){
ac.close();
}
}
}
//【2】查询和整合联系人_ID相同的raw contacts。
private void showRawContactsWithAggregatedId(int aggregatedId){
Cursor c = null;
try{ //在query中的where进行条件过滤
c = getACurosor(ContactsContract.RawContacts.CONTENT_URI.toString(),
ContactsContract.RawContacts.CONTACT_ID + "=" + aggregatedId);
showTop20Entries(c);
}finally{
if(c != null)
c.close();
}
}
小例子下载。
相关链接:我的Android开发相关文章