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

来源:互联网 发布:周继红 田亮 知乎 编辑:程序博客网 时间:2024/06/06 03:09

不废话,直接开撸

主要逻辑代码如下

单查询/增加联系人

/**     * 写入手机联系人     */    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", "xxxx@qq.com");            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<HashMap<String, String>> 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<String, String> 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

原创粉丝点击