欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

解决水货CDMA写号机无法接收和发送彩信的问题

最编程 2024-08-05 10:39:03
...

经过N天的努力和尝试,终于解决了i500 CDMA水货机美版MIUI的彩信接收问题。目前测试的结果,有很多朋友已经可以完美接收彩信。相关补丁已发布在diypda的i500版块,使用i500的朋友可前去围观。 有图有真相。。。。。 ...
经过N天的努力和尝试,终于解决了i500 CDMA水货机美版MIUI的彩信接收问题。目前测试的结果,有很多朋友已经可以完美接收彩信。相关补丁已发布在diypda的i500版块,使用i500的朋友可前去围观。


本机环境:三星i500 showcase写号机,美版MIUI 1.12.9 for i500 fascinate。

虽然我只是针对i500定制,但从理论上来说,这个解决方案对所有的水货机均应适用。


众所周知,现在大部分的好手机都是GSM/WCDMA制式的,CDMA/EVDO在国内基本上没有什么好看兼好用的机器。偶尔有些好一点的WCDMA机型,让电信的大爷们一“定制”,立刻变得歪瓜裂枣巨丑无比,让我深深怀疑自己的审美观价值观人生观是否正确并代表先进的生产力方向。

众里寻他千google,终于找到了一款外形和配置还算说得过去的机型。三星的i500。但很遗憾的是,这款机型国内并没有引进,某宝上买到的,都是美版的机子。写号倒不是很麻烦,可水货机始终不能接收彩信,却是一直困扰很多水货机用户的大问题。

虽然彩信是上个世纪的东西了,但日常生活中还是用得比较多的。比如我,虽然一般是不发彩信的,但经常会收到电信或其它商家发送的彩信,有些网上的信息比如优惠券,也是以彩信的形式发送的。作为一项手机功能,用不着的时候无所谓,但一旦用着了却不能用,就很让人郁闷了。

我一直坚持的生活原则就是,宁可千日不用,但不能一日没有。。。。。。

彩信的发送就不用说了,设置正确的apn,即可发送彩信,这个比较简单。下面主要说一下彩信的接收问题。

1、不能接收彩信的原因

在大量搜索网上资料的基础上,经过几天的测试和分析,找到了不能接收彩信的初步原因。

彩信,按照电信规范,是分两步发送的。
第一步,发送WAP-PUSH格式的短信通知,该短信通知含有一个url,该url指向彩信内容的存储地址。
第二步,手机解析出这个url,向url发送获取请求,下载彩信内容到本地,完成彩信的接收。

向手机发送彩信之后,手机上没有任何的反映,说明第一步的彩信通知都没有接收到。

我写了一个Receiver,拦截系统中广播的android.provider.Telephony.WAP_PUSH_RECEIVED消息,结果没有收到这个广播。证明彩信通知并没有上传到app应用层,那么有可能在framework框架层,彩信通知就被拒绝了。

在Receiver中添加android.provider.Telephony.SMS_REJECTED,收到了系统广播的消息。说明彩信通知确实是被framework层给reject了。

取出/system/framework/framework.jar,解压出classes.dex,对dex文件进行baksmali,再对照android系统源码进行流程分析(虽然只是简单的一句话,但确实够我忙活了一段时间。。。。。。),最终确定,问题在com.android.internal.telephony.cdma.CdmaSMSDispatcher.smali中。

对照android源码,找出问题的关键代码段:


1.if (SmsEnvelope.TELESERVICE_WAP == teleService) {

2.    return processCdmaWapPdu(sms.getUserData(), sms.messageRef,

3.            sms.getOriginatingAddress());

4.}
复制代码
查找smali中对应的TELESERVICE_WAP,发现其设定的值是0x1004,换算成10进制就是4100。

修改CdmaSMSDispatcher.smali,使之在返回sms rejected的原因时,填入彩信通知的TeleServiceId,发现电信的TeleServiceId确实是65002,中国电信CDMA终端规范也证实了这个判断。

那么原因找到了,由于TeleServiceId的不同,导致手机自带的美版ROM无法识别65002的电信Id,所以拒绝接收彩信通知。


2、彩信接收解决方案

找出原因来了,当时我就想,这应该就比较简单了吧。。。。。。

2.1 修改TeleServiceId

定位CdmaSMSDispatcher.smali中判断TeleServiceId的语句:


1.const v10, 0x1004
复制代码
把const/16 0x1004(4100)修改成const 0xfdea(65002),使之识别出这是一个WAP-PUSH,进而转入processCdmaWapPdu流程,处理彩信通知的pdu。

编译所有的smali文件,更新classes.dex,替换本机中的framework.jar,重启手机。

怀着激动的心情发送彩信,一直在等。。。。。。终于等来了。。。。。。“您的手机终端不支持接收彩信,请到mmbox.vnet.cn中提取”。。。。。。

2.2 修改pdu处理流程