Contacts群组添加成员,多选列表过滤已添加数据

Group添加联系人时,Contacts默认设计不会过滤已分组的联系人。之前看到小米,oppo都做过过滤,一直懒得改。

最近客户要求group添加成员时,不显示已分组的联系人,故记录一下实现过程。

public void pickMembers() {
        Intent intent = new Intent(MultiPickContactActivity.ACTION_MULTI_PICK);
        intent.putExtra(MultiPickContactActivity.IS_CONTACT,true);
        //add by antoon, for group pick contacts
        intent.putExtra(MultiPickContactActivity.IS_GROUP_MEMBER_PICK,true);//增加标记,表示Contacts多选界面进行的是group pick member
        //end add
        intent.setClass(mActivity, MultiPickContactActivity.class);
        ContactListFilter filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ACCOUNT,
                PhoneAccountType.ACCOUNT_TYPE, SimContactsConstants.PHONE_NAME, null, null);
        intent.putExtra(AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER, filter);
        mActivity.startActivityForResult(intent, CODE_PICK_MEMBER);
    }

MultiPickContactActivity处理

//add by antoon, for group pick contacts
    public static final String IS_GROUP_MEMBER_PICK ="is_group_pick_contact"; 

public void onCreate(Bundle savedInstanceState) {
......
    else if (ACTION_MULTI_PICK.equals(action)) {
            if (!isContact) {
                mMode = MODE_DEFAULT_PHONE;
            } else {
                mMode = MODE_DEFAULT_CONTACT;
                //add by antoon, for group pick contacts
                if(getIntent().getBooleanExtra(IS_GROUP_MEMBER_PICK, false))
                    setTitle(R.string.ungrouped_contacts);
                //end add
            }
        }
......
}
public void startQuery() {
        Uri uri = getUriToQuery();
        ContactListFilter filter = (ContactListFilter) getIntent().getExtra(
                          AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER);
        if (filter != null) {
            if (filter.filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
                // We should exclude the invisiable contacts.
                uri = uri.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_NAME,
                         filter.accountName).appendQueryParameter(RawContacts.ACCOUNT_TYPE,
                         filter.accountType)
                        .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
                         ContactsContract.Directory.DEFAULT+"").build();

                //add by antoon, for group pick contacts
                if(getIntent().getBooleanExtra(IS_GROUP_MEMBER_PICK, false)){
                    uri = uri.buildUpon().appendQueryParameter(IS_GROUP_MEMBER_PICK, "true").build();//传递查询条件参数给ContactsProvider2使用
                }
                //end add

            } else if (filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
                // Do not query sim contacts in airplane mode.
                if (!isShowSIM()) {
                    uri = uri.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_TYPE,
                              SimAccountType.ACCOUNT_TYPE)
                             .appendQueryParameter(DefaultContactListAdapter.WITHOUT_SIM_FLAG,
                              "true").build();
                }
            }
        }
        String[] projection = getProjectionForQuery();
        String selection = getSelectionForQuery();
        String[] selectionArgs = getSelectionArgsForQuery();
        mQueryHandler.startQuery(QUERY_TOKEN, null, uri, projection, selection,
                selectionArgs, getSortOrder(projection));
    }

最关键是在ContactsProvider2中增加数据库查询判断条件。

