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. jvisual中添加jstatd远程监控

    visualVM远程监控: jvisual中需要增加插件安装. 在执行Java 应用程序的服务器上先生成一个jstatd.all.policy grant codebase "file:${ ...

  2. js keycode

    参考 https://www.cnblogs.com/daysme/p/6272570.html

  3. 七:python 对象类型详解三:列表

    一:列表简介: 1,列表可以包含任何种类的对象:数字.字符串甚至集合对象类型.列表都是可变对象,它们都支持在原处修改的操作,可以通过指定的偏移量和分片.列表方法调用.删除语句等方法来实现.关键的作用有 ...

  4. AttributeError: 'dict' object has no attribute 'iteritems'

    在python3.6中运行 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse= ...

  5. mycat配置实现mysql读写分离

    需要先把mysql的主从复制配置好,然后才可以开始mycat的配置 m ysql主从复制配置:https://www.cnblogs.com/renjianjun/p/9093062.html myc ...

  6. 179. Largest Number(INT, String)

    Given a list of non negative integers, arrange them such that they form the largest number. For exam ...

  7. ASCII码翻译方法可直接使用谷歌

    ASCII码翻译方法可直接使用谷歌. 如: key{you are right} 将此段ASCII码输入谷歌搜索栏,直接翻译结果:    

  8. jquery--blur()事件,在页面加载时自动获取焦点

    jquery--blur()事件会在页面加载时自动获取焦点,应将onblur写到html标签中 <div class="inputbox"> <input typ ...

  9. [剑指Offer]50-第一个只出现一次的字符

    题目链接 https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?tpId=13&tqId=11187&t ...

  10. [LeetCode_98]Validate Binary Search Tree

    题目链接 https://leetcode.com/problems/validate-binary-search-tree/ 题意 判断给定树是否是BST 思路 根据定义判断.递归. 代码 clas ...