android通讯录开发 增删改查(附Demo)

不废话,直接开撸

主要逻辑代码如下

单查询/增加联系人

/**
     * 写入手机联系人
     */
    private void writeContact() {
        String name = "test";
        String number = "13666668888";

        //先查询要添加的号码是否已存在通讯录中, 不存在则添加. 存在则提示用户
        Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + number);
        ContentResolver resolver = getContentResolver();
        //从raw_contact表中返回display_name
        Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data.DISPLAY_NAME}, null, null, null);
        if (cursor == null)
            return;

        if (cursor.moveToFirst()) {
            Log.i("nn", "name=" + cursor.getString(0));
            Toast.makeText(this, "存在相同号码", Toast.LENGTH_SHORT).show();
        } else {
            uri = Uri.parse("content://com.android.contacts/raw_contacts");
            ContentValues values = new ContentValues();
            long contact_id = ContentUris.parseId(resolver.insert(uri, values));
            //插入data表
            uri = Uri.parse("content://com.android.contacts/data");
            //add Name
            values.put("raw_contact_id", contact_id);
            values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/name");
            values.put("data2", "qq");
            values.put("data1", name);
            resolver.insert(uri, values);
            values.clear();

            //add Phone
            values.put("raw_contact_id", contact_id);
            values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/phone_v2");
            values.put("data2", "2");   //手机
            values.put("data1", number);
            resolver.insert(uri, values);
            values.clear();

            //add email
            values.put("raw_contact_id", contact_id);
            values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/email_v2");
            values.put("data2", "1");   //邮箱
            values.put("data1", "[email protected]");
            resolver.insert(uri, values);
            values.clear();

            //add organization
            values.put("raw_contact_id", contact_id);
            values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/organization");
            values.put("data4", "产品经理");   //职务
            values.put("data1", "腾讯科技");   //公司
            resolver.insert(uri, values);
            values.clear();

            Toast.makeText(this, "插入号码成功", Toast.LENGTH_SHORT).show();
        }
        cursor.close();
    }

注意: 使用魅族手机测试得到一个有趣的结果, 如果query时传入的只是一段短小的号码, 比如: 13612 那么会返回所有匹配包含到这各字段的结果, 例如有两个号码分别是 13612 99 8888 / 139 13612 888 .
那么最终查询则会返回号码存在的结果

删除联系人

/**
     * 删除联系人
     */
    private void deleteContact() {
        String name = "test";

        //根据姓名求id
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        ContentResolver resolver = getContentResolver();
        Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID}, "display_name=?", new String[]{name}, null);
        if (cursor == null)
            return;

        if (cursor.moveToFirst()) {
            int id = cursor.getInt(0);
            //根据id删除data中的相应数据
            resolver.delete(uri, "display_name=?", new String[]{name});
            uri = Uri.parse("content://com.android.contacts/data");
            resolver.delete(uri, "raw_contact_id=?", new String[]{id + ""});
            Toast.makeText(this, "删除号码成功", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "没有找到号码", Toast.LENGTH_SHORT).show();
        }
        cursor.close();
    }

更改联系人

/**
     * 更改联系人
     */
    private void changeContact(){
        String name = "test";
        String newPhone = "13644440000";
        //根据姓名求id
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        ContentResolver resolver = getContentResolver();
        Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID}, "display_name=?", new String[]{name}, null);
        if (cursor == null)
            return;

        if (cursor.moveToFirst()) {
            int id = cursor.getInt(0);
            ContentValues values = new ContentValues();
            values.put("data1", newPhone);
            resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2", id + ""});
        }else{
            Toast.makeText(this, "没有找到号码", Toast.LENGTH_SHORT).show();
        }
        cursor.close();
    }

列表查询

private List> mContactList = new ArrayList<>();

/**
     * 查询手机联系人并显示
     */
    private void queryContactsShowData() {
        mContactList.clear();
        Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        if (cursor == null)
            return;
        while (cursor.moveToNext()) {
            String phoneName;
            String phoneNumber;
            HashMap listItem = new HashMap<>();
            phoneName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            listItem.put("phoneName", phoneName);
            listItem.put("phoneNumber", phoneNumber);
            mContactList.add(listItem);
        }

        cursor.close();

        mRv.setAdapter(new ContactAdapter());
        mRv.setLayoutManager(new LinearLayoutManager(mContext));

    }

附上测试的Demo

https://gitee.com/geekqian/ContactDemo/tree/master

你可能感兴趣的:(android通讯录开发)