我原本从网上找了好多源码。都是是从手机上获得的联系人,可是运行之后才是all联系人。其实在数据库里有个字段用于区分手机和sim。
ContactsContract.RawContacts.ACCOUNT_TYPE,就是这个字段。
有两种type。以我用的华为手机为例。com.android.huawei.phone和com.android.huawei.sim
接下来你懂了吧。
ContentResolver cr = this.getContentResolver();
//取得电话本中开始一项的光标
Cursor cursor = cr.query(Phone.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
ContactInfo cci = new ContactInfo();
// 取得联系人ID
int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String typeString=cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE));
if (typeString.contains("sim")) {
continue;
}
}
这下你懂了把。
至于更详细的信息:包括:邮箱地址,。家庭地址。IM地址。头像。
获取家庭地址:
ArrayList<Address> addrList = new ArrayList<Address>();
String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] whereParameters = new String[]{id+"",
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};
Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null);
while(addrCur.moveToNext()) {
String poBox = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
String street = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
String city = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
String state = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
String postalCode = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
String country = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
String type = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
Address a = new Address(poBox, street, city, state, postalCode, country, type);
addrList.add(a);
//System.out.println("adress________>"+a.getCity()+a.getCountry()+a.getPoBox()+a.getState()+a.getStreet()+a.getType());
}
获取邮件地址:
ArrayList<Email> emails = new ArrayList<Email>();
Cursor emailCur = cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[]{id+""}, null);
while (emailCur.moveToNext()) {
Email e = new Email(emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))
,emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE))
);
emails.add(e);
// System.out.println("emial-------------->"+e.getAddress()+e.getType());
}
emailCur.close();
获取im地址:
其中im有包含name和type两个。属性。这个可以看看自己的联系人。其中QQ为3/
ArrayList<IM> imList = new ArrayList<IM>();
String where2 = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] whereParameters2 = new String[]{id+"",
ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE};
Cursor imCur = cr.query(ContactsContract.Data.CONTENT_URI, null, where2, whereParameters2, null);
if (imCur.moveToFirst()) {
String imName = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
String imType;
imType = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE));
if (imName.length() > 0) {
IM im = new IM(imName, imType);
imList.add(im);
// System.out.println("QQ========>"+im.getName()+im.getType());
}
}
imCur.close();
头像的获得:
先获得photoid。然后根据photoid再得到头像数据。头像使用blob类型存储的。直接转换即可。
cci.setPhotoId(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID)));
System.out.println(cci.getDisplayName()+"头像id"+cci.getPhotoId());
if (cci.getPhotoId()!=null) {
bitmap a=ContactImageLoader.loadImageFromUrl(this, cci.getPhotoId());
}else {
Log.i(cci.getDisplayName(), "头像为空");
}
根据id转为bitmap:
public synchronized static Bitmap loadImageFromUrl(Context ct,String photo_id) {
Bitmap d = null;
try{
String[] projection = new String[]{ContactsContract.Data.DATA15};
String selection = "ContactsContract.Data._ID = " + photo_id;
Cursor cur = ct.getContentResolver().query(ContactsContract.Data.CONTENT_URI, projection, selection, null, null);
cur.moveToFirst();
byte[] contactIcon = null;
if(cur.getBlob(cur.getColumnIndex(ContactsContract.Data.DATA15))!=null){
contactIcon=cur.getBlob(cur.getColumnIndex(ContactsContract.Data.DATA15));
d=BitmapFactory.decodeByteArray(contactIcon, 0, contactIcon.length);
}
} catch (Exception e) {
e.printStackTrace();
}
return d;
}
以上代码亲测可用。因为都是可用的代码片段。粘帖即可使用。不再附源码。