2

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

显然我不能使用代码:

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)。

我需要检查短信是否采用GSM78-bitUTF-16编码。

4

3 回答 3

3

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

这将返回一个 int[4],其中 int[0] 是所需的 SMS 数量,int[1] 是使用的代码单元数,而 int[2] 是直到下一条消息剩余的代码单元数。int[ 3 ] 是应该用于消息的编码类型。

于 2012-10-19T13:16:42.657 回答
1

Android在SMSMessage类中已经有常量定义ENCODING_16BIT, ENCODING_7BIT, ENCODING_8BIT,对应于3GPP TS 03.38中的数据编码方案。然而,有趣的是它们没有用于公共方法的返回值。ENCODING_UNKNOWN

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

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

解析 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;
}
于 2013-05-29T18:31:45.120 回答
1

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

于 2012-10-19T11:19:01.280 回答