- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Android开发之关于复制短信到SIM卡的分析
Android开发之关于复制短信到SIM卡的分析
在framework层下的SmsManager类中,封装好了一个copyMessageToIcc方法,只要正确地调用它便可以将短信存储到SIM卡中。SmsManager smsManager = SmsManager.getDefault();//用来获取一个SmsManager对象现在我们来看一下copyMessageToIcc(byte[] smsc, byte[] pdu, int status)这个方法的三个参数:
1) byte[] smsc : 短信服务中心的地址,个人认为在复制到SIM卡过程中可以为空。
2) byte[] pdu : 中文翻译是协议数据单元,这个参数最为重要,一会我们会做详细地解释说明。
3) int status : 短信存储在Icc卡上的状态,有4种状态,1是已读,3是未读,5是已发送,7是未发送。
其实要想将将短信正确地存储到SIM卡上,pdu这个参数尤为重要,下面我们就来分析一下!
首先先看一下复制短信到SIM卡时log显示的正确pdu:
00 00 0d91683155724572f9 00 0b 11117091914323 0a4e0b73ed4e864e48ff1f
原本上面的pdu是完整连续,为了方便解释说明,特意加了空格区分开来。
00 SC Address 短信服务中心地址,通常我们发送短信时会发送一个pdu到短信服务中心,然后短信服务中心会对pdu进行一些处理再发
送到目的手机,这其中就包括增加了这个SC Address和后面会介绍的时间戳。
00 PDUType pdu的第一个八位位组,即一个八位的二进制数转变成十六进制而来,每一位代表什么意思呢?由高到低依次代表RP(应答
路径)、UDHI(用户数据头标识)、SRR(状态请求报告)、VPF(有效期格式,2位)、RD(拒绝副本)、MTI(信息指示类型,2位),在这里我们其实只
要全部将其设置为0就好,于是便显示为00。
0d91683155724572f9 这一段代表了目的手机的号码,0d代表后面的地址长度(二进制下为13),那么这十三个数是怎么算的呢?其实手机号为
而91代表短消息中心地址的类型(81h表示国内,91h表示国际)。所以0d表示的就是后面683155724572f9的长度(f9中的f是用来
凑偶数位的)。
00 PID 协议标识,通常设为00就好。
0b DCS 数据编码方案,含有中文字符的话一般默认都为0b,化而来,具体每一位的含义暂时不做详细解释。
11117091914323 时间戳,代表的时间为11年11月07日19时19分34秒,后面的23表示时区(什么这么表示尚在研究中,可以写死,感觉意义
不大)。
0a4e0b73ed4e864e48ff1f 短信的具体内容,其中0a表示信息的长度。
好了,关于pdu我们分析完了,现在要做的就是如何获取这个pdu并传进copyMessageToIcc方法中。观察源码会发现在
framework/base/telephony/java/com/android/internal/telephony/gsm下的SmsMessage类中有一个getSubmitPdu方法,返回一个SubmitPdu对
象,该对象有encodedScAddress和encodedMessage两个byte[]数组类型的属性,而且在多个地方被用到,和copyMessageToIcc中的参数十分相
似,会不会就是我们要找的呢?经调用后发现,得到的pdu并不正确,但是没有关系,我们可以将其涉及到的方法重写,拼出我们想要的pdu!
我改写的代码如下:
private SubmitPdu getSubmitPdu(String scAddress, String destinationAddress, String message,
boolean statusReportRequested, byte[] header, int encoding, long date) {
// Perform null parameter checks.
if (message == null || destinationAddress == null
文档评论(0)