Android短信关键字拦截

举报
皮牙子抓饭 发表于 2024/06/09 23:50:10 2024/06/09
【摘要】 Android短信关键字拦截引言在Android应用开发中,有时我们需要实现短信关键字拦截的功能,以过滤非法或垃圾短信。本篇文章将介绍如何在Android应用中实现短信关键字拦截功能。实现步骤1. 添加权限首先,在应用的AndroidManifest.xml文件中添加短信收发的权限:xmlCopy code<uses-permission android:name="android.perm...

Android短信关键字拦截


引言

在Android应用开发中,有时我们需要实现短信关键字拦截的功能,以过滤非法或垃圾短信。本篇文章将介绍如何在Android应用中实现短信关键字拦截功能。

实现步骤

1. 添加权限

首先,在应用的AndroidManifest.xml文件中添加短信收发的权限:

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

2. 创建短信广播接收器

接下来,我们需要创建一个短信广播接收器,用于接收系统发来的短信。

javaCopy code
public class SmsReceiver extends BroadcastReceiver {
    private static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
    
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {
            // 处理收到的短信
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus != null && pdus.length > 0) {
                    SmsMessage[] messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < pdus.length; i++) {
                        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                        String messageBody = messages[i].getMessageBody();  // 获取短信内容
                        // 判断短信内容是否包含关键字
                        if (messageBody.contains("关键字")) {
                            // 拦截短信,取消广播
                            abortBroadcast();
                            // 进行相应的处理
                            // ...
                        }
                    }
                }
            }
        }
    }
}

3. 注册短信广播接收器

AndroidManifest.xml文件中,注册短信广播接收器:

xmlCopy code
<receiver android:name=".SmsReceiver">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

4. 申请短信拦截权限

由于Android 4.4及以上版本的应用默认无法拦截短信,我们需要在代码中动态申请短信拦截权限。

javaCopy code
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    SmsManager smsManager = SmsManager.getDefault();
    Intent intent = new Intent("android.provider.Telephony.SMS_RECEIVED");
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    smsManager.getDefault().sendTextMessage(phoneNumber, null, message, pendingIntent, null);
} else {
    SmsManager smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage(phoneNumber, null, message, null, null);
}

5. 注销短信广播接收器

当不再需要接收短信时,应该在适当的时机取消注册短信广播接收器,以释放资源。

javaCopy code
@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(smsReceiver);
}




javaCopy code
public class SmsReceiver extends BroadcastReceiver {
    private static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus != null && pdus.length > 0) {
                    SmsMessage[] messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < pdus.length; i++) {
                        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                        String messageBody = messages[i].getMessageBody();
                        // 实际应用场景:如果短信内容包含"优惠"关键字,则拦截该短信
                        if (messageBody.contains("优惠")) {
                            // 拦截短信,取消广播
                            abortBroadcast();
                            // 实际应用场景:弹出提示框告知用户该短信已拦截,并提供相应的操作
                            Toast.makeText(context, "收到一条优惠短信,已拦截", Toast.LENGTH_SHORT).show();
                            // 其他处理逻辑
                            // ...
                        }
                    }
                }
            }
        }
    }
}

在这个示例代码中,我们假设用户希望拦截包含"优惠"关键字的短信,并在拦截时弹出提示框告知用户短信已被拦截。用户可以根据实际需求修改关键字和处理逻辑。


BroadcastReceiver是Android应用程序组件之一,用于接收系统或其他应用发送的广播消息。广播消息可以是系统级的,例如设备启动完成、电池电量变化等,也可以是应用级的,例如网络状态变化、短信到达等。通过注册BroadcastReceiver,我们可以在应用中接收和处理这些广播消息。 BroadcastReceiver需要继承android.content.BroadcastReceiver类,并重写onReceive()方法来处理接收到的广播消息。当广播消息到达时,系统会自动调用onReceive()方法,并将广播消息作为参数传递给该方法。 下面是一个简单的BroadcastReceiver示例:

javaCopy code
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 在这里处理接收到的广播消息
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            // 系统启动完成的广播消息
            // 执行相应的操作
        } else if (intent.getAction().equals("com.example.MY_CUSTOM_ACTION")) {
            // 自定义的广播消息
            // 执行相应的操作
        }
    }
}

在上述示例中,MyReceiver继承自BroadcastReceiver类,并重写了onReceive()方法。在onReceive()方法中,我们可以根据收到的广播消息的Intent对象来判断广播消息的类型,并执行相应的操作。 要接收广播消息,我们需要在AndroidManifest.xml文件中声明BroadcastReceiver。例如,要接收系统启动完成的广播消息,我们可以在AndroidManifest.xml文件中添加以下声明:

xmlCopy code
<receiver android:name=".MyReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

这样,当系统启动完成时,系统会发送android.intent.action.BOOT_COMPLETED的广播消息,MyReceiver将收到该广播消息并执行相应的操作。 除了在AndroidManifest.xml文件中声明BroadcastReceiver,我们还可以在代码中动态注册BroadcastReceiver。例如:

javaCopy code
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(receiver, filter);

上述代码中,我们创建了一个MyReceiver对象,并定义了一个IntentFilter来指定我们希望接收的广播消息类型,然后通过registerReceiver()方法来注册BroadcastReceiver

总结

通过以上步骤,我们可以在Android应用中实现短信关键字拦截的功能。在实际开发中,还可以根据需求进一步完善拦截逻辑,如将拦截的短信保存到本地或上传到服务器进行分析等。请注意,使用短信关键字拦截功能时,需要遵守相关法律法规,避免非法使用。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。