Android 拦截短信

来源:互联网 发布:桌面日历记事软件 编辑:程序博客网 时间:2024/05/04 22:43

前言

Android系统可以方便的获取你的短信内容。这样当接收到短信时,你可以截获短信内容,然后根据内容来进行下一步操作。前提是你的app有获取短信内容的权限。

创建Receiver类

当短信来临时,Android系统会发出系统广播。你可以创建你的Receiver类来接收这一广播。

  • 继承BroadcastReceiver;覆写onReceive方法;
public class SMSReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {    }}
  • 定义标志位SMS_RECEIVED_ACTION ,用来判断是否是来自短信的广播;
public class SMSReceiver extends BroadcastReceiver {    public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";    @Override    public void onReceive(Context context, Intent intent) {        // 先判断广播消息        String action = intent.getAction();        if (SMS_RECEIVED_ACTION.equals(action)) {        }    }}

获取短信内容

  • 根据解析“pdus”的内容来获取短信内容(pdus是什么有待考证);API 23以后有不同的获取方式,多了参数format,用来区分“3gpp”和“3gpp2”模式;
public class SMSReceiver extends BroadcastReceiver {    public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";    @Override    public void onReceive(Context context, Intent intent) {        // 先判断广播消息        String action = intent.getAction();        if (SMS_RECEIVED_ACTION.equals(action)) {            Bundle bundle = intent.getExtras();            if (bundle != null) {                // 取pdus内容,转换为Object[]                Object[] pdus = (Object[]) bundle.get("pdus");                String format = bundle.getString("format");                SmsMessage[] messages = new SmsMessage[pdus.length];                // 解析短信                for (int i = 0; i < messages.length; i++) {                    byte[] pdu = (byte[]) pdus[i];                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API level 23 以后                        messages[i] = SmsMessage.createFromPdu(pdu, format);                    } else {                        messages[i] = SmsMessage.createFromPdu(pdu);                    }                }                // 解析完内容后分析具体参数                for (SmsMessage msg : messages) {                    // 获取短信内容                    String sms = msg.getMessageBody();                    // 获取短信号码                    String number = msg.getOriginatingAddress();                }            }        }    }}

修改AndroidManifest.xml

  • 需要添加获取短信的权限;
<uses-permission android:name="android.permission.READ_SMS" /><uses-permission android:name="android.permission.RECEIVE_SMS" />
  • 注册你的receiver;priority为优先级,设置为1000 ,这样系统将优先处理你的receiver;
<receiver android:name=".receiver.SMSReceiver">            <intent-filter android:priority="1000">                <action android:name="android.provider.Telephony.SMS_RECEIVED" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </receiver>

总结

  • 拦截短息需要用到Android 组件 Broadcast Receiver;
  • 需要从pdus解析短息内容;
  • 需要在AndroidManifest.xml中注册receiver,并写上相应的权限;
0 0
原创粉丝点击