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

这里造成错误的流程是 

短信设置--编辑常用短信--添加新短语--退至短信设置--再进入添加新短语--报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 的值,这样就不再有问题了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值