Android读取通讯录数据

第一步,配置权限


    

如果需要存储,还需要存储权限

 
    

第二步,编写联系人获取工具类ContractsUtil

public class ContractsUtil {


    //获取通讯录联系人
    public static void getContacts(Context context) {
        //联系人的Uri,也就是content://com.android.contacts/contacts
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        //指定获取_id和display_name两列数据,display_name即为姓名
        String[] projection = new String[]{
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME
        };
        //根据Uri查询相应的ContentProvider,cursor为获取到的数据集
        Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
        String[] arr = new String[cursor.getCount()];
        int i = 0;

        if (cursor != null && cursor.moveToFirst()) {
            do {
                try {
                    Long id = cursor.getLong(0);
                    //获取姓名
                    String name = cursor.getString(1);

                    //指定获取NUMBER这一列数据
                    String[] phoneProjection = new String[]{
                            ContactsContract.CommonDataKinds.Phone.NUMBER
                    };
                    //根据联系人的ID获取此人的电话号码
                    Cursor phonesCusor = context.getContentResolver().query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            phoneProjection,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,
                            null,
                            null);
                    //因为每个联系人可能有多个电话号码,所以需要遍历
                    if (phonesCusor != null && phonesCusor.moveToFirst()) {
                        do {
                            String num = phonesCusor.getString(0).replaceAll("[^0-9]", "");
                    //我这里是存储到数据库,如果想获取返回的数据,可以用一个HashMap来接收
                            List contracts = LitePal.where("number = ?", num).find(Contracts.class);
                            if (contracts.size() == 0) {
                                Contracts ct = new Contracts();
                                ct.setName(name);
                                ct.setNumber(num);
                                ct.save();
                            } else {
                            }
                        } while (phonesCusor.moveToNext());
                    }
                    i++;
                } catch (PinyinException e) {
                    e.printStackTrace();
                }
            } while (cursor.moveToNext());
        }
    }

}

第三步:使用

可以提前新开一个线程执行读取联系人的操作,需要匹配的时候只需要进行数据库查找即可

第四步:匹配

先判断外部输入的数据call_number

boolean isNumber = StringUtils.isNumeric(call_number);

如果是数字,则进行电话号码匹配

List con = LitePal.where("number like '%" + call_number + "%'").find(Contracts.class);

如果是文字,则进行名字匹配

List con = LitePal.where("name like '%" + call_number+ "%'").find(Contracts.class);

通讯录的名字存储中会有包含数字,字母和特殊字符的情况,可以把这些考虑进去进行进一步完善

你可能感兴趣的:(安卓开发)