@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
}
}
这是我的方法的工作副本,但它有效。在接收器中,您必须读取消息的第一个字节以获取信息应该包含多少消息部分。