溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在Android中利用BroadcastReceiver實(shí)現(xiàn)短信關(guān)鍵字自動(dòng)回復(fù)功能

發(fā)布時(shí)間:2021-06-08 16:38:25 來源:億速云 閱讀:172 作者:Leah 欄目:移動(dòng)開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)怎么在Android中利用BroadcastReceiver實(shí)現(xiàn)短信關(guān)鍵字自動(dòng)回復(fù)功能,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

1.自定義SmsBroadcastReceiver

(1)自定義SmsBroadcastReceiver繼承自BroadcastReceiver,并重寫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è)谥黜撁嬖O(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();
 //通過反射獲取短信管理類
 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.清單文件注冊(cè)

(1)短信監(jiān)聽的廣播注冊(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("");
 }
});

關(guān)于怎么在Android中利用BroadcastReceiver實(shí)現(xiàn)短信關(guān)鍵字自動(dòng)回復(fù)功能就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI