前言:因公司業務需要,需要一臺手機專門回復客戶訂購的套餐的短信,之前一直是人工手動回復,但比較麻煩且回復可能不及時,于是項目經理就讓實現根據短信的關鍵字自動回復功能。實現手機短信監聽的方式有兩種:一是通過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("");
}
});
歡迎轉載及留言,謝謝!!!