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实现短信关键字自动回复功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是 Android中BroadcastReceiver实现短信关键字自动回复功能 的全部内容, 来源链接: utcz.com/p/240644.html

回到顶部