内容提供者

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?