我需要知道如何使用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 编码。
答案 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_16BIT
,ENCODING_7BIT
,ENCODING_8BIT
,ENCODING_UNKNOWN
}}。然而,有趣的是它们不用于公共方法的回报值。
因此,最好的解决方案是:
getPdu()
解析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;
}