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

                   

                  

  • 相关阅读:
    Python自动化开发-基础语法
    Python自动化开发-简介
    Hello World!
    Mongo导出数据文件导致错误 Got signal: 6 (Aborted)解决方法
    PHP快速排序及其时间复杂度
    PHP读某一个目录下所有文件和文件夹
    PHP获得两个绝对路径的相对路径
    awk神器
    PHP使用Mysql事务
    PHP使用session_set_save_handler陷阱
  • 原文地址:https://www.cnblogs.com/antoon/p/4390110.html
Copyright © 2011-2022 走看看