按關(guān)鍵詞轉(zhuǎn)發(fā)短信至指定手機(jī)號(hào)
源碼簡(jiǎn)介
很多時(shí)候我們需要對(duì)短信進(jìn)行篩選,將指定短信轉(zhuǎn)發(fā)到特定手機(jī)號(hào),以防止遺漏重要內(nèi)容,本程序就是實(shí)現(xiàn)這個(gè)功能。可以設(shè)置全部轉(zhuǎn)發(fā),也可設(shè)置只轉(zhuǎn)發(fā)設(shè)置關(guān)鍵詞內(nèi)容的轉(zhuǎn)發(fā)??稍O(shè)置多個(gè)關(guān)鍵詞,關(guān)鍵詞以空格或者逗號(hào)分隔。
轉(zhuǎn)發(fā)全部短信時(shí),將忽略關(guān)鍵詞設(shè)置。打開關(guān)鍵詞模式時(shí),忽略全部轉(zhuǎn)發(fā)的開關(guān)。開發(fā)這個(gè)的原因在于,網(wǎng)上現(xiàn)在有些類似功能的,但多數(shù)是轉(zhuǎn)發(fā)到email,一般不提供轉(zhuǎn)發(fā)短信功能,而有的轉(zhuǎn)發(fā)短信的是付費(fèi)服務(wù),同時(shí)所有短信會(huì)被發(fā)送到他們的服務(wù)器,造成信息安全、隱私泄露隱患。
包名、文件名方面需注意,不要寫sms forward字眼,否則會(huì)被防火墻阻擋。
源碼運(yùn)行截圖
源碼片段:
- public class SmsReceiver extends BroadcastReceiver {
- static final Object mStartingServiceSync = new Object();
- static PowerManager.WakeLock mStartingService=null;
- private static SmsReceiver sInstance=null;
- private static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
- private StringBuilder msgbody=new StringBuilder();
- static int recnum=1;
- static int fwdnum=1;
- public static SmsReceiver getInstance() {
- if (sInstance == null) {
- sInstance = new SmsReceiver();
- }
- return sInstance;
- }
- @Override
- public void onReceive(final Context context, Intent intent) {
- final Context mContext=context;
- final SharedPreferences settings = context.getSharedPreferences(SmsFilterConfig.APP_SET_NAME, Context.MODE_PRIVATE);
- boolean isActive = settings.getBoolean(SmsFilterConfig.KEY_IS_ENABLED, false);
- final boolean isRemoteEnabled = settings.getBoolean(SmsFilterConfig.KEY_FILTER_ENABLED, false);
- final String telNumber = settings.getString(SmsFilterConfig.KEY_SMS_NO, "");
- String smskeyword = settings.getString(SmsFilterConfig.SMSKEYWORD, "");
- SensitivewordFilter filter = new SensitivewordFilter(smskeyword);
- //beginStartingService(context, intent);
- if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
- recnum++;
- }
- if ((isActive||isRemoteEnabled)&&intent.getAction().equals(SMS_RECEIVED_ACTION)) {
- Bundle bundle = intent.getExtras(); // ---get the SMS message passed in---
- String msg_from = "", message = "";
- if (bundle != null) {
- try {
- Object[] pdus = (Object[])intent.getExtras().get("pdus");
- SmsMessage[] messages = new SmsMessage[pdus.length];
- for (int i = 0; i < pdus.length; i++){
- messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
- }
- msgbody.delete(0, msgbody.length());
- for (SmsMessage mes : messages){
- msgbody.append(mes.getMessageBody());
- msg_from = mes.getOriginatingAddress();
- }
- message=msgbody.toString().replaceAll("\\s", "");
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- if (isRemoteEnabled ) {
- boolean a= filter.isContaintSensitiveWord (message, 1);Log.d("", "4");
- //Set<string> set = filter.getSensitiveWord("aaefggh", 1);Log.d("", "4");
- if (a){
- isActive = true;
- }
- }
- if (isActive && telNumber != null && telNumber.length() > 0) {
- SmsManager smsManager = SmsManager.getDefault();
- smsManager.sendTextMessage(telNumber, null,
- message+ " -From- " +msg_from, null, null);
- fwdnum++;
- }
- }
- String title=context.getString(R.string.app_name);
- String sAgeFormat = context.getString(R.string.notifyinfo);
- String body=String.format(sAgeFormat, recnum, fwdnum);
- MessageUtils.updateNotifications(mContext, title, body);
- //finishBlockSms();
- /*SharedPreferences.Editor editor = settings.edit();
- editor.putInt(SmsFilterConfig.KEY_REC_NUM, recnum);
- editor.commit();*/
- //MessageUtils.writeIntPref(mContext,SmsFilterConfig.KEY_REC_NUM, recnum);
- // MessageUtils.writeIntPref(mContext,SmsFilterConfig.KEY_FWD_NUM, fwdnum);
- }
- @SuppressWarnings("deprecation")
- public static void updateNotifications(Context mContext,String title,String body){
- NotificationManager nm;
- Intent mIntent;
- PendingIntent pd;
- Notification baseNF;
- nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
- mIntent=new Intent("com.dx.util.SmsFilterConfig");
- mIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
- pd = PendingIntent.getActivity(mContext, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT); //如果轉(zhuǎn)移內(nèi)容則用m_Intent();
- baseNF = new Notification();
- baseNF.icon = R.drawable.icon;
- baseNF.tickerText = title;
- baseNF.flags |= Notification.FLAG_NO_CLEAR;
- //設(shè)置通知顯示的參數(shù)
- baseNF.setLatestEventInfo(mContext, title, body, pd);
- nm.notify(R.string.app_name, baseNF);
- }
- }</string>
源碼鏈接:http://down.51cto.com/data/1985029