android系统默认代码,MMS中可以添加email地址作为收件人,但是从Contacts中选择收件人时却不显示email。

解决思路:为了降低修改量,在原来只搜索phoneNum的基础上,再做一次查询搜索email不为空的联系人,然后将两次结果合并显示(用MergeCursor合并两次查询的cusor)。

com.android.contacts.editor.MultiPickContactActivity中修改。

private class QueryHandler extends AsyncQueryHandler {
protected WeakReference<MultiPickContactActivity> mActivity; public QueryHandler(Context context) {
super(context.getContentResolver());
mActivity = new WeakReference<MultiPickContactActivity>(
(MultiPickContactActivity) context);
} @Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
//add for mms pick email ---------------------------
if(request_from_mms && token != QUERY_TOKEN_FOR_MMS){
mmsCursor = cursor;
startQuery(QUERY_TOKEN_FOR_MMS, null, Email.CONTENT_URI, EMAILS_PROJECTION, null,
null, getSortOrder(EMAILS_PROJECTION));
return;
}//end add for mms pick email ----------------------- // In the case of low memory, the WeakReference object may be
// recycled.
if (mActivity == null || mActivity.get() == null) {
mActivity = new WeakReference<MultiPickContactActivity>(
MultiPickContactActivity.this);
}
final MultiPickContactActivity activity = mActivity.get();
//activity.mAdapter.changeCursor(cursor); //modified for mms pick email ------------
if (cursor == null || cursor.getCount() == 0) {
if (isPickCall()) {
//do nothing
} else if (!activity.mAdapter.mIsContentChanged) {
Toast.makeText(mContext, R.string.listFoundAllContactsZero, Toast.LENGTH_SHORT)
.show();
} else {
activity.mAdapter.mIsContentChanged = false;
}
} //add for mms pick email -----------------------------
if(request_from_mms && token == QUERY_TOKEN_FOR_MMS){
if(cursor!=null && cursor.getCount()!=0){
Cursor merCur = new MergeCursor(new Cursor[]{mmsCursor,cursor});
activity.mAdapter.changeCursor(merCur);
}else
activity.mAdapter.changeCursor(mmsCursor);
}else
activity.mAdapter.changeCursor(cursor);
//end add for mms pick email ---------------------------
}
}

经验证,此修改会引发新的问题——搜索框中输入字符搜索,然后清空搜索框,必现Contacts报错。

Process: com.android.contacts, PID: 13074
04-07 15:48:37.340: E/AndroidRuntime(13074): java.lang.IllegalArgumentException: column '_id' does not exist
04-07 15:48:37.340: E/AndroidRuntime(13074): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
04-07 15:48:37.340: E/AndroidRuntime(13074): at android.widget.CursorAdapter.swapCursor(CursorAdapter.java:342)
04-07 15:48:37.340: E/AndroidRuntime(13074): at android.widget.CursorAdapter.changeCursor(CursorAdapter.java:313)
04-07 15:48:37.340: E/AndroidRuntime(13074): at com.android.contacts.editor.MultiPickContactActivity$ContactItemListAdapter.changeCursor(MultiPickContactActivity.java:1660)
04-07 15:48:37.340: E/AndroidRuntime(13074): at com.android.contacts.editor.MultiPickContactActivity$QueryHandler.onQueryComplete(MultiPickContactActivity.java:1419)

是MergeCursor调用getColumnIndexOrThrow("_id")出现报错,为什么"_id"会找不到呢?

public class MergeCursor extends AbstractCursor{
...... @Override
public String[] getColumnNames()
{
if (mCursor != null) { //----------- 如果这里mCursor为null, 就会导致ColumnNames中没有"_id"
return mCursor.getColumnNames();
} else {
return new String[0];
}
}
}
......
}

后续参考Contacts中关于“个人资料”和“联系人列表”一起显示的处理,和收藏界面(收藏,常用联系人一起显示)的处理。

