美文网首页
Android中BroadcastReceiver实现短信关键字

Android中BroadcastReceiver实现短信关键字

作者: ruancw | 来源:发表于2018-06-05 11:50 被阅读60次

    前言:因公司业务需要,需要一台手机专门回复客户订购的套餐的短信,之前一直是人工手动回复,但比较麻烦且回复可能不及时,于是项目经理就让实现根据短信的关键字自动回复功能。实现手机短信监听的方式有两种:一是通过ContentObserver观察者实现监听,另一种就是通过广播即BroadcastReceiver实现短信监听,文章中通过使用BroadcastReceiver实现有新短信的及时监听及包含设定的关键字时自动回复.

    效果图:

    效果图

    清单文件添加权限:

    <uses-permission android:name="android.permission.SEND_SMS" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS" /> 
    <uses-permission android:name="android.permission.READ_SMS" /> 
    <uses-permission android:name="android.permission.WRITE_SMS" />
    

    1.自定义SmsBroadcastReceiver

    (1)自定义SmsBroadcastReceiver继承自BroadcastReceiver,并重写OnReceive方法

    mContext = context;  
    //获取短信的bundle 
    Bundle bundle = intent.getExtras(); 
    //短信对象 
    SmsMessage msg; 
    if (null != bundle) {
        //获取pdu编码的短信数组(接受的短信都是以pdu编码的16进制数组)
        Object[] smsObj = (Object[]) bundle.get("pdus");
        for (Object object : smsObj) {
            //将pdu编码的短信解析为SmsMessage对象
            msg = SmsMessage.createFromPdu((byte[]) object);
            //获取短信内容
            String msgBody = msg.getDisplayMessageBody();
            //获取发送短信的号码
            String number = msg.getOriginatingAddress();
            //获取短信时间戳
            long time = msg.getTimestampMillis();
            //获取我们在主页面设置的要回复短信的关键字及短信内容的bean
            List<SmSBean> smsList = ShareUtil.getInstance(context).getSMS();
            for (SmSBean bean : smsList) {
                //判断短信内容是否包含设置的关键字
                if (!TextUtils.isEmpty(msgBody) && msgBody.contains(bean.key)) {
                    //如果包含,则自动发送短信
                    AutoSendSms(bean.content, context, number, time, msgBody);
                    break;  
                }
            }
        }
    }
    

    (2)定义自动发送短信的方法AutoSendSms

    /**  
    * 发送短信的方法 
    * @param msg 发送的短信内容  
    * @param context 上下文对象  
    * @param number 接受短信的号码  
    * @param time 时间戳  
    * @param msgBody 接受到的短信  
    */ 
    private void AutoSendSms(String msg, Context context, String number, long time, String msgBody) {
        //获取短信管理器
        SmsManager SM = SmsManager.getDefault();
        //通过反射获取短信管理类
        Class SMClass = SmsManager.class; //通过反射查到了SmsManager有个叫做mSubId的属性
        // 创建发送短信意图  
        Intent sentIntent = new Intent(SENT_SMS_ACTION);    Field field = null;
        try {
            field = SMClass.getDeclaredField("mSubId");
            field.setAccessible(true);
            try {
                //获取发送短信的卡
                int smsType = ShareUtil.getInstance(context).getSMSType();
                field.set(SM, smsType);
                sentIntent.putExtra("address", number);
                sentIntent.putExtra("msg", msg);
                sentIntent.putExtra("time", time);
                sentIntent.putExtra("msgBody", msgBody);
                PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent,0);
                //自动发送短信
                SM.sendTextMessage(number, null, msg, sentPI, null);
                Log.e("TAG", "onCreate: sendTextMessage");
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
      }
    }
    

    2.定义自动发送短信的SmsService

    public class SmsService extends Service {
        private static final String TAG = SendSMSService.class.getSimpleName();    @Nullable
        @Override  public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();  
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(SendSMSService.this, "SmsService------------", Toast.LENGTH_SHORT).show();           
                }
            }, 10000);      
        }
    }
    

    3.清单文件注册

    (1)短信监听的广播注册

    <receiver android:name=".SmsBroadcastReceiver">
       <intent-filter android:priority="999">
       <action android:name="android.provider.Telephony.SMS_RECEIVED" />
       </intent-filter> 
    </receiver>
    

    priority:设置优先级的属性,999为最高优先级

    (2)发送短信的服务注册

    <service android:name=".SmsService" />
    

    4.Activity中设置关键字及回复内容

    (1)双卡模式选择发送卡

    使用RadioGroup实现双卡模式的选择,并用SharePreference保存选中的短信发送卡

    mRgSim.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            switch (checkedId) {
                case R.id.rb_1:
                    simType = 0;
                    ShareUtil.getInstance(MainActivity.this).saveSMSType(simType);
                    break; 
                case R.id.rb_2:
                    simType = 1;
                    ShareUtil.getInstance(MainActivity.this).saveSMSType(simType);
                    break; 
                default:
                    ShareUtil.getInstance(MainActivity.this).saveSMSType(simType);
                    break;  
            }
        }
    });
    

    (2)设置短信关键字及回复内容

    //保存关键字及回复内容 
    mEtSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //关键字
            String key = mEtKey.getText().toString().trim();
            //回复的内容
            String content = mEtContent.getText().toString().trim();
            //保存关键字及内容的bean
            SmSBean bean = new SmSBean(key, content);
            //获取之前已添加的关键字及内容
            init();
            //添加新的关键字及内容
            mDataList.add(bean);
            //用sharePreference保存关键字及内容对象集合
            ShareUtil.getInstance(MainActivity.this).saveSMS(mDataList);   //将关键字及内容输入框置空
            mEtKey.setText("");
            mEtContent.setText("");
      }
    });
    

    欢迎转载及留言,谢谢!!!

    相关文章

      网友评论

          本文标题:Android中BroadcastReceiver实现短信关键字

          本文链接:https://www.haomeiwen.com/subject/uwspsftx.html