Android中BroadcastReceiver實(shí)現(xiàn)短信關(guān)鍵字自動(dòng)回復(fù)功能
前言:因公司業(yè)務(wù)需要,需要一臺(tái)手機(jī)專門回復(fù)客戶訂購的套餐的短信,之前一直是人工手動(dòng)回復(fù),但比較麻煩且回復(fù)可能不及時(shí),于是項(xiàng)目經(jīng)理就讓實(shí)現(xiàn)根據(jù)短信的關(guān)鍵字自動(dòng)回復(fù)功能。
實(shí)現(xiàn)手機(jī)短信監(jiān)聽的方式有兩種:一是通過ContentObserver觀察者實(shí)現(xiàn)監(jiān)聽,另一種就是通過廣播即BroadcastReceiver實(shí)現(xiàn)短信監(jiān)聽,文章中通過使用BroadcastReceiver實(shí)現(xiàn)有新短信的及時(shí)監(jiān)聽及包含設(shè)定的關(guān)鍵字時(shí)自動(dòng)回復(fù).
效果圖:
清單文件添加權(quán)限:
<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編碼的短信數(shù)組(接受的短信都是以pdu編碼的16進(jìn)制數(shù)組) Object[] smsObj = (Object[]) bundle.get("pdus"); for (Object object : smsObj) { //將pdu編碼的短信解析為SmsMessage對象 msg = SmsMessage.createFromPdu((byte[]) object); //獲取短信內(nèi)容 String msgBody = msg.getDisplayMessageBody(); //獲取發(fā)送短信的號(hào)碼 String number = msg.getOriginatingAddress(); //獲取短信時(shí)間戳 long time = msg.getTimestampMillis(); //獲取我們在主頁面設(shè)置的要回復(fù)短信的關(guān)鍵字及短信內(nèi)容的bean List<SmSBean> smsList = ShareUtil.getInstance(context).getSMS(); for (SmSBean bean : smsList) { //判斷短信內(nèi)容是否包含設(shè)置的關(guān)鍵字 if (!TextUtils.isEmpty(msgBody) && msgBody.contains(bean.key)) { //如果包含,則自動(dòng)發(fā)送短信 AutoSendSms(bean.content, context, number, time, msgBody); break; } } } }
(2)定義自動(dòng)發(fā)送短信的方法AutoSendSms
/** * 發(fā)送短信的方法 * @param msg 發(fā)送的短信內(nèi)容 * @param context 上下文對象 * @param number 接受短信的號(hào)碼 * @param time 時(shí)間戳 * @param msgBody 接受到的短信 */ private void AutoSendSms(String msg, Context context, String number, long time, String msgBody) { //獲取短信管理器 SmsManager SM = SmsManager.getDefault(); //通過反射獲取短信管理類 Class SMClass = SmsManager.class; //通過反射查到了SmsManager有個(gè)叫做mSubId的屬性 // 創(chuàng)建發(fā)送短信意圖 Intent sentIntent = new Intent(SENT_SMS_ACTION); Field field = null; try { field = SMClass.getDeclaredField("mSubId"); field.setAccessible(true); try { //獲取發(fā)送短信的卡 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); //自動(dòng)發(fā)送短信 SM.sendTextMessage(number, null, msg, sentPI, null); Log.e("TAG", "onCreate: sendTextMessage"); } catch (IllegalAccessException e) { e.printStackTrace(); } } catch (NoSuchFieldException e) { e.printStackTrace(); } }
2.定義自動(dòng)發(fā)送短信的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)短信監(jiān)聽的廣播注冊
<receiver android:name=".SmsBroadcastReceiver"> <intent-filter android:priority="999"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
priority:設(shè)置優(yōu)先級的屬性,999為最高優(yōu)先級
(2)發(fā)送短信的服務(wù)注冊
<service android:name=".SmsService" />
4.Activity中設(shè)置關(guān)鍵字及回復(fù)內(nèi)容
(1)雙卡模式選擇發(fā)送卡
使用RadioGroup實(shí)現(xiàn)雙卡模式的選擇,并用SharePreference保存選中的短信發(fā)送卡
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)設(shè)置短信關(guān)鍵字及回復(fù)內(nèi)容
//保存關(guān)鍵字及回復(fù)內(nèi)容 mEtSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //關(guān)鍵字 String key = mEtKey.getText().toString().trim(); //回復(fù)的內(nèi)容 String content = mEtContent.getText().toString().trim(); //保存關(guān)鍵字及內(nèi)容的bean SmSBean bean = new SmSBean(key, content); //獲取之前已添加的關(guān)鍵字及內(nèi)容 init(); //添加新的關(guān)鍵字及內(nèi)容 mDataList.add(bean); //用sharePreference保存關(guān)鍵字及內(nèi)容對象集合 ShareUtil.getInstance(MainActivity.this).saveSMS(mDataList); //將關(guān)鍵字及內(nèi)容輸入框置空 mEtKey.setText(""); mEtContent.setText(""); } });
總結(jié)
以上所述是小編給大家介紹的Android中BroadcastReceiver實(shí)現(xiàn)短信關(guān)鍵字自動(dòng)回復(fù)功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Android四大組件之廣播BroadcastReceiver詳解
- Android 使用registerReceiver注冊BroadcastReceiver案例詳解
- Android BroadcastReceiver廣播簡單使用
- Android Broadcast 和 BroadcastReceiver的權(quán)限限制方式
- Android中BroadcastReceiver案例講解
- Android四大組件之BroadcastReceiver詳解
- Android使用BroadcastReceiver監(jiān)聽網(wǎng)絡(luò)連接狀態(tài)的改變
- Android BroadcastReceiver實(shí)現(xiàn)網(wǎng)絡(luò)狀態(tài)實(shí)時(shí)監(jiān)聽
- Android?廣播接收器BroadcastReceiver詳解
相關(guān)文章
Android中ProgressDialog的dismiss()與cancel()方法的區(qū)別
本文主要介紹了Android中ProgressDialog的dismiss()與cancel()方法的區(qū)別,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-04-04詳解Flutter中StatefulBuilder組件的使用
StatefulBuilder小部件可以在這些區(qū)域的狀態(tài)發(fā)生變化時(shí)僅重建某些小區(qū)域而無需付出太多努力。本文將來詳細(xì)講講它的使用,需要的可以參考一下2022-05-05Android獲取觸摸手勢實(shí)現(xiàn)左右滑動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android獲取觸摸手勢實(shí)現(xiàn)左右滑動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05DownloadManager實(shí)現(xiàn)文件下載功能
這篇文章主要為大家詳細(xì)介紹了DownloadManager實(shí)現(xiàn)文件下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Android 個(gè)人理財(cái)工具四:添加賬單頁面 下
本文主要介紹Android 個(gè)人理財(cái)工具添加賬單頁面,這里是添加賬單的詳情頁面及如何使用Android Spinner控件的簡單示例,有需要的小伙伴可以參考下2016-08-08Android監(jiān)聽系統(tǒng)來電并彈出提示窗口
本篇文章主要介紹了Android監(jiān)聽系統(tǒng)來電并彈出提示窗口,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10Android 自定義一套 Dialog通用提示框 (代碼庫)
這篇文章主要介紹了Android 自定義一套 Dialog通用提示框 (代碼庫),需要的朋友可以參考下2017-04-04Android中Java instanceof關(guān)鍵字全面解析
instanceof關(guān)鍵字用于判斷一個(gè)引用類型變量所指向的對象是否是一個(gè)類(或接口、抽象類、父類)的實(shí)例.這篇文章主要介紹了Android中Java instanceof關(guān)鍵字全面解析的相關(guān)資料,需要的朋友可以參考下2016-07-07