上一篇
安卓代码实现短信拦截
- 行业动态
- 2025-04-24
- 4
在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
的类:
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 设置定时任务 |
注意事项
- 默认短信应用限制:Android 4.4+要求拦截应用必须设置为默认短信应用
- 权限隔离:第三方应用无法读取其他应用发送的短信(如银行APP)
- 系统版本兼容:Android 13+可能限制
abortBroadcast()
效果
测试验证
- 使用真实设备(模拟器不支持短信功能)
- 发送测试短信到目标设备
- 检查日志是否打印拦截信息
- 验证短信是否未进入系统收件箱
测试场景 | 预期结果 |
---|---|
发送黑名单号码短信 | 短信被拦截,不会显示在通知栏和系统收件箱 |
发送白名单号码短信 | 短信正常接收 |
关闭应用后测试 | 仍能拦截(需保持接收器注册状态) |
常见问题与解答
Q1:为什么设置了拦截却仍然收到短信?
A1:可能原因及解决方案:
- 未设置为默认短信应用 → 需在设置中设为默认
- 缺少必要权限 → 检查Manifest和动态权限申请
- Android版本限制 → 考虑使用Accessibility Service辅助实现
- 进程被杀死 → 添加
android:persistent="true"
属性
Q2:如何恢复被拦截的短信?
A2:两种恢复方法:
- 卸载拦截应用 → 系统自动清除相关配置
- 取消默认应用设置 → 进入设置>应用>选择应用>取消默认设置
特别提示:短信拦截涉及用户隐私,需在
AndroidManifest.xml
中添加隐私政策声明,并在Google Play等平台遵守相关政策要求