Android中BroadcastReceiver实现短信关键字自动回复功能
时间:2019-04-15
本文章向大家介绍Android中BroadcastReceiver实现短信关键字自动回复功能,主要包括Android中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实现短信关键字自动回复功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
- docker学习(4) 一些常用操作
- Java多线程之细说线程池
- Windows8异步编程的注意事项
- Spring(一)Spring的第一滴血
- Flume(一)Flume原理解析
- 我所理解的Remoting (2) :远程对象的生命周期管理[下篇]
- struts2(六)之ognl表达式与ActionContext、ValueStack
- Windows8异步编程的注意事项
- CSS魔法堂:深入理解line-height和vertical-align
- Gradle 10分钟上手指南
- gradle项目中profile的实现
- 欧盟推出“数字经济税收制度”优化了税收制度,却影响区块链行业
- CSS魔法堂:你一定误解过的Normal flow
- ASP.NET输出JSON格式数据
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Chrome 技术篇-一台电脑设置多个独立chrome方法。chrome独立多开技术。
- 023.Ubuntu常见个性化配置
- 快速学习-ElasticJob的FAQ
- 设计模式~状态模式
- 程序员该造轮子吗,造轮子能升职加薪吗?
- 1.基本标签
- 细品mysql之Join 语句的执行过程
- A Java Fork/Join Framework(Doug Lea 关于java Fork/Join框架的论文翻译)
- Mysql 的安装
- Spring系列之数据源的配置 数据库 数据源 连接池的区别
- STM32F4 SPI DMA
- 快速学习-XXL-JOB总体设计
- Android中Input事件初始化、接收以及分发
- 快速学习-XXL-JOB操作指南
- 快速学习-XXL-JOB任务详解