前言:因公司业务需要,需要一台手机专门回复客户订购的套餐的短信,之前一直是人工手动回复,但比较麻烦且回复可能不及时,于是项目经理就让实现根据短信的关键字自动回复功能。
实现手机短信监听的方式有两种:一是通过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进阶指南 可以扫码 解锁 《Android十大板块文档》
![](https://i-blog.csdnimg.cn/blog_migrate/fc689f489131f0f4af76ee0d8d82161f.jpeg)
1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路
敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