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 的值,这样就不再有问题了
- Mms 短信设置里添加常用短信时出现错误的解决办法
- 短信专题(SMS、MMS)
- 多媒体短信服务----MMS
- 短信发送--Mms短信群发实现原理
- Mms源代码接收短信流程
- Android短信Mms发送流程
- Android短信Mms接受流程
- android 信息(mms)的故事(三) -- 发短信
- android 信息(mms)的故事(七)-- sim卡短信
- Android 短信模块分析(四) MMS之短信的发送与接收
- 备份短信和添加短信
- 深度分析:Android中Mms设置页面更改短信中心号码流程
- 短信在Mms中处理流程
- 发送二进制短信时出现的问题,希望大家指点
- 记录一次短信推送时出现的bug
- 被窝里发短信
- android 短信下,添加联系人,进入联系人多选界面出现联系人电话号码晃动的问题
- APP里常用小功能,发短信、发邮件、打电话。
- 制作word生成器感悟
- 第2周项目1 函数参数传递的三种方式
- POJ3650解题报告
- 提交用户名和密码到指定的服务器
- [LeedCode OJ]#19 Remove Nth Node From End of List
- Mms 短信设置里添加常用短信时出现错误的解决办法
- 06-查看dns
- 机房收费——“上下机”还原生活
- netfilter/hook关于ICMP协议过滤的样例
- ListView+RecyclerView
- Java面试题
- sublime 常用正则表达式
- Android基础学习之Activity
- 深入理解C++动态绑定和静态绑定