我正在尝试在 Android 中发送二进制短信。但是当消息的大小超过一条短信时,我会收到不同的错误,具体取决于设备。
我看到有一种方法可以发送多部分文本短信,但不能发送多部分二进制短信。那么,我该怎么办?
似乎真的没有办法做到这一点。
两年前,我发现有人在 Android 开发者名单上问过同样的问题,但直到现在都没有收到任何答案。不幸的是,我现在没有找到该帖子,但是对此还有很多其他问题:
Android 开发者 › 缺少发送二进制数据短信的 API 功能超过 1
我能遇到的最佳解决方案是将消息编码为 BASE64 并作为多部分 TEXT 短信发送。
我希望这个答案能帮助那些在未来寻找同样想法的人。
你可以通过数据短信来做到这一点,我做到了,而且有效!您必须将数据拆分为数据包限制并使用:
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
}
}
这是我的方法的工作副本,但它有效。在接收器中,您必须读取消息的第一个字节以获取它应该期望多少部分消息的信息。