You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用如何仅接收指定号码的SMS消息?技术求助

如何让Android应用仅接收并展示指定号码的短信

没问题,咱们来调整代码实现只接收指定号码(比如你提到的07911127456)的短信,并且只展示这个号码的历史和新消息。需要修改两个核心逻辑:加载历史短信的查询部分,以及接收新短信的广播过滤部分,具体步骤如下:


1. 定义目标号码常量

首先在MainActivity中添加一个全局常量,用来存储你要筛选的目标号码,后续修改起来更方便:

// 放在MainActivity类的顶部,权限常量下方
private static final String TARGET_PHONE_NUMBER = "07911127456";

2. 修改历史短信加载逻辑(refreshSmsInbox方法)

原来的代码会查询收件箱中所有短信,我们需要给内容提供者的查询添加筛选条件,只获取目标号码的短信:

public void refreshSmsInbox() {
    ContentResolver contentResolver = getContentResolver();
    // 使用参数化查询筛选目标号码的短信,避免SQL注入风险
    Cursor smsInboxCursor = contentResolver.query(
            Uri.parse("content://sms/inbox"), 
            null, 
            "address = ?", // 筛选条件
            new String[]{TARGET_PHONE_NUMBER}, // 筛选参数
            null
    );
    
    int indexBody = smsInboxCursor.getColumnIndex("body");
    int indexAddress = smsInboxCursor.getColumnIndex("address");
    if (indexBody < 0 || !smsInboxCursor.moveToFirst()) return;
    
    arrayAdapter.clear();
    do {
        String str = "SMS From: " + smsInboxCursor.getString(indexAddress) + "\n" + smsInboxCursor.getString(indexBody) + "\n";
        arrayAdapter.add(str);
    } while (smsInboxCursor.moveToNext());
}

这里用address = ?作为筛选条件,搭配参数化的selectionArgs,是Android内容提供者查询的最佳实践,能避免SQL注入问题。

3. 修改新短信接收逻辑(SmsBroadcastReceiver的onReceive方法)

原来的广播接收器会处理所有收到的短信,我们需要在处理前判断号码是否匹配目标号码,只有符合条件的才更新到列表:

public void onReceive(Context context, Intent intent) {
    Bundle intentExtras = intent.getExtras();
    if (intentExtras != null) {
        Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
        String smsMessageStr = "";
        
        for (int i = 0; i < sms.length; ++i) {
            String format = intentExtras.getString("format");
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i], format);
            String smsBody = smsMessage.getMessageBody().toString();
            String address = smsMessage.getOriginatingAddress();
            
            // 清理号码格式:去掉空格、+号等非数字字符,兼容不同运营商的号码格式
            String cleanTarget = MainActivity.TARGET_PHONE_NUMBER.replaceAll("[^0-9]", "");
            String cleanAddress = address != null ? address.replaceAll("[^0-9]", "") : "";
            
            // 判断是否为目标号码:支持精确匹配,也兼容带国家码的结尾匹配
            if (cleanAddress.equals(cleanTarget) || cleanAddress.endsWith(cleanTarget)) {
                smsMessageStr += "SMS From: " + address + "\n";
                smsMessageStr += smsBody + "\n";
            }
        }
        
        // 只有当有符合条件的短信时,才更新收件箱列表
        if (!smsMessageStr.isEmpty()) {
            MainActivity inst = MainActivity.instance();
            inst.updateInbox(smsMessageStr);
        }
    }
}

这里的号码格式清理很重要,因为不同运营商返回的号码可能带+号、空格或其他前缀,清理后能提高匹配的准确性。如果需要支持多个目标号码,只需要把TARGET_PHONE_NUMBER改成字符串数组,然后在判断时遍历数组匹配即可。


内容的提问来源于stack exchange,提问作者Venda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:23:23