传入短信的编码

时间:2012-10-19 11:15:06

标签: android encoding sms

我需要知道如何使用SmSMessage类中的broadcastreceiver类在我的设备上获取传入短信的编码。

显然我不能使用代码:

Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];

for (int i = 0; i < msgs.length; i++) {
    msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
    msg_str += msgs[i].getMessageBody();
}
StringBufferInputStream buf = new StringBufferInputStream(msgs[0].getMessageBody());
InputStreamReader reader = new InputStreamReader(buf);
String encode = reader.getEncoding();

因为这将返回java的默认编码,即(UTF-8)。

我需要检查短信是否在 GSM7 8位 UTF-16 编码。

3 个答案:

答案 0 :(得分:3)

我们可以使用calculateLength类的SMSMessage函数。

返回int [4],其中int [0]是所需的SMS数,int [1]是所使用的代码单元数,int [2]是在下一条消息之前剩余的代码单元数。 int [3]是应该用于消息的编码类型。

答案 1 :(得分:1)

我的猜测是SMS:s通常以GSM 03.38编码。这可能是Android文档提到的“无线电专用编码”。

答案 2 :(得分:1)

Android已在SMSMessage类中具有与{{3}中的数据编码方案对应的常量定义ENCODING_16BITENCODING_7BITENCODING_8BITENCODING_UNKNOWN }}。然而,有趣的是它们不用于公共方法的回报值。

因此,最好的解决方案是:

  1. 使用getPdu()
  2. 获取整个SMS TPDU字节
  3. 根据3GPP TS 03.38(第9节)解析字节以获得DCS字节(用于SMS传送:1字节TP-MTI / MMS / RP / UDHI / SRI,2-12字节TP-OA,1字节TP-PID,然后是DCS字节)
  4. 根据3GPP TS 03.38的第5节解析DCS字节。
  5. 解析DCS字节的示例代码如下:

    public static byte getSmsDcsType(byte dcs)
    {
        // Notes:
        // ------
        // the (SMS) DCS value according to 3GPP TS 03.38 / TS 23.038 is coded as follow:
        // 0xxx00xx = GSM 7-bit default alphabet (packed format)
        // 0xxx01xx = 8-bit data (unpacked-format)
        // 0xxx10xx = UCS2 uncompressed format
        // 0xxx11xx = reserved
        // 10xxxxxx = reserved
        // 110xxxxx = GSM 7-bit default alphabet (packed format)
        // 1110xxxx = UCS2 uncompressed format
        // 111100xx = GSM 7-bit default alphabet (packed format)
        // 111101xx = 8-bit data (unpacked-format)
        // 11111xxx = reserved
    
        if (((byte) (dcs & (byte) 0x8C) == 0x00)
                || ((byte) (dcs & (byte) 0xE0) == (byte) 0xC0)
                || ((byte) (dcs & (byte) 0xFC) == (byte) 0xF0))
        {
            return SmsMessage.ENCODING_7BIT;
        }
        else if (((byte) (dcs & (byte) 0x8C) == 0x04) || ((byte) (dcs & (byte) 0xFC) == (byte) 0xF4))
        {
            return SmsMessage.ENCODING_8BIT;
        }
        else if (((byte) (dcs & (byte) 0x8C) == 0x08) || ((byte) (dcs & (byte) 0xF0) == (byte) 0xE0))
        {
            return SmsMessage.ENCODING_16BIT;
        }
    
        return SmsMessage.ENCODING_UNKNOWN;
    }