内容提供者
1.本地通讯录
1.1.权限
1.2.获取
方案一:ContactsContract.CommonDataKinds.Phone.CONTENT_URI
优点:速度快,几百,上千联系人读取都保持在毫秒级别
public static List<Contacts> getContacts(){
List<Contacts> contacts = new ArrayList<>();
String[] mContactsProjection = new String[] {
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_ID
};
String contactsId;
String phoneNum;
String name;
ContentResolver cr = MyApplication.getInstance().getContentResolver();
//查询contacts表中的所有数据
Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, mContactsProjection, null, null, null);
if(cursor.getCount() > 0){
while (cursor.moveToNext()){
contactsId = cursor.getString(0);
phoneNum = cursor.getString(1);
name = cursor.getString(2);
Contacts model=new Contacts();
model.setPhone(phoneNum);
model.setName(name);
model.setId(Integer.valueOf(contactsId));
contacts.add(model);
}
}
return contacts;
}
方案二:嵌套查询 ContactsContract.Contacts.CONTENT_URI
缺点:耗时严重,上千条数据耗时几十秒
public static List<Contacts> getContacts() {
List<Contacts> contacts = new ArrayList<>();
ContentResolver resolver = MyApplication.getInstance().getContentResolver();
Cursor idCursor = resolver.query(
ContactsContract.Contacts.CONTENT_URI,
new String[]{android.provider.ContactsContract.Contacts._ID}, null, null, null);
while (idCursor.moveToNext()) { //空指针
Contacts contact = new Contacts();
//获取到raw_contacts表中的id
int id = idCursor.getInt(0);
String idstr = idCursor.getString(idCursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));
contact.setId(id);
//根据获取到的ID查询data表中的数据
//Uri uri = Uri.parse("content://com.android.contacts/contacts/" + id + "/data");
Cursor dataCursor = resolver.query(
android.provider.ContactsContract.Data.CONTENT_URI,
// new String[]{
// android.provider.ContactsContract.Data.DATA1,
// android.provider.ContactsContract.Data.MIMETYPE,
// android.provider.ContactsContract.Data.RAW_CONTACT_ID}
null,
android.provider.ContactsContract.Data.CONTACT_ID + "=" + idstr,
null, null);
while (dataCursor.moveToNext()) {
Log.i("rawid", "-------------\n");
String data = dataCursor.getString(dataCursor.getColumnIndex(android.provider.ContactsContract.Data.DATA1));
String mimetype = dataCursor.getString(
dataCursor.getColumnIndex(android.provider.ContactsContract.Data.MIMETYPE));
int rawid = dataCursor.getInt(2);
contact.setRawid(rawid);
Log.i("rawid", "某联系人下:" + rawid + "");
if (mimetype.contains("/name")) {
contact.setName(data);
}
if (mimetype.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
int phoneType = dataCursor.getInt(dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
contact.getPhones().add(data);
//手机号
if (phoneType == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE) {
String mobile = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contact.setPhone(mobile);
}
//住宅
if (phoneType == ContactsContract.CommonDataKinds.Phone.TYPE_HOME) {
if (StringUtils.isEmpty(contact.getPhone())) {
String mobile = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contact.setPhone(mobile);
}
}
//单位
if (phoneType == ContactsContract.CommonDataKinds.Phone.TYPE_WORK) {
if (StringUtils.isEmpty(contact.getPhone())) {
String mobile = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contact.setPhone(mobile);
}
}
//其它
if (StringUtils.isEmpty(contact.getPhone())) {
//String mobile = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.number));
contact.setPhone(data);
}
}
if (mimetype.contains("/nickname")) {
contact.setNickname(data);
}
}
contacts.add(contact);
dataCursor.close();
}
idCursor.close();
return contacts;
}
参考文献
Last updated
Was this helpful?