android 信息(mms)的故事(六)-- 收信息

     发送过程是分短信和彩信写的,接收过程就写到一起了。至于原因还是从收彩信的流程说起,收彩信时要先收彩信通知,然后再根据通知里的地址再去获取彩信内容,而彩信通知是通过RIL传过来的,其实彩信通知就是一条短信,特别之处这个短信是带端口的。所以收短信和收彩信在最开始时候走的代码是一样的,还是开始看代码吧,
        从RIL.java开始,收到从模块报上来的消息,这里还不知道是短信还是彩信,newFromCMT()方法先处理下。

   case RIL_UNSOL_RESPONSE_NEW_SMS: {
                if (RILJ_LOGD) unsljLog(response);
                String a[] = new String[2];
                a[1] = (String)ret;
                SmsMessage sms;
                sms = SmsMessage.newFromCMT(a);//注意这里,其实如果是短信,在这解码已经结束了,看接下来给出来的两段代码。
                if (mGsmSmsRegistrant != null) {
                    mGsmSmsRegistrant.notifyRegistrant(new AsyncResult(null, sms, null));//要注意这里,不然会迷路。
                }
    public static SmsMessage newFromCMT(String[] lines) {
        try {
            SmsMessage msg = new SmsMessage();
            msg.parsePdu(IccUtils.hexStringToBytes(lines[1]));//先解码了一些信息,时间、短信中心、编码方式等,这里还是当短信处理的
            return msg;
        } catch (RuntimeException ex) {
            Log.e(LOG_TAG, "SMS PDU parsing failed: ", ex);
            return null;
        }
    }    
    private void parsePdu(byte[] pdu) {
        mPdu = pdu;
        PduParser p = new PduParser(pdu);
        scAddress = p.getSCAddress();

        if (scAddress != null) {
            if (false) Log.d(LOG_TAG, "SMS SC address: " + scAddress);
        }

        int firstByte = p.getByte();
        mti = firstByte & 0x3;
        switch (mti) {
        case 0:
        case 3:
            parseSmsDeliver(p, firstByte);//收到的短信
            break;
        case 2:
            parseSmsStatusReport(p, firstByte);//短信状态报告
            break;
        default:
            throw new RuntimeException("Unsupported message type");
        }
         接下来就是来到SmsDispather.java的handleMessage()方法的 case EVENT_NEW_SMS分支,至于为什么就要看明白 mGsmSmsRegistrant.notifyRegistrant(new AsyncResult(null, sms, null))这段代码的原理了。在handleMessage()方法有个handleMessage()方法,具体实现看子类GsmSMSDispatcher.java的handleMessage()方法,这里短信和彩信要根据端口号的不同分开了,带端口的是彩信通知
     (当然端口的不同,也有可能是vcard或是端口短信等其它的东西)走dispatchWapPdu(),剩下的就是短信了走dispatchPdus()。
     下面还是要分开了
     
       短信:
         SmsReceiverService.java的handleSmsReceived()方法,没什么太多的内容,到这里短信内容已经解析完毕了,需要判断下就是当前短信是否是Class_0类短信,如果是0类短信只显示不保存,否则保存短信内容至数据库。相关类的名称见附图
         
       彩信:
         通知在pushReceiver.java里接收,然后转入TransactionService.java,根据用户设置是自动接收还是手动接收分别转入RetrieveTransactionNo.java和NotificationTransaction.java,当然最后的内容下载是要通过http的,所以这里也必然伴随着网络连接和网络状态的切换,像之前的文章说得一样,我们可打开TransactionService.java里log开关,以获得我们需要的信息。
         
     最后,还是给出接收信息一个代码流程图,短信和彩信依然放在一起。

    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值