Android 에서 BroadcastReceiver 는 문자 키워드 자동 답장 기능 을 실현 합 니 다.

앞에서 말 했 듯 이 회사 의 업무 수요 로 인해 핸드폰 으로 고객 이 주문 한 세트 에 대한 문 자 를 전문 적 으로 답장 해 야 한다.예전 에는 인공 적 으로 수 동 으로 답장 을 했 지만 귀 찮 고 답장 이 제때에 오지 않 을 수 있 기 때문에 프로젝트 매니저 는 문자 의 키워드 에 따라 자동 으로 답장 기능 을 실현 하도록 했다.
휴대 전화 문자 감청 을 실현 하 는 방식 은 두 가지 가 있다.하 나 는 ContentObserver 관찰 자 를 통 해 감청 을 실현 하 는 것 이 고,다른 하 나 는 방송 즉 BroadcastReceiver 를 통 해 문자 감청 을 실현 하 는 것 이다.글 에서 BroadcastReceiver 를 사용 하여 새로운 문자 의 신속 한 감청 과 설 정 된 키 워드 를 포함 할 때 자동 으로 답장 을 한다.
효과 그림:

목록 파일 추가 권한:

<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 에서 계승 하고 OnReceiver 방법 을 다시 씁 니 다.

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

/**
 *        
 * @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

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)문자 감청 방송 등록

<receiver android:name=".SmsBroadcastReceiver">
 <intent-filter android:priority="999">
  <action android:name="android.provider.Telephony.SMS_RECEIVED" />
 </intent-filter>
</receiver>
priority:우선 순위 속성 설정,999 최고 우선 순위
(2)문자 발송 서비스 등록

<service android:name=".SmsService" />
4.Activity 에서 키워드 및 답장 내용 설정
(1)더 블 카드 모드 에서 발송 카드 선택
RadioGroup 을 사용 하여 더 블 카드 모드 를 선택 하고 선택 한 문자 발송 카드 를 SharePreference 로 저장 합 니 다.

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)문자 키워드 및 답장 내용 설정

//          
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("");
 }
});
총결산
위 에서 말 한 것 은 편집장 이 소개 한 안 드 로 이 드 에서 BroadcastReceiver 가 문자 키워드 자동 답장 기능 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기