MMS从Contacts中添加收件人显示email账号的更多相关文章

  1. PagerTabStrip在ViewPager的页面中添加标题显示

    package com.qf.day18_viewpager_demo_05; import java.util.ArrayList; import java.util.List; import an ...

  2. 在MFC对话框中添加状态栏

    如果我们想实现在MFC对话框中添加状态栏显示,如何例如分状态栏为两列,第一列显示鼠标的当前位置,第二列显示当前的时间,(如上图). 1. 首先,打开在资源视图的String Table并添加两个ID: ...

  3. ligerui_实际项目_003:form中添加数据,表格(grid)里面显示,最后将表格(grid)里的数据提交到servlet

    实现效果: "Form"中填写数据,向本页"Grid"中添加数据,转换成Json数据提交,计算总和,Grid文本框可编辑,排序 图片效果: 总结: //disp ...

  4. cocos2d-x 中添加显示文字的三种方式 LabelTTF 、LabelBMFont 和 LabelAtlas

    在 cocos2d-x 中有三个类可以在层或精灵中添加文字: LabelTTF LabelBMFont LabelAtlas LabelTTF 直接支持使用 TTF 字库,可以支持全部的中文,但是效率 ...

  5. cocos中添加显示文字的三种方式(CCLabelTTF 、CCLabelBMFont 和CCLabelAtlas)

    CCLabelTTF CCLabelTTF 每次调用 setString (即改变文字)的时候,一个新的OPENGL 纹理将会被创建..这意味着setString 和创建一个新的标签一样慢. 这个类使 ...

  6. Jmeter+Jenkins的聚合报告中添加QPS栏目显示

    1.进入jmeter/extras目录,修改 jmeter-results-detail-report_21.xsl   2.打开文件修改 如上所示,在文件中添加6个地方关于QPS的显示即可, 然后替 ...

  7. 给iOS项目中添加图片,并通过UIImageView引用和显示该UIImage图片

    [问题] 关于iOS/iPhone中的文件选择对话框,用于用户去选择图片等文件 过程中,问题转换为,需要给当前iOS项目中,添加一个图片. 类似于Windows开发中的资源文件,其中图片文件属于资源的 ...

  8. Jmeter+Jenkins的HTML报告中添加QPS、90%栏目显示

    1.进入jmeter/extras目录,修改 jmeter-results-detail-report_21.xsl   2.打开文件 在summary部分修改如下: 在pagelist部分修改如下: ...

  9. 一、SAP中添加一个模块到收藏夹后,显示事务代码

    一.在SAP中,如果添加一个模块到收藏夹,默认是看不到事务代码的,如图: 二.我们在附件->设置中勾选显示技术名称 三.保存之后,就会显示出事务代码,如图所示: 不忘初心,如果您认为这篇文章有价 ...

随机推荐

  1. google翻译插件安装

    来源:http://www.cnplugins.com/tools/how-to-setup-crx.html 1. 下载: 2.拖拽: 3.下一步安装 4.完成.

  2. 解决VMware下CentOS连不上网络问题

    https://blog.csdn.net/wangmx1993328/article/details/80897533

  3. Mysql 密码相关

    MySQL5.6.6版本之后增加了密码强度验证插件validate_password,相关参数设置的较为严格 一.密码复杂度 1.密码复杂度配置文件:/etc/my.cnf  (CentOS 7下) ...

  4. 二次注入的学习--Buy Flag(http://10.112.68.215:10002)

    这次有做一个二次注入的天枢CTF题目,算是完整地理解了一遍注入的知识.来,启航.   1.判断注入点     经过对题目的实践分析,知道注册时需要输入年龄大于18岁,但在登录后界面,年龄因为太大不能接 ...

  5. c#: List.Sort()实现稳固排序(stable sort)

    1. 源起: KV 7.0加入列表管理功能,处理排序问题时,对空列表执行按大小.日期.长度排序发现,其中次序会发生改变,令人纳闷. 没天理呀,不应该啊!List.Sort()方法,它为什么? 对此问题 ...

  6. Mysql数据备份与还原

    一.数据备份 1.使用mysqldump命令备份 mysqldump命令将数据库中的数据备份成一个文本文件.表的结构和表中的数据将存储在生成的文本文件中. mysqldump命令的工作原理很简单.它先 ...

  7. 汇编中CMP的作用

    假设现在AX寄存器中的数是0002H,BX寄存器中的数是0003H.执行的指令是:CMP  AX,  BX 执行这条指令时,先做用AX中的数减去BX中的数的减法运算.列出二进制运算式子:      0 ...

  8. ubuntu 无法挂载U盘

    问题描述: usb 1-1: device descriptor read/64,error 18usb 1-1: device descriptor read/64,error 18usb 1-1: ...

  9. vue通过代理实现跨域

    http://www.cnblogs.com/wangyongcun/p/7665687.html

  10. Vue 数据的双向绑定

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...