我正在尝试在Android中发送二进制短信。但是当消息的大小超过一个短信时,我会根据设备得到不同的错误。
我看到有一种方法可以发送多部分文本短信,但不能发送多部分二进制短信。那么,我必须做什么?
答案 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
}
}
这是我方法的工作副本,但它有效。在接收器中,您必须读取消息的第一个字节,以获取它应该期望的消息部分。