一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android中BroadcastReceiver實現短信關鍵字自動回復功能

Android中BroadcastReceiver實現短信關鍵字自動回復功能

2022-02-28 15:48ruancw Android

實現手機短信監聽的方式有兩種:一是通過ContentObserver觀察者實現監聽,另一種就是通過廣播即BroadcastReceiver實現短信監聽,文章中通過使用BroadcastReceiver實現有新短信的及時監聽及包含設定的關鍵字時自動回復

前言:因公司業務需要,需要一臺手機專門回復客戶訂購的套餐的短信,之前一直是人工手動回復,但比較麻煩且回復可能不及時,于是項目經理就讓實現根據短信的關鍵字自動回復功能。

實現手機短信監聽的方式有兩種:一是通過ContentObserver觀察者實現監聽,另一種就是通過廣播即BroadcastReceiver實現短信監聽,文章中通過使用BroadcastReceiver實現有新短信的及時監聽及包含設定的關鍵字時自動回復.

效果圖:

Android中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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99九九精品视频 | 欧美一区二区三区综合色视频 | 国产亚洲女人久久久久久 | 免费看日产一区二区三区 | 欧美整片完整片视频在线 | 不知火舞被c视频在线播放 不卡一区二区三区卡 | 国内久久| 我要看免费毛片 | 免费观看二十女人一摸是水 | 俄罗斯美女毛茸茸bbwbbw | mmkk在线看片 | 精品无人区乱码1区2区3区免费 | 亚洲精品国产综合久久一线 | 欧美一区二区三区视视频 | 97精品国产高清在线看入口 | 邪恶肉肉全彩色无遮琉璃神社 | 亚洲欧美一 | www.5151淫| 波多野结衣在线免费观看 | 国内精品久久久久影院中国 | 晚上禁用的十大黄台视频 | 亚洲成人一区在线 | 啊好痛嗯轻一点免费 | 亚洲国产综合久久精品 | 好男人资源大全免费观看 | 亚洲第一福利视频 | 我和寂寞孕妇的性事 | 日本javaajax| 午夜久 | 无码人妻丰满熟妇啪啪网不卡 | 免费一级特黄特色大片在线观看 | 9 1 视频在线 | 免费91麻豆精品国产自产在线观看 | 欧美人与牲动交xxx 欧美人妖另类性hd 欧美人人干 | 日本春菜花在线中文字幕 | 轻轻操在线视频 | 日韩av线观看| 亚洲国产精品网站久久 | 日本乱子| eee在线播放成人免费 | 互换娇妻爽文100系列小说 |