Android 系统(164)---手机收到8bit编码的短信无法显示

手机收到8bit编码的短信无法显示

android默认不支持8bit编码,8bit只是数据传输的一种方式,8bit编码并没有定义唯一的字符编码表来指明某个编码表示某个字符,所以没办法唯一去解析它
代码可见framework/base/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
parseUserData方法
switch (encodingType) {
            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方法
case ENCODING_8BIT:
                messageBody = null;
  break;
修改为:
case ENCODING_8BIT:
                //messageBody = null;
                messageBody = p.getUserDataUTF8(count);
                break;

2.getUserDataUCS2这个方法后面增加一个方法 getUserDataUTF8,如下:
  String getUserDataUTF8(int byteCount) {
            String ret;
            try {
                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;
        }

这种修改是有风险的:可能解析出来的短信都是乱码。请客户自行评估风险,谨慎修改。
 
 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测试的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值