为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

ril之上短信接收

2011-06-23 6页 doc 49KB 18阅读

用户头像

is_108451

暂无简介

举报
ril之上短信接收Ril.java之上的短信接收流程: \frameworks\base\telephony\java\com\android\internal\telephony\Ril.java private void processUnsolicited (Parcel p) { int response; Object ret; response = p.readInt(); … switch(response) { … case RIL_UNSOL_RESPONSE_NEW_SMS: {// 接收一条短信就是从这个case开始的,至...
ril之上短信接收
Ril.java之上的短信接收: \frameworks\base\telephony\java\com\android\internal\telephony\Ril.java private void processUnsolicited (Parcel p) { int response; Object ret; response = p.readInt(); … switch(response) { … case RIL_UNSOL_RESPONSE_NEW_SMS: {// 接收一条短信就是从这个case开始的,至于底层是怎么传上来的,那就需要自己研究Rild中如何将AT命令转成这个case if (RILJ_LOGD) unsljLog(response); // FIXME this should move up a layer String a[] = new String[2]; a[1] = (String)ret; SmsMessage sms; sms = SmsMessage.newFromCMT(a); // 交给上层解析短息内容 if (mSMSRegistrant != null) { mSMSRegistrant .notifyRegistrant(new AsyncResult(null, sms, null)); } break; … } … } \frameworks\base\telephony\java\com\android\internal\telephony\gsm\SmsMessage.java public static SmsMessage newFromCMT(String[] lines) { try { SmsMessage msg = new SmsMessage(); msg.parsePdu(IccUtils.hexStringToBytes(lines[1]));// 解析PDU内容 return msg; } catch (RuntimeException ex) { Log.e(LOG_TAG, "SMS PDU parsing failed: ", ex); return null; } } \frameworks\base\telephony\java\com\android\internal\telephony\gsm\SmsMessage.java private void parsePdu(byte[] pdu) { mPdu = pdu; // Log.d(LOG_TAG, "raw sms mesage:"); // Log.d(LOG_TAG, s); PduParser p = new PduParser(pdu); scAddress = p.getSCAddress(); if (scAddress != null) { if (Config.LOGD) Log.d(LOG_TAG, "SMS SC address: " + scAddress); } // TODO(mkf) support reply path, user data header indicator // TP-Message-Type-Indicator // 9.2.3 int firstByte = p.getByte(); mti = firstByte & 0x3; switch (mti) { // TP-Message-Type-Indicator // 9.2.3 case 0: parseSmsDeliver(p, firstByte); break; case 2: parseSmsStatusReport(p, firstByte); break; default: // TODO(mkf) the rest of these throw new RuntimeException("Unsupported message type"); } } \frameworks\base\telephony\java\com\android\internal\telephony\gsm\SmsMessage.java private void parseSmsDeliver(PduParser p, int firstByte) { replyPathPresent = (firstByte & 0x80) == 0x80;// // TP-Reply-Path originatingAddress = p.getAddress();//The address of the sender if (originatingAddress != null) { if (Config.LOGV) Log.v(LOG_TAG, "SMS originating address: " + originatingAddress.address); } // TP-Protocol-Identifier (TP-PID) // TS 23.040 9.2.3.9 protocolIdentifier = p.getByte(); // TP-Data-Coding-Scheme // see TS 23.038 dataCodingScheme = p.getByte(); if (Config.LOGV) { Log.v(LOG_TAG, "SMS TP-PID:" + protocolIdentifier + " data coding scheme: " + dataCodingScheme); } scTimeMillis = p.getSCTimestampMillis(); if (Config.LOGD) Log.d(LOG_TAG, "SMS SC timestamp: " + scTimeMillis); boolean hasUserDataHeader = (firstByte & 0x40) == 0x40; parseUserData(p, hasUserDataHeader); } \frameworks\base\telephony\java\com\android\internal\telephony\gsm\SmsMessage.java private void parseUserData(PduParser p, boolean hasUserDataHeader) { boolean hasMessageClass = false; boolean userDataCompressed = false; int encodingType = ENCODING_UNKNOWN; // Look up the data encoding scheme if ((dataCodingScheme & 0x80) == 0) { // Bits 7..4 == 0xxx automaticDeletion = (0 != (dataCodingScheme & 0x40)); userDataCompressed = (0 != (dataCodingScheme & 0x20)); hasMessageClass = (0 != (dataCodingScheme & 0x10)); if (userDataCompressed) { Log.w(LOG_TAG, "4 - Unsupported SMS data coding scheme " + "(compression) " + (dataCodingScheme & 0xff)); } else { switch ((dataCodingScheme >> 2) & 0x3) { case 0: // GSM 7 bit default alphabet encodingType = ENCODING_7BIT; break; case 2: // UCS 2 (16bit) encodingType = ENCODING_16BIT; break; case 1: // 8 bit data case 3: // reserved Log.w(LOG_TAG, "1 - Unsupported SMS data coding scheme " + (dataCodingScheme & 0xff)); encodingType = ENCODING_8BIT;//DM短信是以8BIT的形式发送过来的 break; } } } else if ((dataCodingScheme & 0xf0) == 0xf0) { automaticDeletion = false; hasMessageClass = true; userDataCompressed = false; if (0 == (dataCodingScheme & 0x04)) { // GSM 7 bit default alphabet encodingType = ENCODING_7BIT; } else { // 8 bit data encodingType = ENCODING_8BIT; } } else if ((dataCodingScheme & 0xF0) == 0xC0 || (dataCodingScheme & 0xF0) == 0xD0 || (dataCodingScheme & 0xF0) == 0xE0) { // 3GPP TS 23.038 V7.0.0 (2006-03) section 4 // 0xC0 == 7 bit, don't store // 0xD0 == 7 bit, store // 0xE0 == UCS-2, store if ((dataCodingScheme & 0xF0) == 0xE0) { encodingType = ENCODING_16BIT; } else { encodingType = ENCODING_7BIT; } userDataCompressed = false; boolean active = ((dataCodingScheme & 0x08) == 0x08); // bit 0x04 reserved if ((dataCodingScheme & 0x03) == 0x00) { isMwi = true; mwiSense = active; mwiDontStore = ((dataCodingScheme & 0xF0) == 0xC0); } else { isMwi = false; Log.w(LOG_TAG, "MWI for fax, email, or other " + (dataCodingScheme & 0xff)); } } else { Log.w(LOG_TAG, "3 - Unsupported SMS data coding scheme " + (dataCodingScheme & 0xff)); } // set both the user data and the user data header. int count = p.constructUserData(hasUserDataHeader, encodingType == ENCODING_7BIT);// 解析短信头,在解析时可以看到UDH数据,考虑是否可以通过端口号来确定DM短信。 this.userData = p.getUserData(); this.userDataHeader = p.getUserDataHeader(); switch (encodingType) { case ENCODING_UNKNOWN: case ENCODING_8BIT: messageBody = null; break; case ENCODING_7BIT: messageBody = p.getUserDataGSM7Bit(count); break; case ENCODING_16BIT: messageBody = p.getUserDataUCS2(count); break; } if (Config.LOGV) Log.v(LOG_TAG, "SMS message body (raw): '" + messageBody + "'"); if (messageBody != null) { parseMessageBody(); } if (!hasMessageClass) { messageClass = MessageClass.UNKNOWN; } else { switch (dataCodingScheme & 0x3) { case 0: messageClass = MessageClass.CLASS_0; break; case 1: messageClass = MessageClass.CLASS_1; break; case 2: messageClass = MessageClass.CLASS_2; break; case 3: messageClass = MessageClass.CLASS_3; break; } } }
/
本文档为【ril之上短信接收】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索