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
相关产品推荐
相关产品推荐

