Android中BroadcastReceiver實(shí)現(xiàn)短信關(guān)鍵字自動(dòng)回復(fù)功能
前言:因公司業(yè)務(wù)需要,需要一臺(tái)手機(jī)專(zhuān)門(mén)回復(fù)客戶訂購(gòu)的套餐的短信,之前一直是人工手動(dòng)回復(fù),但比較麻煩且回復(fù)可能不及時(shí),于是項(xiàng)目經(jīng)理就讓實(shí)現(xiàn)根據(jù)短信的關(guān)鍵字自動(dòng)回復(fù)功能。
實(shí)現(xiàn)手機(jī)短信監(jiān)聽(tīng)的方式有兩種:一是通過(guò)ContentObserver觀察者實(shí)現(xiàn)監(jiān)聽(tīng),另一種就是通過(guò)廣播即BroadcastReceiver實(shí)現(xiàn)短信監(jiān)聽(tīng),文章中通過(guò)使用BroadcastReceiver實(shí)現(xiàn)有新短信的及時(shí)監(jiān)聽(tīng)及包含設(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,并重寫(xiě)OnReceive方法
mContext = context;
//獲取短信的bundle
Bundle bundle = intent.getExtras();
//短信對(duì)象
SmsMessage msg;
if (null != bundle) {
//獲取pdu編碼的短信數(shù)組(接受的短信都是以pdu編碼的16進(jìn)制數(shù)組)
Object[] smsObj = (Object[]) bundle.get("pdus");
for (Object object : smsObj) {
//將pdu編碼的短信解析為SmsMessage對(duì)象
msg = SmsMessage.createFromPdu((byte[]) object);
//獲取短信內(nèi)容
String msgBody = msg.getDisplayMessageBody();
//獲取發(fā)送短信的號(hào)碼
String number = msg.getOriginatingAddress();
//獲取短信時(shí)間戳
long time = msg.getTimestampMillis();
//獲取我們?cè)谥黜?yè)面設(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 上下文對(duì)象
* @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();
//通過(guò)反射獲取短信管理類(lèi)
Class SMClass = SmsManager.class; //通過(guò)反射查到了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.清單文件注冊(cè)
(1)短信監(jiān)聽(tīng)的廣播注冊(cè)
<receiver android:name=".SmsBroadcastReceiver"> <intent-filter android:priority="999"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
priority:設(shè)置優(yōu)先級(jí)的屬性,999為最高優(yōu)先級(jí)
(2)發(fā)送短信的服務(wù)注冊(cè)
<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)容對(duì)象集合
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ù)功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android四大組件之廣播BroadcastReceiver詳解
- Android 使用registerReceiver注冊(cè)BroadcastReceiver案例詳解
- Android BroadcastReceiver廣播簡(jiǎn)單使用
- Android Broadcast 和 BroadcastReceiver的權(quán)限限制方式
- Android中BroadcastReceiver案例講解
- Android四大組件之BroadcastReceiver詳解
- Android使用BroadcastReceiver監(jiān)聽(tīng)網(wǎng)絡(luò)連接狀態(tài)的改變
- Android BroadcastReceiver實(shí)現(xiàn)網(wǎng)絡(luò)狀態(tài)實(shí)時(shí)監(jiān)聽(tīng)
- Android?廣播接收器BroadcastReceiver詳解
相關(guān)文章
Android 利用 APT 技術(shù)在編譯期生成代碼
本文主要講解Android 利用 APT 技術(shù)在編譯期生成代碼,這里提供詳細(xì)的資料,并講解如何實(shí)現(xiàn),有興趣的小伙伴可以參考下2016-08-08
Android實(shí)現(xiàn)倒計(jì)時(shí)的方案梳理
這篇文章主要介紹了Android實(shí)現(xiàn)倒計(jì)時(shí)的方案梳理,下面文章圍繞主題展開(kāi)Android倒計(jì)時(shí)方案,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
Android編程實(shí)現(xiàn)左右滑動(dòng)切換背景的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)左右滑動(dòng)切換背景的方法,涉及Android圖形資源動(dòng)態(tài)調(diào)用與動(dòng)作監(jiān)聽(tīng)相關(guān)技巧,需要的朋友可以參考下2016-01-01
Android實(shí)現(xiàn)移動(dòng)小球和CircularReveal頁(yè)面切換動(dòng)畫(huà)實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于利用Android如何實(shí)現(xiàn)移動(dòng)的小球和CircularReveal頁(yè)面切換動(dòng)畫(huà)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-09-09
Android搭建grpc環(huán)境過(guò)程分步詳解
本篇文章使用的IDE是Android Studio。這里先吐槽一句,安卓項(xiàng)目搭建grpc環(huán)境,不管是引入插件還是引入第三方庫(kù),對(duì)于版本的要求都極為苛刻,一旦版本不匹配就會(huì)報(bào)錯(cuò),所以對(duì)于版本的搭配一定要注意2023-04-04
Android圖片上傳實(shí)現(xiàn)預(yù)覽效果
這篇文章主要介紹了Android圖片上傳實(shí)現(xiàn)預(yù)覽效果的相關(guān)資料,需要的朋友可以參考下2016-01-01

