私は先週同様の質問をし、その問題に報奨金を設定しました.GSM PDU (3gpp)に対する答えが与えられ、エミュレーター (Android 2.2) で問題なく動作したことに気付きました. 回答を受け入れて報奨金を授与し、今後の参考のためにタイトルを変更しました。
質問:
ここで、Android の API で解析できるGSM PDU (3gpp)の作成と同様に、CDMA (3gpp2) PDU の作成方法を尋ねています。createFromPdu()
自分で書くのを避けようとしています:
新しいメソッドcreateFromPDU(byte[] pdu, String format)を読んだときは興奮しましたが、 後方互換性がないことに気付きました。
元の質問と回答com.android.internal.telephony.gsm.SmsMessage.createFromPdu(pdu);
から生成された GSM PDU を使用することにも興味がありました。しかし、それが安全かどうかはよくわかりません...
そのため、デバイスの種類に応じて、GSM または CDMA PDU を作成するのが最善の方法であると判断しました。
CDMA PDU を作成できるスニペットを持っている人はいますか?
または、GSM PDU を作成する方法を CDMA PDU 形式に変換する方法を知っていますか?
アップデート:
私は、CDMA (3gpp2) pdu を作成する方法を手動で作成することに取り組んできました.cdma pdu の驚くべき内訳に続いて、成功に近づく
ことができBearerData
ました.適切に pdu の最後に日付文字列を追加します。これは私がこれまでに持っているものです
private static byte[] createCDMAPDU(String sender, String body) {
byte[] pdu = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream(100);
DataOutputStream dos = new DataOutputStream(baos);
Date now = new Date ();
byte[] dateBytes = new byte[6];
Calendar calendar = new GregorianCalendar();
dateBytes[0] = (byte) (asBytes(""+calendar.get(Calendar.YEAR))[0]);
dateBytes[1] = (byte) (asBytes(""+calendar.get(Calendar.MONTH) + 1)[0]);
dateBytes[2] = (byte) (asBytes(""+calendar.get(Calendar.DAY_OF_MONTH))[0]);
dateBytes[3] = (byte) (asBytes(""+calendar.get(Calendar.HOUR_OF_DAY))[0]);
dateBytes[4] = (byte) (asBytes(""+calendar.get(Calendar.MINUTE))[0]);
dateBytes[5] = (byte) (asBytes(""+calendar.get(Calendar.SECOND))[0]);
try {
dos.write(0);// unknown padding
dos.write(0);// unknown padding
dos.write(0);// unknown padding
// MESSAGE_TYPE_POINT_TO_POINT = 0x00;
// MESSAGE_TYPE_BROADCAST = 0x01;
// MESSAGE_TYPE_ACKNOWLEDGE = 0x02;
dos.write(0x00);// message type - MESSAGE_TYPE_POINT_TO_POINT
// TELESERVICE_NOT_SET = 0x0000;
// TELESERVICE_WMT = 0x1002;
// TELESERVICE_VMN = 0x1003;
// TELESERVICE_WAP = 0x1004;
// TELESERVICE_WEMT = 0x1005;
dos.writeInt(0x1002); // teleservice - TELESERVICE_NOT_SET
// dos.writeInt(0); // servicePresent
dos.writeInt(0); // serviceCategory
// DIGIT_MODE_4BIT_DTMF = 0x00;
// DIGIT_MODE_8BIT_CHAR = 0x01;
dos.write(0x01);// digit mode - DIGIT_MODE_4BIT_DTMF
// NUMBER_MODE_NOT_DATA_NETWORK = 0x00;
// NUMBER_MODE_DATA_NETWORK = 0x01;
dos.write(0x00);// number mode - NUMBER_MODE_NOT_DATA_NETWORK
// TON_UNKNOWN = 0x00;
// TON_INTERNATIONAL_OR_IP = 0x01;
// TON_NATIONAL_OR_EMAIL = 0x02;
// TON_NETWORK = 0x03;
// TON_SUBSCRIBER = 0x04;
// TON_ALPHANUMERIC = 0x05;
// TON_ABBREVIATED = 0x06;
// TON_RESERVED = 0x07;
dos.write(0x00); // number_type - TON_UNKNOWN
// NUMBERING_PLAN_UNKNOWN = 0x0;
// NUMBERING_PLAN_ISDN_TELEPHONY = 0x1;
dos.write(0x0);// number plan - NUMBERING_PLAN_UNKNOWN
dos.write(sender.length());// number of digits
dos.write(sender.getBytes(), 0, sender.getBytes().length); // digits
dos.write(0);// bearer reply ?
dos.write(0);// bearer reply ?
// Subaddress is not supported.
dos.write(0); // subaddressType
dos.write(0); // subaddr_odd
dos.write(0); // subaddr_nbr_of_digits
// dos.write(encodedBearerData.length);
// dos.write(encodedBearerData, 0, encodedBearerData.length);
dos.write(0);
dos.write(0);
dos.write(0);
dos.write(0);
dos.write(0);
byte[] bodybytes = getAsciiBytes(body);
dos.write(bodybytes.length);
dos.write(0);
dos.write(0x03);
dos.write(0x10);
dos.write(0);
dos.write(bodybytes, 0, bodybytes.length);
dos.write(0);
dos.write(dateBytes.length);
dos.write(dateBytes);
dos.close();
pdu = baos.toByteArray();
} catch (IOException e) {
}
return pdu;
}
正しい軌道に乗っているかどうかはわかりません。