Android 监听短信(同时监听广播和数据库)
暗扣方式之一:短信订购,即监听--------拦截------------处理短信。
暗扣方式之二:模拟人为操作(又叫模拟流量),通过后台程序代码模拟人的点击行为,暗自给用户订购业务,由运营商收取你的费用,当然这其中也需要涉及监听/拦截/处理短信。使用这种方式的原理无非是Http处理网页,还涉及接入点切换问题,这里就不详细讲解。
暗扣,强烈谴责这种侵害用户利益的行为。。。
回归正题:有的时候,我们的手机程序需要监听手机短信,当满足条件A时,不处理;当满足条件B时,将其设置为已读;当满足条件C时,将短信删除。
注:Android 4.3以及以后可能由用户来控制程序的权限,如果用户关闭这个程序的权限,意味着你无法监听短信/操作短信内容
目前也有如小米系统在安装时,让用户来控制权限;360来监听优先拦截短信等等(关于谁先安装谁有优先权,动态注册比静态注册优先级别高等问题,在这些情况这里就不讲了)。。。
一,拦截广播
1 import android.content.BroadcastReceiver; 2 import android.content.Context; 3 import android.content.Intent; 4 import android.os.Bundle; 5 import android.telephony.SmsMessage; 6 7 /** 8 * 短信广播 9 * @author Admin 10 * 11 */ 12 public class SmsReceiver extends BroadcastReceiver { 13 14 public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED"; 15 16 @Override 17 public void onReceive(Context context, Intent intent) 18 { 19 if (intent.getAction().equals(SMS_RECEIVED_ACTION)) 20 { 21 Bundle bundle = intent.getExtras(); 22 if (bundle != null) 23 { 24 Object[] objArray = (Object[]) bundle.get("pdus"); 25 SmsMessage[] messages = new SmsMessage[objArray.length]; 26 for (int i = 0; i < objArray.length; i++) 27 { 28 messages[i] = SmsMessage.createFromPdu((byte[]) objArray[i]); 29 } 30 31 String phoneNum="";//电话号码 32 StringBuilder sb = new StringBuilder();//短信内容 33 34 for (SmsMessage currentMessage : messages) 35 { 36 phoneNum=currentMessage.getDisplayOriginatingAddress(); 37 sb.append(currentMessage.getDisplayMessageBody()); 38 } 39 40 //根据你策略的手机端口号/拦截关键字判断进行是否中断广播(this.abortBroadcast();), 41 //TODO 42 } 43 } 44 } 45 }
二、开启一个服务开监听数据库
1 import android.app.Service; 2 import android.content.ContentResolver; 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.os.IBinder; 6 import android.os.Process; 7 8 /** 9 * @author Administrator 10 * 11 */ 12 public class SmsService extends Service { 13 14 private SmsObserver mObserver; 15 16 @Override 17 public IBinder onBind(Intent intent) { 18 return null; 19 } 20 21 @Override 22 public void onCreate() { 23 //在这里启动 24 ContentResolver resolver = getContentResolver(); 25 mObserver = new SmsObserver(resolver, new SmsHandler(this)); 26 resolver.registerContentObserver(Uri.parse("content://sms"), true, mObserver); 27 } 28 29 @Override 30 public void onDestroy() { 31 super.onDestroy(); 32 this.getContentResolver().unregisterContentObserver(mObserver); 33 Process.killProcess(Process.myPid()); 34 } 35 }
三、数据库观察者:
1 import android.content.ContentResolver; 2 import android.database.ContentObserver; 3 import android.database.Cursor; 4 import android.net.Uri; 5 import android.os.Message; 6 7 8 /** 9 * @author Administrator 10 * 11 */ 12 public class SmsObserver extends ContentObserver{ 13 14 private ContentResolver mResolver; 15 public SmsHandler smsHandler; 16 17 public SmsObserver(ContentResolver mResolver,SmsHandler handler) { 18 super(handler); 19 this.mResolver=mResolver; 20 this.smsHandler=handler; 21 } 22 23 @Override 24 public void onChange(boolean selfChange) { 25 Cursor mCursor=mResolver.query(Uri.parse("content://sms/inbox"), new String[] { "_id", "address", "read", "body", "thread_id" }, "read=?", new String[] { "0" }, "date desc"); 26 27 if(mCursor==null) 28 { 29 return; 30 } 31 else 32 { 33 while (mCursor.moveToNext()) 34 { 35 SmsInfo _smsInfo=new SmsInfo(); 36 37 int _inIndex=mCursor.getColumnIndex("_id"); 38 if(_inIndex!=-1) 39 { 40 _smsInfo._id=mCursor.getString(_inIndex); 41 } 42 43 int thread_idIndex=mCursor.getColumnIndex("thread_id"); 44 if(thread_idIndex!=-1) 45 { 46 _smsInfo.thread_id=mCursor.getString(thread_idIndex); 47 } 48 49 int addressIndex=mCursor.getColumnIndex("address"); 50 if(addressIndex!=-1) 51 { 52 _smsInfo.smsAddress=mCursor.getString(addressIndex); 53 } 54 55 int bodyIndex=mCursor.getColumnIndex("body"); 56 if(bodyIndex!=-1) 57 { 58 _smsInfo.smsBody=mCursor.getString(bodyIndex); 59 } 60 61 int readIndex=mCursor.getColumnIndex("read"); 62 if(readIndex!=-1) 63 { 64 _smsInfo.read=mCursor.getString(readIndex); 65 } 66 67 //根据你的拦截策略,判断是否不对短信进行操作;将短信设置为已读;将短信删除 68 //TODO 69 Message msg=smsHandler.obtainMessage(); 70 _smsInfo.action=2;//0不对短信进行操作;1将短信设置为已读;2将短信删除 71 msg.obj=_smsInfo; 72 smsHandler.sendMessage(msg); 73 } 74 } 75 76 if(mCursor!=null) 77 { 78 mCursor.close(); 79 mCursor=null; 80 } 81 } 82 }
四、短信处理类
1 import android.content.ContentValues; 2 import android.content.Context; 3 import android.net.Uri; 4 import android.os.Handler; 5 import android.os.Message; 6 7 /** 8 * @author 短信的处理 9 * 10 */ 11 public class SmsHandler extends Handler 12 { 13 private Context mcontext; 14 15 public SmsHandler(Context context) 16 { 17 this.mcontext=context; 18 } 19 20 @Override 21 public void handleMessage(Message msg) 22 { 23 SmsInfo smsInfo=(SmsInfo)msg.obj; 24 25 if(smsInfo.action==1) 26 { 27 ContentValues values = new ContentValues(); 28 values.put("read", "1"); 29 mcontext.getContentResolver().update(Uri.parse("content://sms/inbox"), values, "thread_id=?", new String[]{smsInfo.thread_id}); 30 } 31 else if(smsInfo.action==2) 32 { 33 Uri mUri=Uri.parse("content://sms/"); 34 mcontext.getContentResolver().delete(mUri, "_id=?", new String[]{smsInfo._id}); 35 } 36 } 37 }
五、SmsInfo 数据结构
1 /** 2 * 主要用于短信拦截 3 * @author Administrator 4 * 5 */ 6 public class SmsInfo { 7 public String _id=""; 8 public String thread_id = ""; 9 public String smsAddress = ""; 10 public String smsBody = ""; 11 public String read=""; 12 public int action=0;//1代表设置为已读,2表示删除短信 13 }
短信拦截大概就是如此了。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。