上一篇
安卓中添加短信拦截代码
- 行业动态
- 2025-04-23
- 8
在AndroidManifest中声明RECEIVE_SMS权限,创建继承BroadcastReceiver的类,重写onReceive方法调用abortBroadcast()即可拦截短信,需注意Android 3.1+系统限制
权限配置与前置条件
在安卓中实现短信拦截功能,需先处理权限和系统限制,以下是关键权限和配置说明:
权限类型 | 具体权限 | 作用说明 |
---|---|---|
危险权限(运行时) | RECEIVE_SMS | 允许应用接收短信 |
危险权限(运行时) | READ_SMS | 读取短信内容(拦截后需读取) |
危险权限(运行时) | SEND_SMS | 发送短信(可选,用于反馈或转发拦截信息) |
系统权限(高版本) | BIND_CARRIER_SERVICES | (Android 12+)绑定运营商服务,用于高级短信管理 |
注意:
- 从 Android 4.4 (API 19) 开始,
RECEIVE_SMS
权限被限制为仅默认短信应用可正常使用。 - 若需全局拦截短信,需将应用设为默认短信应用(用户需手动确认)。
核心代码实现
创建短信接收器
通过 BroadcastReceiver
监听短信到达事件,并在 onReceive
中拦截:
public class SmsInterceptReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 检查是否为短信广播 if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { Bundle bundle = intent.getExtras(); // 获取短信数据 if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); // 短信内容数组 SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); } String sender = messages[0].getOriginatingAddress(); // 发件人号码 String messageBody = messages[0].getMessageBody(); // 短信内容 // 拦截逻辑(示例:拦截特定号码或关键词) if (sender.contains("123456") || messageBody.contains("广告")) { abortBroadcast(); // 终止广播,拦截短信 Log.d("SmsIntercept", "拦截短信来自:" + sender); } } } } }
动态注册接收器(适配高版本安卓)
从 Android 9 (API 28) 开始,静态注册 BroadcastReceiver
可能失效,需动态注册:
public class SmsInterceptService extends Service { private SmsInterceptReceiver receiver; @Override public void onCreate() { super.onCreate(); receiver = new SmsInterceptReceiver(); IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(receiver, filter); // 动态注册 } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); // 注销接收器 } @Nullable @Override public IBinder onBind(Intent intent) { return null; // 无需绑定 } }
启动服务(在 Activity 中)
Intent serviceIntent = new Intent(this, SmsInterceptService.class); startService(serviceIntent); // 启动拦截服务
设置为默认短信应用(关键步骤)
由于系统限制,非默认短信应用无法完全拦截短信,需引导用户设置:
// 跳转到默认应用设置页面 Intent intent = new Intent(TelephonyManager.ACTION_CHANGE_DEFAULT_SMS_APPLICATION); intent.putExtra(TelephonyManager.EXTRA_SMS_APP_NAME, "我的应用"); // 应用名称 startActivity(intent);
测试与调试
- 真机调试:模拟器可能无法接收短信,需使用真实设备。
- 手动发送测试短信:通过其他设备向测试手机发送短信。
- 日志验证:查看
Logcat
输出,确认abortBroadcast()
是否触发。 - 兼容性处理:针对不同安卓版本调整权限和注册方式。
常见问题与解答
问题1:为什么 RECEIVE_SMS
权限无效?
解答:
- 从 Android 4.4 开始,
RECEIVE_SMS
权限仅对默认短信应用生效,需将应用设为默认短信应用。 - 检查是否动态注册了
BroadcastReceiver
(高版本安卓必需)。 - 确保在
AndroidManifest.xml
中正确声明权限:<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" />
问题2:如何避免拦截重要短信(如验证码)?
解答:
- 在拦截逻辑中增加白名单机制,
// 定义白名单号码(如银行、验证码平台) List<String> whitelist = Arrays.asList("955XX", "106XXX"); if (whitelist.contains(sender)) { return; // 不拦截白名单号码 }
- 提供用户配置界面,允许手动添加/删除白名单