java - 如何将两个 SmsMessage 合并为一个 SmsMessage?

标签 java android smsmanager

我使用以下代码创建广播(来自 this article ):

public class IncomingSms extends BroadcastReceiver {

    // Get the object of SmsManager
    final SmsManager sms = SmsManager.getDefault();

    public void onReceive(Context context, Intent intent) {

        // Retrieves a map of extended data from the intent.
        final Bundle bundle = intent.getExtras();

        try {

            if (bundle != null) {

                final Object[] pdusObj = (Object[]) bundle.get("pdus");

                for (int i = 0; i < pdusObj.length; i++) {

                    SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                    String phoneNumber = currentMessage.getDisplayOriginatingAddress();

                    String senderNum = phoneNumber;
                    String message = currentMessage.getMessageBody();
                        
                    Log.i("SmsReceiver", "senderNum: " + senderNum + "; message: " + message+"; Date="+currentMessage.getTimestampMillis());
//sending to API
                   } // end for loop
            } // bundle is null

        } catch (Exception e) {
            Log.e("SmsReceiver", "Exception smsReceiver" +e);

        }
    }

但是当我收到一条长短信(两条短信合二为一)时,例如。短信发送:“bodyOfTheFirstSMS,bodyOfTheSecondSMS”,然后被截成两条日志:

1) senderNum: +333333333333; message: "bodyOfTheFirstSMS,"; Date=1439968674000
2) senderNum: +333333333333; message: "bodyOfTheSecondSMS"; Date=1439968677000

不同的只是这条消息的日期。

如何检查它是单个短信的一部分? SmsMessage 中是否有任何字段表明这是一条消息?

最佳答案

您需要手动连接多部分消息。 在您的代码中,您需要进行一些修改以分别处理多部分消息,如下所示。

public class IncomingSms extends BroadcastReceiver {
    // Get the object of SmsManager
    final SmsManager sms = SmsManager.getDefault();
    public void onReceive(Context context, Intent intent) {
        // Retrieves a map of extended data from the intent.
        final Bundle bundle = intent.getExtras();
        SmsMessage messages = null;
        try {
            if (bundle != null) {
                final Object[] pdusObj = (Object[]) bundle.get("pdus");
                messages = new SmsMessage[pdus.length];
                for (int i = 0; i < pdusObj.length; i++) {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i]);

                   } // end for loop
            } // bundle is null
        } catch (Exception e) {
            Log.e("SmsReceiver", "Exception smsReceiver" +e);
        }
        SmsMessage sms = messages[0];
        String message;
        try {
            if (messages.length == 1 || sms.isReplace()) {

                String phoneNumber = sms.getDisplayOriginatingAddress();
                    String senderNum = phoneNumber;
                     message = sms.getMessageBody();
                    Log.info("SmsReceiver", "senderNum: " + senderNum + "; message: " + message+"; Date="+sms.getTimestampMillis());
//sending to API
            } else {
            StringBuilder bodyText = new StringBuilder();
            for (int j = 0; j < messages.length; j++) {
                bodyText.append(messages[j].getMessageBody());
            }
            message = bodyText.toString();
        }
        } catch (Exception e) {

        }

    }
}

关于java - 如何将两个 SmsMessage 合并为一个 SmsMessage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32089392/

相关文章:

android - 从列表中选择联系人时,从地址簿中填充联系人号码有效,但从搜索结果中选择时失败

android - 使用 "copy code"按钮发送包含验证码的短信

android - 在 Android 中以 pdu 模式发送短信

java - 依赖于抽象。不依赖于具体类

java - Spring Boot/JPA/mySQL - 多对一关系创建了太多 SQL 查询

java - 当声明一个List并将其分配给LinkedList或ArrayList时,是否仍然保留了不同的性能优势?

TabActivity 中的 Android startActivityForResult

java - 如何从一个常见的 jar 进行日志记录

android - PayPal 如何支持未在支持中列出的货币?

android - 对系统对话框 SmsManager 使用react