手机收到8bit编码的短信无法显示
android默认不支持8bit编码,8bit只是数据传输的一种方式,8bit编码并没有定义唯一的字符编码表来指明某个编码表示某个字符,所以没办法唯一去解析它
代码可见framework/base/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
parseUserData方法
parseUserData方法
switch (encodingType) {
case ENCODING_UNKNOWN:
case ENCODING_8BIT:
messageBody = null;
break;
case ENCODING_UNKNOWN:
case ENCODING_8BIT:
messageBody = null;
break;
这也是google default设计,MTK也没有做扩展,因为上面所说的,8bit没有唯一表来定义其编码。
如果发现某个对比机可以显示,那是对比机指定了某种解码方式去解析8bit,但这有风险,只要那些8bit数据不是用指定的那种解码方式去编码的话,会显示乱码。
如果客户一定要用解析8bit编码的短信,可以自行修改代码
以下以UTF-8来解析为例,修改方法:
framework/base/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
1.parseUserData方法
framework/base/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
1.parseUserData方法
case ENCODING_8BIT:
messageBody = null;
break;
messageBody = null;
break;
修改为:
case ENCODING_8BIT:
//messageBody = null;
messageBody = p.getUserDataUTF8(count);
break;
case ENCODING_8BIT:
//messageBody = null;
messageBody = p.getUserDataUTF8(count);
break;
2.getUserDataUCS2这个方法后面增加一个方法 getUserDataUTF8,如下:
String getUserDataUTF8(int byteCount) {
String ret;
String ret;
try {
ret = new String(pdu, cur, byteCount, "utf-8");
} catch (UnsupportedEncodingException ex) {
ret = "";
Log.e(LOG_TAG, "Utf-8,implausible UnsupportedEncodingException", ex);
}
ret = new String(pdu, cur, byteCount, "utf-8");
} catch (UnsupportedEncodingException ex) {
ret = "";
Log.e(LOG_TAG, "Utf-8,implausible UnsupportedEncodingException", ex);
}
cur += byteCount;
return ret;
}
return ret;
}
这种修改是有风险的:可能解析出来的短信都是乱码。请客户自行评估风险,谨慎修改。
Android 5及之后的版本,Google提供了一个变量来控制是否支持8bit编码。
默认是false,改成true之后就能支持解码8bit
/frameworks/base/core/res/res/values/config.xml
<bool translatable="false" name="config_sms_decode_gsm_8bit_data">false</bool>
注意:开启8bit之后会导致CTS fail. 目前没有能兼顾8bit和CTS测试的解决方案。