田海立
2012-02-22
在解析WAP PUSH over SMS时,看了一下Android里SMS接收的流程,并按照自己需要的流程记录,其他分支的详细处理并未讲述。PDU数据的encode/decode也并未在本文中进行解析,有兴趣的读者可以到相应的代码处自己解读一下。
Android中,RIL用RILReciever接收SMS pdu,并根据不同的信息类型用相应函数来处理。因手机制式的差异,用GsmSmsDispatcher或CdmaSmsDispatcher来做各自的消息处理并分发。最后的分发是通过发送相应的Broadcast,所以,对感兴趣的消息处理,可以注册Receiver来监听相应的Broadcast,实现自己的SMS/MMS/Wap push,以及其他类型消息的接收处理。
RIL构造函数中,Receiver的初始化[在文件RIL.java中]
其中的类型
- mReceiver: RILReceiver
- mReceiverThread: Thread
RILReceiver实现了Runnable
关注RILReceiver线程的实现[在RILReceiver::run()中]
RILReceiver线程不停的监听本地Socket,读到数据之后在processResponse()[Line#37]中处理。
如果类型属于Unsolicited消息,则在processUnsolicited()中处理。收到的短信是属于Unsolicited信息,看它的实现。
processUnsolicited()中很长的switch… case语句中对收到短信的处理在case RIL_UNSOL_RESPONSE_NEW_SMS:
这里的SmsMessage是android.telephony.SmsMessage。newFromCMT()中会根据电话类型(GSM/CDMA)选择具体的SmsMessage进行封装(因为Rational Rose中,同一工程中,不同包内的类也不允许同名,com.android.internal.telephony.gsm.SmsMessage用gsm.SmsMessage代替;com.android.internal.telephony.cdma.SmsMessage用cdma.SmsMessage代替。实际类型都是SmsMessage)。
mSMSRegistrant是RIL父类的成员。通过setOnNewSMS()/unSetOnNewSMS()设置和取消设置。SMSDispatcher的构造函数中注册了SMS的Registrant
mCm.setOnNewSMS(this, EVENT_NEW_SMS, null);
所以,调用mSMSRegistrant.notifyRegistrant(newAsyncResult(null, sms, null))之后,执行的是SMSDispatcher中Handler在handleMessage()中对EVENT_NEW_SMS的处理:
SMSDispatcher是一个abstract的类,dispatchMessage()的具体实现在GsmSMSDispatcher或CdmaSMSDispatcher中。
GsmSMSDispatcher::dispatchMessage()中,会对Class 0类型的短信,有目标端口的短信,和长短信做处理。
目标端口为WAPPUSH的信息,则调用mWapPush.dispatchWapPdu(sms.getUserData(),pdus)让WAPPUSH来处理;其它未知的端口,则用“sms://localhost:<port>”指定端口。
对长短信,调用processMessagePart()进行组合处理。
1)有目标端口且目标端口是WAP PUSH(SmsHeader.PORT_WAP_PUSH)的信息,用WapPushOverSms::dispatchWapPdu()来处理:
根据不同的contentType:
-> dispatchWapPdu_PushCO();
-> dispatchWapPdu_MMS();
-> dispatchWapPdu_default()
2)有目标地址且目标端口不是WAP PUSH的信息,在SMSDispatcher::dispatchPortAddressedPdus()中处理:
Uri uri =Uri.parse("sms://localhost:" + port);
Intent intent= new Intent(Intents.DATA_SMS_RECEIVED_ACTION, uri);
intent.putExtra("pdus", pdus);
dispatch(intent, "android.permission.RECEIVE_SMS");
3)通常的无目标地址的信息(普通短信),在SMSDispatcher::dispatchPdus()中处理:
Intent intent= new Intent(Intents.SMS_RECEIVED_ACTION);
intent.putExtra("pdus", pdus);
dispatch(intent, "android.permission.RECEIVE_SMS");
分享到:
相关推荐
Android SMS 发送 接收及格式
基于android手机系统的 短信 sms 发送接收
android短信监听器,可转发收到的短信。支持短信设置接收机号码。仅供技术交流。-android SMS spy,transfer SMS to a receiver。The receiver can be set by commmand SMS
每一部手机都具有短信接收和发送功能,下面我们通过代码来实现接收和发送短信功能。 一、接收短信 1、创建内部广播接收器类,接收系统发出的短信广播 2、从获得的内容中解析出短信发送者和短信内容 3、在...
基于android的SMS短信的接受与发送
该主题的目的是通过创建一个用于管理联系人,发送和接收SMS的应用程序,使学生熟悉Android系统。 主题 介绍 对于此项目,您将需要创建一个Android应用程序,该应用程序允许您创建联系人并通过SMS与之聊天。 这里的...
适用于Titanium的Android SMS接收器 BroadcastReceiver,用于在接收到SMS时在Titanium中运行JavaScript服务描述即使您的应用未运行,该模块也可以让您检测传入的SMS消息。 您可以在Titanium中创建一个JavaScript服务...
**Android项目:SMS短信泡泡窗口** **资源介绍** 本项目为一款独特的Android短信应用,其核心功能在于将接收到的短信内容以泡泡形状的窗口形式展示。这一设计不仅提升了视觉效果,还极大地增强了用户与短信内容的...
安卓短信网关 使用使用Android构建的简单SMS网关测试基于SMS的应用程序。 该模块是为测试我们基于SMS的搜索算法而编写的,作为去年的项目 ... 接收响应,进行处理并将其发送回接收到SMS的手机号码表格。
本项目旨在开发一款具有创新性和实用性的Android应用,该应用能够将接收到的SMS短信内容显示在独特的泡泡形状窗口中。通过这一设计,用户可以在不进入短信应用的情况下,直观地查看和浏览新接收到的短信内容,提高了...
Flutter 插件,仅用于读取传入和预期的 SMS 目前为Android开发:无需请求短信权限即可阅读消息。 用法 生成可接受的 不要在运行时使用AppSignatureHelper生成哈希消息。 在服务器或客户端上的应用程序内部将哈希...
android permission BROADCAST SMS"> <intent filter android:priority "2147483647"> <action android:name "android provider Telephony SMS RECEIVED" > < intent...
在android设备上接收和解析短信
小短信门Tiny SMS Gate 是一个适用于 Android 的小型(GPL 2 许可)SMS 网关。 它允许您通过手机通过常规的 HTTP 发送和接收 SMS 消息。 而已。 因此,我不得不请求您,请不要在受信任的 LAN 之外使用它。 虽然有一...
Android 短信接收和短信发送(可以屏蔽系统短信通知)
在每章的讲解中,它会让你通过一系列示例项目逐步掌握Android中的各种新功能和技术,助你取得最圆满的学习效果。本书所介绍的各个应用实例简明扼要且极具实用价值,它们覆盖了Android 1.0的所有基本功能和高级功能...
android-sms-manager 简单的Android应用程序可显示所有消息,您可以从中接收/发送消息。
手机短信sms接收发送 七大模块 sms android 短信管理
当系统收到短信时,会发出一个action名称为android.provider.Telephony.SMS_RECEIVED的广播Intent,该Intent存放了接收到的短信内容,使用名称“pdus”即可从Intent中获取短信内容。最好使用动态注册的方法,去注册...
android短信操作,实现发送,接收与拦截