前言:因公司業務需要,需要一臺手機專門回復客戶訂購的套餐的短信,之前一直是人工手動回復,但比較麻煩且回復可能不及時,于是項目經理就讓實現根據短信的關鍵字自動回復功能。
實現手機短信監聽的方式有兩種:一是通過ContentObserver觀察者實現監聽,另一種就是通過廣播即BroadcastReceiver實現短信監聽,文章中通過使用BroadcastReceiver實現有新短信的及時監聽及包含設定的關鍵字時自動回復.
效果圖:
清單文件添加權限:
1
2
3
4
|
<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方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
/** * 發送短信的方法 * @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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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)短信監聽的廣播注冊
1
2
3
4
5
|
<receiver android:name= ".SmsBroadcastReceiver" > <intent-filter android:priority= "999" > <action android:name= "android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> |
priority:設置優先級的屬性,999為最高優先級
(2)發送短信的服務注冊
1
|
<service android:name= ".SmsService" /> |
4.Activity中設置關鍵字及回復內容
(1)雙卡模式選擇發送卡
使用RadioGroup實現雙卡模式的選擇,并用SharePreference保存選中的短信發送卡
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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)設置短信關鍵字及回復內容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//保存關鍵字及回復內容 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實現短信關鍵字自動回復功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:https://blog.csdn.net/ruancw/article/details/80577929