protected Cursor queryLocal(final Uri uri, final String[] projection, String selection,
            String[] selectionArgs, String sortOrder, final long directoryId,
            final CancellationSignal cancellationSignal) {

        final SQLiteDatabase db = mDbHelper.get().getReadableDatabase();

        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        ......

        final int match = sUriMatcher.match(uri);
        switch (match) {
            case SYNCSTATE:
            case PROFILE_SYNCSTATE:
                return mDbHelper.get().getSyncState().query(db, projection, selection,
                        selectionArgs, sortOrder);

            case CONTACTS: {
                setTablesAndProjectionMapForContacts(qb, uri, projection);
                appendLocalDirectoryAndAccountSelectionIfNeeded(qb, directoryId, uri);//设置查询条件,where字句
                break;
            }
private void appendLocalDirectoryAndAccountSelectionIfNeeded(SQLiteQueryBuilder qb,
            long directoryId, Uri uri) {
        final StringBuilder sb = new StringBuilder();
        if (directoryId == Directory.DEFAULT) {
            sb.append("(" + Contacts._ID + " IN " + Tables.DEFAULT_DIRECTORY + ")");
        } else if (directoryId == Directory.LOCAL_INVISIBLE){
            sb.append("(" + Contacts._ID + " NOT IN " + Tables.DEFAULT_DIRECTORY + ")");
        } else {
            sb.append("(1)");
        }

        ......

        //add by nxd 2015-5-18, for local group pick contacts
        String isGroupMemPick = getQueryParameter(uri, IS_GROUP_MEMBER_PICK );
        if("true".equals(isGroupMemPick)){
            sb.append(" AND (" + Contacts.NAME_RAW_CONTACT_ID + " not IN (" +
                            "SELECT " + Data.RAW_CONTACT_ID + " FROM "
                            + Tables.DATA +
                            " WHERE " + Data.MIMETYPE + "_id ==13))");// mimetype_id==13说明已分组
        }
        //end add
        qb.appendWhere(sb.toString());
    }
时间: 2024-10-05 21:21:11

Contacts群组添加成员,多选列表过滤已添加数据的相关文章

#Linux学习笔记# Linux文件的所有者、群组和其他人

1.关于所有者.群组和其他人 在Linux系统中,每个文件都具有User.Group和Others三种身份的权限配置.那这三种身份分别表示什么意思呢?配置这三种身份的权限有啥意义呢? (1)文件所有者(User) 由于Linux系统支持多人多任务,因此常常存在多个用户同时使用一个Linux系统的情况.那么,如何确认每个用户私密文件的访问控制呢?这就是文件所有者存在的原因. Linux系统为每个用户提供一个用户主目录,用户的主目录为/home/<username>.例如,下图的/home/lie

云通讯 添加群组

群组和双向回呼是一个级别的 应为他们都是属于子账户的操作 所以 他们的子帐号鉴权信息验证是一样 在sdk包里添加 /** 添加组 */ function CreateGroup($Group) { //子帐号鉴权信息验证,对必选参数进行判空. $auth=$this->subAuth(); if($auth!=""){ return $auth; } // 拼接请求包体 if($this->BodyType=="json"){ $body= "

在窗体中有两个多选列表,用户可以从左侧列表中选择任意项,添加到右侧列表中。反之亦然。

<form name="myForm"> <table> <tr valign="top"> <td> <select name="leftList" multiple size="6" style="width:50px;"> <option>a</option> <option>b</option>

Day03_用户群组权限及正文处理命令

一.用户.群组和权限 用户及passwd文件 /etc/passwd文件的功能:存储所有用户的相关信息,该文件也被称为用户信息数据库(Database) /etc/passwd文件每个字段的具体含义 a) 第1个字段(列)记录的是这个用户的名字(在创建用户时root用户起的). b) 第2个字段(列)如果是x,表示该用户登录Linux系统时必须使用密码:如果为空,则该用户在登录时无须提供密码. c) 第3个字段(列)记录的是这个用户的uid. d) 第4个字段(列)记录的是这个用户所属群组的gi

针对群组资源的操作方法、群组服务器

本发明提供了一种针对群组资源的操作方法.群组服务器和执行针对群组资源的操作的装置,通过在发送给成员设备的成员资源操作请求中携带操作请求标识,以便成员资源所属的成员设备根据所述操作请求标识判断成员设备存储的操作请求标识中是否包含所述操作请求标识,并根据判断结果处理成员资源操作请求.从而能够避对成员资源的操作请求进行重复处理或循环处理. 技术领域 [0001]本发明涉及机器通信(Machine-to-Machine Communications, M2M)技术领域,尤其涉及针对群组资源方法.群组服务

zimbra用zmprov命令创建群组并授权向群组发邮件

zmprov工具能够执行许多任务,比如创建账号,别名,域名,COS,列表和日历等 对邮件管理员来说,在日常工作方面,zmporv是一个在CLI(command line interface)下强有力的工具,当然你也可以在管理员控制台执行这些操作 //邮件环境 系统centos6.4,zimbra7 zimbra正常工作,域名使用zijian.com 建立测试用户有user1,user2,user3,...user10 //群组信息查看 1.查看某个域名下所有群组(getAlldistributi

java crm 进销存 websocket即时聊天发图片文字 好友群组 SSM源码

博文来源:http://www.fhadmin.org/webnewsdetail4.html 系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM 普通java web(非maven, 附赠pom.xml文件)  数据库:mysql 3.开发工具:myeclipse  eclipse idea 均可, 没有限制. 我这边myeclipse 2014

聊天源码IM聊天室模板 群组聊天app 即时通讯IM设计聊天

(此贴长期有效)系统提供多种方式合作,支持源码转让/支持按年整体运维合作/支持行业定制开发,更多需求请联系我们 团队Tel:15538001716 (V同) 独立IM:个性化定制,私有化部署,全功能,高并发,快速拥有自己的微信.QQ或陌陌. I M+模块:Web.H5.App.小程序,简单几步实现消息.动态.点赞评论,变身社交+电商.资讯.游戏.支付.区块链-- 独立部署!加密通道!牢牢掌握通讯信息! 后台源码采用Java开发,maven环境Nettty框架.本地MySQL,MangoDB数据库

利用邓西百度网盘消息群发工具对百度网盘的群组、好友进行管理,批量分享文件

做百度网盘营销的小伙伴经常需要对百度网盘的群组.好友进行管理,但是百度网盘APP或者网页版里面对于这方面的功能太弱了,下面介绍如何利用工具对百度网盘群组.好友进行集中管理,并批量分享文件. 一,下载邓西百度网盘消息群发工具“https://pan.baidu.com/s/13yPBCs9Et_tQ9HVVCu5b2A” 二,运行程序后,添加帐号并登录,如图: ? 三.百度网盘好友管理(好友选项卡),可以查找好友,筛选单向,双向好友. 1.消息群发(仅支持百度网盘双向好友,可批量分享文件,发送消息