Mms 短信设置里添加常用短信时出现错误的解决办法

来源:互联网 发布:大非农数据利空金银 编辑:程序博客网 时间:2024/05/18 20:07

这里造成错误的流程是 

短信设置--编辑常用短信--添加新短语--退至短信设置--再进入添加新短语--报ANR

编辑常用短语的Activity是SmsTemplateEditActivity

每次第二次插入短语都会报错,点击出错的窗口后又可以插入了


其实在我不做任何更改的情况下,去设置里面将短信应用的数据清空也会报错

这是为什么了

点击短信设置的编辑常用用语

进入SmsTemplateEditActivity.java

进入onCreate方法里面

        super.onCreate(savedInstanceState);        MmsLog.d(TAG, "SmsTemplateEditActivity onCreate");        setContentView(R.layout.sms_template_edit_activity);        getActionBar().setDisplayHomeAsUpEnabled(true);        mToast = Toast.makeText(this, R.string.cannot_save_message, Toast.LENGTH_SHORT);        addButton = (Button) findViewById(R.id.quickText_add_button);        addButton.setTextSize(13);        addButton.setOnClickListener(new android.view.View.OnClickListener() {            public void onClick(View v) {                switch (v.getId()) {                case R.id.quickText_add_button:                    addQuickText();                    break;                default:                    break;                }            }        });        mListView = (ListView) findViewById(R.id.quick_text_list);        mListView.setOnItemClickListener(new OnItemClickListener() {            public void onItemClick(AdapterView<?> parent, View view,                    int position, long id) {                InputMethodManager inputM =                    (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);                if (getWindow() != null && getWindow().getCurrentFocus() != null) {                    inputM.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);                }                mQuickTextId = MmsConfig.getQuicktextsId().get(Integer.valueOf((int) id));                mQuickText = MmsConfig.getQuicktexts().get(Integer.valueOf((int) id));                showEditDialog();                return;            }        });        mNewQuickText = (EditText) findViewById(R.id.new_quick_text);        mNewQuickText.setHint(R.string.type_to_quick_text);        textItem = (TextView) findViewById(R.id.new_quick_text);
这部分代码主要是初始化这个编辑常用短语的界面,给添加按键和listview里面的item添加监听

        if (MmsConfig.getInitQuickText()) {            MmsLog.d(TAG, "MmsConfig.getInitQuickText() : " + MmsConfig.getInitQuickText()); String[] default_quick_texts = getResources().getStringArray(                    R.array.default_quick_texts);            MmsLog.d(TAG, "default_quick_texts : " + default_quick_texts);            for (int i = 0; i < default_quick_texts.length; i++) {// modify begin                //addST("");               int updateResult=updateST(i+1, default_quick_texts[i]);if(updateResult<=0){addST(default_quick_texts[i]);}//modify end            }            MmsConfig.setInitQuickText(false);


为什么要把addST("")注释掉,让我慢慢说,当我们进入设置--应用里面把Mms的数据清掉以后

启动Mms就会走上面的一段代码

default_quick_texts是系统自带的九个短语,这里做了一个循环,从0到8

每次都会调用addST(""),这里就会有问题了,找到addST方法

</pre><pre name="code" class="java">private boolean addST(String str) {        // Insert a new record into the Events data source.        // You would do something similar for delete and update.        if (hasQuicktext(str)) {            return false;        }        ContentValues values = new ContentValues();        values.put(_ID, mMaxQuickTextId + 1);        values.put(TEXT, str);        getContentResolver().insert(Telephony.MmsSms.CONTENT_URI_QUICKTEXT, values);        if (MmsConfig.getInitQuickText()) {            mMaxQuickTextId++;        }        return true;    }

它会在mMaxQuickTextId 之后在接着添加数据,而这时的

mMaxQuickTextId还没有计算,默认值是0;

在这里我们通过这一句

getContentResolver().insert(Telephony.MmsSms.CONTENT_URI_QUICKTEXT,values);

我们知道,这些短语的保存可能跟Telephony有关

Telephony是TelephonyProvider中的一个类,那么肯定是保存在了TelephonyProvider的数据库中
而现在数据库中已经存在了我们本来的9个短语和我们添加的一些短语,你再在1位置上添加空白短语
那肯定会报错。----所以我们将这句代码注释掉

int updateResult=updateST(i+1, default_quick_texts[i]);if(updateResult<=0){addST(default_quick_texts[i]);}

这段代码中updateST返回的是更新的那一行的number

因为设置清空的是一些配置,我每次push进去手机的是,apk文件,并不会改变
data先的数据库文件,所以,上面这个循环在设置清空后不会执行,
只有当这个应用第一次被安装的时候才会执行,将常用的这9个短语通过
addST加进去。
那么回到主题,为什呢么编辑一个短语后,退出来,再进入编辑另一个会报错了
让我们进入onResume方法中

 protected void onResume() {        super.onResume();        /// KK migration, for default MMS function. @{        boolean isSmsEnabled = MmsConfig.isSmsEnabled(this);        if (!isSmsEnabled) {            finish();        }Log.i("MmsQL", "onResume MmsConfig.getQuicktexts().size()="+MmsConfig.getQuicktexts().size());//modify begin                //if (MmsConfig.getQuicktexts().size() == 0) {            //mMaxQuickTextId = MmsConfig.updateAllQuicktexts();       // }                         mMaxQuickTextId = MmsConfig.updateAllQuicktexts();//modify end        MmsLog.d(TAG, "updateAllQuicktexts allQuickTexts : " + MmsConfig.getQuicktexts());        adapter.notifyDataSetChanged();        /// @}    }

MmsConfig.getQuicktexts()方法得到的是一个常用短语的list集合
里面有一个判断,当这个集合的size等于0时会执行得到mMaxQuickTextId 的方法
updateAllQuicktexts,这个方法在返回mMaxQuickTextId 的同时,将数据库中的数据
加载到了手机界面的Listview中
这设置里面将应用的数据清空后,第一次进入Mms进入编辑常用短语时并没有问题
因为此时,listview还没有从数据库中加载数据,里面还没有短语,size确实等于0,这个时候就得到了mMaxQuickTextId 的值,
然后调用 adapter.notifyDataSetChanged
但是,当我们退出以后第二次进入的时候就有问题了
因为此时,size已经不再是0,那么就不会执行这个
mMaxQuickTextId = MmsConfig.updateAllQuicktexts();
那么当我们添加一个短语时,点击添加按钮,会在id为1的位置上添加,而那个地方在数据库中是有值的,
所以会报错。就有了以上的更改,不要这个判断语句,直接每次执行onResume时,都会得到
mMaxQuickTextId 的值,这样就不再有问题了


0 0