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 =("
+ "SELECT _id FROM mimetypes "
+ "WHERE mimetype='vnd.android.cursor.item/local-groups')))");// mimetype_id=local-groups对应id,说明已分组
}
//end add
qb.appendWhere(sb.toString());
}
Contacts群组添加成员,多选列表过滤已添加数据的更多相关文章
- mssql sqlserver 使用sql脚本获取群组后,按时间排序(asc)第一条数据的方法分享
摘要: 下文讲述使用sql脚本,获取群组后记录的第一条数据业务场景说明: 学校教务处要求统计: 每次作业,最早提交的学生名单下文通过举例的方式,记录此次脚本编写方法,方便以后备查,如下所示: 实现思路 ...
- 1 实现添加功能 1.1 定义一个学员类(Student),在Student类中定义姓名、性别和年龄属性,定义有 参数的构造方法来初始化所以的成员属性 1.2 创建学员类对象来存放学员信息,并且为每一个学生对象添加的相应的编号。并将 学员类对象添加到Map<Integer,Student>集合中 1.3 添加完成后,显示所有已添加的学员姓名 1.4 限制年龄文本框只能输入正整数,否则的会采
学生类 package com.lanxi.demo1_3; public class Student { private String name; private String sex; priva ...
- #Linux学习笔记# Linux文件的所有者、群组和其他人
1.关于所有者.群组和其他人 在Linux系统中,每个文件都具有User.Group和Others三种身份的权限配置.那这三种身份分别表示什么意思呢?配置这三种身份的权限有啥意义呢? (1)文件所有者 ...
- apache Subversion 直接支持LDAP域群组
如果你的Subversion已经用apache的ldap支持用户认证功能,你是否常常在想,既然都用ldap支持认证,为什么不直接支持域群组, 反而在authz文件里面一个一个的手工定义,或者有人用脚本 ...
- JBoss 系列十七:使用JGroups构建块MessageDispatcher 构建群组通信应用
内容概要 本部分说明JGroups构建块接口MessageDispatcher,具体提供一个简单示例来说明如何使用JGroups构建块MessageDispatcher 构建群组通信应用 示例描述 构 ...
- chmod a+w . 权限控制 su、sudo 修改文件所有者和文件所在组 添加用户到sudoer列表中 当前用户信息
对当前目录对所有用户开放读写权限 chmod a+r . $ sudo chmod -R a+w /usr/lib/python2.7 所有用户添加文件的写权限 [linux]su.sudo.sudo ...
- 添加群组表AppGroup和群组详细表AppGroupDetails
添加群组表AppGroup和群组详细表AppGroupDetails CREATE TABLE [dbo].[AppGroup]( ) NOT NULL PRIMARY KEY, ) NOT NULL ...
- XMPP系列(七)---获取群组列表
上一篇介绍了如何创建群组,这一篇就介绍一下,如何获取自己的群组列表. 在上一篇有提到,如果我们创建的群组是公共的群组,那么获取自己的群组列表时,会获取到自己的群组列表和那些公共的群组.而实际做社交的应 ...
- JBoss 系列十九:使用JGroups构建块RspFilter对群组通信返回消息进行过滤
内容概述 本部分说明JGroups构建块接口RspFilter,具体提供一个简单示例来说明如何使用JGroups构建块RspFilter对群组通信返回消息进行过滤. 示例描述 我们知道构建块基于通道之 ...
随机推荐
- Object类概述
Object:类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.每个类都直接或者间接的继承自Object类. Object类的方法:public int hashCode() ...
- ubuntu16.04解决播放swf视频文件问题
使用下面 sudo apt-get install swfdec-gnome
- css学习笔记(6)
+++++++++++++++++ CSS HACK+++++++++++++++++IE6.0 能识别 _background:#ff00ff; *background:#ff00ff; +back ...
- json格式的数组长度
var data = [{"id":"1","name":"a"},{"id":"2&qu ...
- restfull api
REST 表示状态传输.这是一个体系结构样式,可用于设计网络服务,可以被各种客户端消耗.核心思想是,不使用如CORBA,RPC或SOAP复杂的机制在机器之间进行连接,简单的 HTTP 用于使它们之间调 ...
- QlikView TEXT控件固定显示图片
QlikView 的Text控件不仅可以用来展示文本也可以用来展示图片. 数据表 2个列,一个是 关联字段(Country),另外一个保存图片物理路径. TEXT控件固定显示图片 ,编辑控件表达式 = ...
- 为什么C++中空类和空结构体大小为1?(转载)
原文链接:http://www.spongeliu.com/260.html 对于结构体和空类大小是1这个问题,首先这是一个C++问题,在C语言下空结构体大小为0(当然这是编译器相关的).这里的空类和 ...
- js根据className获取元素封装
虽然有了getElementsByClassName,但是ie低版本不支持,所以我们需要单独定义一个getByClass function getByClass(className,parent){ ...
- 学习java第二天
首先我们要知道,java是特分大小写的,基本上分为 类名 我们统一小写 如果是多级的 我们用点来隔开 比如 file.test.number1,类或者接口的话基本上大家都是首字母大写,常量全部大写,然 ...
- projecteuler Problem 9 Special Pythagorean triplet
A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, a2 + b2 = c2 Fo ...