Android中BroadcastReceiver实现短信关键字自动回复功能

 更新时间:2018年06月05日 11:42:49   作者:ruancw  
实现手机短信监听的方式有两种:一是通过ContentObserver观察者实现监听,另一种就是通过广播即BroadcastReceiver实现短信监听,文章中通过使用BroadcastReceiver实现有新短信的及时监听及包含设定的关键字时自动回复

前言:因公司业务需要,需要一台手机专门回复客户订购的套餐的短信,之前一直是人工手动回复,但比较麻烦且回复可能不及时,于是项目经理就让实现根据短信的关键字自动回复功能。

实现手机短信监听的方式有两种:一是通过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);
   //1.136
   //0.155
   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实现短信关键字自动回复功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Android中ProgressDialog的dismiss()与cancel()方法的区别

    Android中ProgressDialog的dismiss()与cancel()方法的区别

    本文主要介绍了Android中ProgressDialog的dismiss()与cancel()方法的区别,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • 详解Flutter中StatefulBuilder组件的使用

    详解Flutter中StatefulBuilder组件的使用

    StatefulBuilder小部件可以在这些区域的状态发生变化时仅重建某些小区域而无需付出太多努力。本文将来详细讲讲它的使用,需要的可以参考一下
    2022-05-05
  • Android UI组件Spinner下拉列表详解

    Android UI组件Spinner下拉列表详解

    这篇文章主要为大家详细介绍了Android UI组件Spinner下拉列表的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android获取触摸手势实现左右滑动

    Android获取触摸手势实现左右滑动

    这篇文章主要为大家详细介绍了Android获取触摸手势实现左右滑动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • DownloadManager实现文件下载功能

    DownloadManager实现文件下载功能

    这篇文章主要为大家详细介绍了DownloadManager实现文件下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Android 个人理财工具四:添加账单页面 下

    Android 个人理财工具四:添加账单页面 下

    本文主要介绍Android 个人理财工具添加账单页面,这里是添加账单的详情页面及如何使用Android Spinner控件的简单示例,有需要的小伙伴可以参考下
    2016-08-08
  • Android监听系统来电并弹出提示窗口

    Android监听系统来电并弹出提示窗口

    本篇文章主要介绍了Android监听系统来电并弹出提示窗口,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Android 自定义一套 Dialog通用提示框 (代码库)

    Android 自定义一套 Dialog通用提示框 (代码库)

    这篇文章主要介绍了Android 自定义一套 Dialog通用提示框 (代码库),需要的朋友可以参考下
    2017-04-04
  • Android中Java instanceof关键字全面解析

    Android中Java instanceof关键字全面解析

    instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例.这篇文章主要介绍了Android中Java instanceof关键字全面解析的相关资料,需要的朋友可以参考下
    2016-07-07
  • 故事讲解Activity生命周期(猫的一生)

    故事讲解Activity生命周期(猫的一生)

    关于Android中Activity的生命周期,网上大多数文章基本都是直接贴图、翻译API,比较笼统含糊不清。本文主要用故事讲解Activity生命周期。下面跟着小编一起来看下吧
    2017-03-03

最新评论