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

如何在Android中发送多部分二进制短信?,android,binary,sms,multipart,Android,Binary,Sms,Multipart,我正在尝试用Android发送一条二进制短信。但是,当消息的大小超过一条短信时,我会根据设备的不同收到不同的错误 我看到有一种方法可以发送多部分文本短信,但不能发送多部分二进制短信。那么,我必须做什么呢?看来真的没有办法做到这一点 我发现两年前有人在Android开发者列表上问过同样的问题,但直到现在都没有得到答案。不幸的是,我现在找不到这篇文章,但还有很多其他问题: 我遇到的最佳解决方案是将消息编码为BASE64,并以多部分文本短信的形式发送 我希望这个答案能帮助那些在未来寻找同样想法的

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


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

看来真的没有办法做到这一点

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

我遇到的最佳解决方案是将消息编码为BASE64,并以多部分文本短信的形式发送


我希望这个答案能帮助那些在未来寻找同样想法的人。

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

    smsManager.sendDataMessage(_phoneNumber, null, SMS_PORT,
s.getBytes(), sent, deliveredPI);
每一部分。
它单独发送数据,您可以正常接收:)

@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
    }

}
private void sendEncryptedMessage(字符串明文消息)引发IOException{
整数PDU_SIZE=130;
EncryptedMessage EncryptedMessage=新的EncryptedMessage(明文,recipientEncryptionKey);
字节[]messageSerialized=EncryptedMessage.serialize(EncryptedMessage);
PendingEvent sent=this.createPendingResult(MainConfig.SMS_sent,new Intent(),PendingEvent.FLAG_UPDATE_CURRENT);
SmsManager SmsManager=smsmsmanager.getDefault();
byte[]preparedMessage=新字节[messageSerialized.length+1];
preparedMessage[0]=1;
System.arraycopy(messageSerialized,0,preparedMessage,1,messageSerialized.length);
if(preparedMessage.length>PDU\U大小){
布尔等式;
整数mlLength=preparedMessage.length;
整数numOfChunks=mLength/PDU\U SIZE;
如果(最大长度%PDU_大小==0){
preparedMessage[0]=numOfChunks.byteValue();
equalChunks=真;
}否则{
整数tmpChunks=numfchunks+1;
preparedMessage[0]=tmpChunks.byteValue();
equalChunks=假;
}
for(int i=0;i

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

您是否能够发送长度小于一条消息的二进制消息。另外,如果你得到了这个问题的答案,如果你把它贴出来的话,将会很有帮助。或者以其他方式告诉我。