添加短信签名功能

  • 先在设置-短信-基本设置面板中增加短信签名项,位置: vendor/mediatek/proprietary/packages/apps/Mms/res/xml/generalpreferences.xml,添加
    <Preference android:key="pref_key_message_signature"
        android:title="@string/zuk_message_signature"
        android:widgetLayout="@layout/zuk_preference_widget_forward">
    </Preference>

  • 然后要给该项Preference设置点击事件,点击后会弹出一个编辑Dialog,这里涉及数据持久化中的SharedPreferences知识
  • 位置:vendor/mediatek/proprietary/packages/apps/Mms/src/com/mediatek/setting/SmsSingleRecipientSender.java
  • 导入的包:
    import android.content.SharedPreferences;
    import android.widget.EditText;
    import android.text.InputFilter;//续
    import android.app.AlertDialog;
    import android.content.DialogInterface.OnClickListener;//续
  • 定义的常量和声明的变量
    public static final String MESSAGE_SIANATURE="pref_key_message_signature";//这里把在xml布局文件中定义的key赋值给一个字符串常量,常量大写是编码规范
    private static final int MAX_EDITABLE_LENGTH=20;
    private Preference mMessageSignaturePref;//续
    private AlertDialog mSignatureTextDialog;
    private EditText mSignatureText;
  • 对声明的变量mMessageSignaturePref进行初始化,初始化位置是setMessagePreferences()方法
    mMessageSignaturePref=(Preference)findPreference(MESSAE_SIGNATURE);
  • 给该Preference项设置点击事件,位置是onPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference preference)方法
     }else if(preference==mMessageSignaturePref){
            AlertDialog.Builder dialog=new AlertDialog.Builder(this);//建立一个AlertDialog.Builder对象
            mSignatureText=new EditText(dialog.getContext());
            //给EditText对象赋值,传入的参数是AlertDialog.Builder的Context,说明该EditText出现在弹出的AlertDialog中
            //对EditText对象设置属性
            mSignatureText.setHint(R.string.type_to_compose_text_enter_to_send);//提示用户键入信息
            mSignatureText.computeScroll();//由父视图调用用来请求子视图根据偏移值 mScrollX,mScrollY重新绘制,还不是很懂
            mSignatureText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_EDITABLE_LENGTH)});//续
            //SharedPreferences pref=getSharedPreferences("signature",MODE_PRIVATE);
            SharedPreferences pref=getsharedPreferences(MMS_PREFERENCE,MODE_PRIVATE);
            //private static final string MMS_PREFERENCE="com.android.mms_preferences";
            String gotSignatureText=pref.getString("signatureText","from ZUK");
            //获取存储在SharedPreferences中键signatureText对应的值,默认(初始)值是from ZUK
            mSignatureText.setText(gotSignatureText);//把得到的值显示在EditText栏中
            nSignatureText.setTextColor(R.color.black);//给text设置颜色
            mSignatureTextDialog=dialog.setIcon(R.drawable.ic_dialog_info_holo_light).setTitle( 
                    R.string.sms_signature_edit).setView(mSignatureText).setPositiveButton( 
                    R.string.OK,new PositiveButtonListener()).setNegativeButton(
                    R.string.Cancel,new NegativeButtonListener()).show();
            //setView是把之前定义的EditText对象传入AlertDialog中,
            // setPositiveButton需要传入ok键的名称和ok键的监听对象,这里的监听类是PositiveButtonListener,
            // 该类需要实现接口android.content.DialogInterface.OnClickListener,在这个类中实现ok键的点击逻辑的实现。
            // AlertDialog.builder对象调用show()方法会返回一个AlertDialog对象
  • Ok键和Cancel键的点击逻辑实现
     private class PositiveButtonListener implements OnClickListener{
                public void onClick(DialogInterface dialog,int which){
                    String signatureString=mSignatureText.getText().toString();
                    //获取EditText对象中的文本内容并转换为字符串形式
                    //存储数据的操作可以开启一个新线程来完成,减少主线程阻塞
                    new Thread(new Runnable(){
                        public void run(){
                            //SharedPreferences.Editor editor=getSharedPreferences("signature",MODE_PRIVATE).edit();
                            SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(
                                    GeneralPreferenceActivity.this).edit();
                            //这样更规范,和整体代码编写保持统一,导入android.preference.PreferenceManager
                            editor.putString("signatureText",signatureString);
                            editor.commit();  }
                        //以上是向SharedPreferences存储内容的操作
                    }).start();
                }
            }
           mMessageText=addSignature.toString();//再由StringBuffer类型转换为String类型
            private class NegativeButtonListener implements OnClickListener{
                public void onClick(DialogInterface dialog,int which){
                    dialog.dismiss();//弹出的dialog消失
                }
            }



  • 最后要在实现发送短信功能的类中通过SharedPreferences获取在设置中存储的内容,添加在发送的短信中,这样我们就完成了短信签名功能
  • 位置:vendor/mediatek/propietary/packages/apps/Mms/src/com/android/mms/transaction/SmsSingleRecipientSender.java
  • 在方法sendMessage方法中添加如下内容
    private static final String MMS_PREFERENCE=“com.android.mms_preferences";
            StringBuffer addSignature =new StringBuffer(mMessageText);
            //mMessageText是在类SmsSingleRecipientSender继承的类
            //SMSMessageSender中定义的String类型常量,由于我们要对mMessageText进行修改,
            // 因此要去掉final修改,改常量为变量
            // SharedPreferences pref=mContext.getSharedPreferences("signature",0);
            SharedPreferences pref=mContext.getSharedPreferences(MMS_PREFERENCE,0);
            //需要导入android.content.SharedPreferrences
            //这里需要强调,mContext是继承的类SMSMessageSender中定义的Context对象,
            // 这里如果写成SharedPreferences pref=getSharedPreferences("signature",0);则会报错,
            // 提示方法getSharedPreferences没有在该类中定义,原因是getSharedPreferences是Context类中定义的方法,
            // 只有在继承了Context的类中才能直接使用,例如Activity中
            String gotSignatureText=pref.getString("signatureText","");
            if(gotSignatureText!=null && !gotSignatureText.equals("")){
                //如果gotSignatureText不为空并且也不为空字符串
                // 这里需要强调判断String对象是否和某字符串相等要用equals方法,gotSignatureText!=null是不对的
                addSignature.append("\r\n"+gotSignatureText);// 在尾部添加签名内容
                }
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值