如何在Android中发送多部分二进制短信?

时间:2012-06-15 20:29:56

标签: android binary sms multipart

我正在尝试在Android中发送二进制短信。但是当消息的大小超过一个短信时,我会根据设备得到不同的错误。

我看到有一种方法可以发送多部分文本短信,但不能发送多部分二进制短信。那么,我必须做什么?

3 个答案:

答案 0 :(得分:1)

似乎真的没办法做到这一点。

我发现有人在两年前在Android开发者列表上提出同样的问题,直到现在才收到答案。不幸的是,我现在没有找到这篇文章,但还有很多其他问题:

Android Developers › Sending big binary sms

Android Developers › Missing API functionallity sending binary data sms with more that 1

Android Developers › more SMS questions

我遇到的最佳解决方案是将消息编码为BASE64并作为多部分TEXT短信发送。

我希望这个答案可以帮助将来有同样想法的人。

答案 1 :(得分:1)

你可以通过数据短信这样做,我做到了并且有效! 您必须将数据拆分为数据包限制并使用:

    smsManager.sendDataMessage(_phoneNumber, null, SMS_PORT,
s.getBytes(), sent, deliveredPI);

每个部分。 它单独发送数据,你可以正常收到:)

答案 2 :(得分:0)

@ amin10043你说得对,但是为了处理分裂的数据信息,你必须做更多的事情,因为接收者不知道有多少部分信息。我准备了一个发送多部分数据消息的函数,并在消息的第一个字节上放置了许多部分:

private void sendEncryptedMessage(String plainMessage) throws IOException {

    Integer PDU_SIZE = 130;

    EncryptedMessage encryptedMessage = new EncryptedMessage(plainMessage, recipientEncryptionKey);
    byte[] messageSerialized = EncryptedMessage.serialize(encryptedMessage);

    PendingIntent sent = this.createPendingResult(MainConfig.SMS_SENT, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT);
    SmsManager smsManager = SmsManager.getDefault();

    byte[] preparedMessage = new byte[messageSerialized.length + 1];
    preparedMessage[0] = 1;
    System.arraycopy(messageSerialized, 0, preparedMessage, 1, messageSerialized.length);


    if (preparedMessage.length > PDU_SIZE) {

        Boolean equalChunks;
        Integer mLength = preparedMessage.length;
        Integer numOfChunks = mLength / PDU_SIZE;

        if (mLength % PDU_SIZE == 0) {
            preparedMessage[0] = numOfChunks.byteValue();
            equalChunks = true;
        } else {
            Integer tmpChunks = numOfChunks + 1;
            preparedMessage[0] = tmpChunks.byteValue();
            equalChunks = false;
        }


        for (int i = 0; i < numOfChunks; i++) {
            byte[] chunkArray = Arrays.copyOfRange(messageSerialized, i * PDU_SIZE, (i + 1) * PDU_SIZE);
            smsManager.sendDataMessage(phoneNo, null, MainConfig.SMS_PORT, chunkArray, sent, null); //todo: dodać jeszcze PendingDeliveryIntent
        }

        if (!equalChunks) {
            byte[] chunkArray = Arrays.copyOfRange(messageSerialized, numOfChunks * PDU_SIZE, mLength);
            smsManager.sendDataMessage(phoneNo, null, MainConfig.SMS_PORT, chunkArray, sent, null); //todo: dodać jeszcze PendingDeliveryIntent
        }


    } else {
        smsManager.sendDataMessage(phoneNo, null, MainConfig.SMS_PORT, preparedMessage, sent, null); //todo: dodać jeszcze PendingDeliveryIntent
    }

}

这是我方法的工作副本,但它有效。在接收器中,您必须读取消息的第一个字节,以获取它应该期望的消息部分。