android复制短信到sim,Android开发之关于复制短信到SIM卡的分析.docx

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代表短消息中心地址的类型(81&h表示国内,91&h表示国际)。所以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 == nu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值