MMS从Contacts中添加收件人显示email账号

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中关于“个人资料”和“联系人列表”一起显示的处理,和收藏界面(收藏,常用联系人一起显示)的处理。

               

              

原文地址:https://www.cnblogs.com/antoon/p/4390110.html