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. linux 后台运行命令

    command & 关闭终端,程序会终止 nohup command & 关闭终端,程序不会终止

  2. Spring 学习笔记

            Spring 的 Ioc 容器 所有的组件都是被动的( Passive),所有的组件初始化和调用都由容器负责.组件处在一个容器当中,由容器负责管理. BeanFactory 根据配置文 ...

  3. 【pycharm】使用过程的相关问题

    背景:安装scrapy后在cmd里可以正常import scrapy模块,但是在pycharm里不可以(python2.7) 问题:cmd中能正常导入模块,在pycharm报错 原因:pycharm里 ...

  4. new usercontrol

    http://www.codeproject.com/Articles/12421/The-Grouper-A-Custom-Groupbox-Control

  5. FileReader.FileWriter 执行文本复制

    //导包动作必须做,否则会出现大片错误提示 import java.io.*; class FileReaderDemo { publicstatic void main(String[] args) ...

  6. centos openvpn 安装

    安装环境: 系统:centos 6.5 openvpn:openvpn-2.2.1 lzo:lzo-2.09    下载地址:http://www.oberhumer.com/opensource/l ...

  7. linux下的ping工具--fping

    前言:       如果想ping 大量的不连续的地址,有想知道放回结果,在linux系统下有一个非常合适的工具--fping. Fping 官网:http://www.fping.org/ Fpin ...

  8. NumPy 迭代数组

    NumPy 迭代数组 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 接下来我们使用 arange() ...

  9. Docker学习之安装mysql

    1.从Docker检索mysql镜像 指令: docker search mysql 2.镜像下载 指令: docker pull mysql:5.7.19 3.查看本地镜像列表 指令: docker ...

  10. Codeforces Beta Round #67 (Div. 2)

    Codeforces Beta Round #67 (Div. 2) http://codeforces.com/contest/75 A #include<bits/stdc++.h> ...