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

安卓中添加短信拦截代码

在AndroidManifest中声明RECEIVE_SMS权限,创建继承BroadcastReceiver的类,重写onReceive方法调用abortBroadcast()即可拦截短信,需注意Android 3.1+系统限制

权限配置与前置条件

在安卓中实现短信拦截功能,需先处理权限和系统限制,以下是关键权限和配置说明:

权限类型 具体权限 作用说明
危险权限(运行时) RECEIVE_SMS 允许应用接收短信
危险权限(运行时) READ_SMS 读取短信内容(拦截后需读取)
危险权限(运行时) SEND_SMS 发送短信(可选,用于反馈或转发拦截信息)
系统权限(高版本) BIND_CARRIER_SERVICES (Android 12+)绑定运营商服务,用于高级短信管理

注意

安卓中添加短信拦截代码  第1张

  • 从 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);

测试与调试

  1. 真机调试:模拟器可能无法接收短信,需使用真实设备。
  2. 手动发送测试短信:通过其他设备向测试手机发送短信。
  3. 日志验证:查看 Logcat 输出,确认 abortBroadcast() 是否触发。
  4. 兼容性处理:针对不同安卓版本调整权限和注册方式。

常见问题与解答

问题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; // 不拦截白名单号码
    }
  • 提供用户配置界面,允许手动添加/删除白名单
0