android - 来自同一号码的群组短信

标签 android

我正在尝试构建我自己的短信应用程序(仅用于学习目的)它是如何工作的。现在,当我收到一条短信时,我会这样保存它:

SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String message = currentMessage.getDisplayMessageBody();
long time_rcv = currentMessage.getTimestampMillis();

ContentValues smsValues = new ContentValues();
smsValues.put("address", phoneNumber);
smsValues.put("body", message);
smsValues.put("date_sent", time_rcv);
context.getContentResolver().insert(BlacklistConstants.smsInboxUri,smsValues);

这工作正常,除非我想显示消息:

相同编号的分开显示。

当我像这样检索短信时:

Uri uri = Uri.parse(String.valueOf(BlacklistConstants.smsConversations));
Cursor c = getActivity().getContentResolver().query(uri, null, null, null, null);

我得到的输出是:

msg count: 1
thread_id: 0
Snippet: 2

msg count: 1
thread_id: 0
Snippet: 2

msg count: 1
thread_id: 0
Snippet: 2

msg count: 1
thread_id: 0
Snippet: 2

像这样的消息:

从 100 从 11 从 12 从 12

所以实际上我应该得到一个包含 2 条消息的消息。

谁能告诉我如何解决这个问题?

编辑:

这就是我获取短信的方式。 displayConversations 仅供查看:

 // Fills the List with Smss
    private void fillSmsList() {
    smsList = new ArrayList<SMSData>();

    Uri uri = Uri.parse(String.valueOf(BlacklistConstants.smsInboxUri));
    Cursor c = getActivity().getContentResolver().query(uri, null, null, null, null);

    if (c.moveToFirst()) {
        for (int i = 0; i < c.getCount(); i++) {
            SMSData sms = new SMSData();
            sms.setBody(c.getString(c.getColumnIndexOrThrow("body")).toString());
            sms.setNumber(c.getString(c.getColumnIndexOrThrow("address")).toString());
            sms.setId(c.getString(c.getColumnIndexOrThrow("_id")).toString());
            sms.setTimeStampReceived(c.getString(c.getColumnIndexOrThrow("date_sent")).toString());
            smsList.add(sms);
            c.moveToNext();
        }
    }
    c.close();
}

private void displaySmsConversations() {
    Log.d(TAG,"DisplaySmsConverstations");
    Uri uri = Uri.parse(String.valueOf(BlacklistConstants.smsConversations));
    Cursor c = getActivity().getContentResolver().query(uri, null, null, null, null);

    if (c.moveToFirst()) {
        for (int i = 0; i < c.getCount(); i++) {
            Log.d(TAG,"msg count: " + c.getColumnIndexOrThrow("msg_count"));
            Log.d(TAG,"thread_id: " + c.getColumnIndexOrThrow("thread_id"));
            Log.d(TAG,"Snippet: " + c.getColumnIndexOrThrow("snippet"));
            c.moveToNext();
        }
    }
    c.close();
}

最佳答案

您应该在 BroadcastReceiver#onReceive 方法中连接来自多部分消息的消息,如下所示:

Object[] pdus = (Object[]) bundle.get("pdus");
final SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}

if (messages.length < 0) {
    return;
}

SmsMessage sms = messages[0];
String body = "";
String sender = sms.getOriginatingAddress().toString();

try {
    if (messages.length == 1 || sms.isReplace()) {
        body = sms.getDisplayMessageBody();
    } else {
        StringBuilder bodyText = new StringBuilder();
        for (int i = 0; i < messages.length; i++) {
            bodyText.append(messages[i].getMessageBody());
        }
        body = bodyText.toString();
    }
} catch (Exception e) {

}

ContentValues smsValues = new ContentValues();
smsValues.put("address", sender);
smsValues.put("body", body);
smsValues.put("date_sent", time_rcv);
context.getContentResolver().insert(BlacklistConstants.smsInboxUri,smsValues);

关于android - 来自同一号码的群组短信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23515533/

相关文章:

android - 如何在 Android studio 1.4 中将项目从 sdk 23 降级到 sdk 22

java - 将捕获的图像转换为位图

java - Android Chat For 私有(private) session (开发工作流程)

java - onConfigurationChanged 不会避免方向更改时 Activity 重新启动

Android - 无法打开 [SQL] 数据库错误

Android: 'Can' t 播放此视频'; MediaPlayer 和 VideoView 错误 1 ​​-38

android - 在 Android 5.0 上连续扫描 BLE 广告是否可以接受?

android - 在 Eclipse : Why? 中导入 android.R

充当信标的 Android 设备

android - 如何在开始时隐藏搜索栏