AndroidでバイナリSMSを送信しようとしています。しかし、メッセージのサイズが1 SMSを超えると、デバイスによって異なるエラーが発生します。
マルチパートテキストSMSを送信する方法はありますが、マルチパートバイナリSMSを送信する方法はありません。だから、私は何をしなければならないのですか?
これを行う方法は本当にないようです。
2年前にAndroidデベロッパーリストでこれと同じことを尋ねた人を見つけましたが、今まで答えがありませんでした。残念ながら、私は現在投稿を見つけていませんが、これについて他の多くの質問があります:
Android開発者›1を超えるバイナリデータSMSを送信するAPI機能がありません
私が遭遇した最善の解決策は、メッセージをBASE64としてエンコードし、マルチパートTEXTSMSとして送信することでした。
この答えが、将来同じ考えを探している人に役立つことを願っています。
あなたはデータSMSによってこれを行うことができます、私はそれをしました、そして働きます!データをパケット制限に分割し、以下を使用する必要があります。
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
}
}
これは私のメソッドの作業コピーですが、機能します。受信者では、メッセージの最初のバイトを読み取って、メッセージのどの部分が予期されるかについての情報を取得する必要があります。