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