当前位置:首页 > 行业动态 > 正文

安卓代码实现短信拦截

在Android中通过继承SmsReceiver类并重写onReceive方法,调用abortBroadcast()可拦截短信,需申请SEND_SMS和RECEIVE_SMS权限,但受系统版本限制,部分功能需设为默认短信应用

权限配置

AndroidManifest.xml中声明必要权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

动态权限申请

在Android 6.0+系统中需要动态申请敏感权限:

// 在Activity中检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, REQUEST_CODE);
}

短信接收器实现

创建继承BroadcastReceiver的类:

安卓代码实现短信拦截  第1张

public class SmsInterceptor extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 获取短信内容
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] objs = (Object[]) bundle.get("pdus");
            for (Object obj : objs) {
                SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);
                String originatingAddress = sms.getOriginatingAddress();
                String messageBody = sms.getMessageBody();
                // 拦截逻辑(示例:拦截指定号码)
                if ("123456789".equals(originatingAddress)) {
                    abortBroadcast(); // 阻止短信传递
                    Log.d("SmsIntercept", "拦截短信:" + messageBody);
                }
            }
        }
    }
}

注册广播接收器

方法1:静态注册(推荐)

AndroidManifest.xml中添加:

<receiver android:name=".SmsInterceptor" android:exported="true">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

方法2:动态注册

Activity中注册:

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(new SmsInterceptor(), filter);

拦截逻辑实现

拦截条件 实现方式
按号码拦截 originatingAddress.equals("目标号码")
按关键词拦截 messageBody.contains("关键词")
按正则表达式匹配 Pattern.compile("正则表达式").matcher(messageBody).find()
夜间免打扰模式 结合AlarmManager设置定时任务

注意事项

  1. 默认短信应用限制:Android 4.4+要求拦截应用必须设置为默认短信应用
  2. 权限隔离:第三方应用无法读取其他应用发送的短信(如银行APP)
  3. 系统版本兼容:Android 13+可能限制abortBroadcast()效果

测试验证

  1. 使用真实设备(模拟器不支持短信功能)
  2. 发送测试短信到目标设备
  3. 检查日志是否打印拦截信息
  4. 验证短信是否未进入系统收件箱
测试场景 预期结果
发送黑名单号码短信 短信被拦截,不会显示在通知栏和系统收件箱
发送白名单号码短信 短信正常接收
关闭应用后测试 仍能拦截(需保持接收器注册状态)

常见问题与解答

Q1:为什么设置了拦截却仍然收到短信?
A1:可能原因及解决方案:

  • 未设置为默认短信应用 → 需在设置中设为默认
  • 缺少必要权限 → 检查Manifest和动态权限申请
  • Android版本限制 → 考虑使用Accessibility Service辅助实现
  • 进程被杀死 → 添加android:persistent="true"属性

Q2:如何恢复被拦截的短信?
A2:两种恢复方法:

  1. 卸载拦截应用 → 系统自动清除相关配置
  2. 取消默认应用设置 → 进入设置>应用>选择应用>取消默认设置

特别提示:短信拦截涉及用户隐私,需在AndroidManifest.xml中添加隐私政策声明,并在Google Play等平台遵守相关政策要求

0